@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.
Files changed (223) hide show
  1. package/README.md +515 -0
  2. package/bin/brandsystem-mcp.mjs +2 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +20 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/brand-dir.d.ts +56 -0
  8. package/dist/lib/brand-dir.d.ts.map +1 -0
  9. package/dist/lib/brand-dir.js +270 -0
  10. package/dist/lib/brand-dir.js.map +1 -0
  11. package/dist/lib/color-namer.d.ts +28 -0
  12. package/dist/lib/color-namer.d.ts.map +1 -0
  13. package/dist/lib/color-namer.js +155 -0
  14. package/dist/lib/color-namer.js.map +1 -0
  15. package/dist/lib/confidence.d.ts +19 -0
  16. package/dist/lib/confidence.d.ts.map +1 -0
  17. package/dist/lib/confidence.js +66 -0
  18. package/dist/lib/confidence.js.map +1 -0
  19. package/dist/lib/content-scorer.d.ts +38 -0
  20. package/dist/lib/content-scorer.d.ts.map +1 -0
  21. package/dist/lib/content-scorer.js +571 -0
  22. package/dist/lib/content-scorer.js.map +1 -0
  23. package/dist/lib/css-parser.d.ts +45 -0
  24. package/dist/lib/css-parser.d.ts.map +1 -0
  25. package/dist/lib/css-parser.js +330 -0
  26. package/dist/lib/css-parser.js.map +1 -0
  27. package/dist/lib/dtcg-compiler.d.ts +7 -0
  28. package/dist/lib/dtcg-compiler.d.ts.map +1 -0
  29. package/dist/lib/dtcg-compiler.js +89 -0
  30. package/dist/lib/dtcg-compiler.js.map +1 -0
  31. package/dist/lib/interaction-policy-compiler.d.ts +40 -0
  32. package/dist/lib/interaction-policy-compiler.d.ts.map +1 -0
  33. package/dist/lib/interaction-policy-compiler.js +60 -0
  34. package/dist/lib/interaction-policy-compiler.js.map +1 -0
  35. package/dist/lib/logo-extractor.d.ts +49 -0
  36. package/dist/lib/logo-extractor.d.ts.map +1 -0
  37. package/dist/lib/logo-extractor.js +384 -0
  38. package/dist/lib/logo-extractor.js.map +1 -0
  39. package/dist/lib/report-html.d.ts +20 -0
  40. package/dist/lib/report-html.d.ts.map +1 -0
  41. package/dist/lib/report-html.js +938 -0
  42. package/dist/lib/report-html.js.map +1 -0
  43. package/dist/lib/response.d.ts +20 -0
  44. package/dist/lib/response.d.ts.map +1 -0
  45. package/dist/lib/response.js +54 -0
  46. package/dist/lib/response.js.map +1 -0
  47. package/dist/lib/runtime-compiler.d.ts +60 -0
  48. package/dist/lib/runtime-compiler.d.ts.map +1 -0
  49. package/dist/lib/runtime-compiler.js +96 -0
  50. package/dist/lib/runtime-compiler.js.map +1 -0
  51. package/dist/lib/svg-resolver.d.ts +21 -0
  52. package/dist/lib/svg-resolver.d.ts.map +1 -0
  53. package/dist/lib/svg-resolver.js +115 -0
  54. package/dist/lib/svg-resolver.js.map +1 -0
  55. package/dist/lib/url-validator.d.ts +11 -0
  56. package/dist/lib/url-validator.d.ts.map +1 -0
  57. package/dist/lib/url-validator.js +93 -0
  58. package/dist/lib/url-validator.js.map +1 -0
  59. package/dist/lib/version.d.ts +2 -0
  60. package/dist/lib/version.d.ts.map +1 -0
  61. package/dist/lib/version.js +19 -0
  62. package/dist/lib/version.js.map +1 -0
  63. package/dist/lib/vim-generator.d.ts +13 -0
  64. package/dist/lib/vim-generator.d.ts.map +1 -0
  65. package/dist/lib/vim-generator.js +718 -0
  66. package/dist/lib/vim-generator.js.map +1 -0
  67. package/dist/resources/brand-resources.d.ts +4 -0
  68. package/dist/resources/brand-resources.d.ts.map +1 -0
  69. package/dist/resources/brand-resources.js +34 -0
  70. package/dist/resources/brand-resources.js.map +1 -0
  71. package/dist/schemas/brand-config.d.ts +28 -0
  72. package/dist/schemas/brand-config.d.ts.map +1 -0
  73. package/dist/schemas/brand-config.js +11 -0
  74. package/dist/schemas/brand-config.js.map +1 -0
  75. package/dist/schemas/brand-runtime.d.ts +251 -0
  76. package/dist/schemas/brand-runtime.d.ts.map +1 -0
  77. package/dist/schemas/brand-runtime.js +54 -0
  78. package/dist/schemas/brand-runtime.js.map +1 -0
  79. package/dist/schemas/core-identity.d.ts +302 -0
  80. package/dist/schemas/core-identity.d.ts.map +1 -0
  81. package/dist/schemas/core-identity.js +51 -0
  82. package/dist/schemas/core-identity.js.map +1 -0
  83. package/dist/schemas/index.d.ts +11 -0
  84. package/dist/schemas/index.d.ts.map +1 -0
  85. package/dist/schemas/index.js +11 -0
  86. package/dist/schemas/index.js.map +1 -0
  87. package/dist/schemas/interaction-policy.d.ts +150 -0
  88. package/dist/schemas/interaction-policy.d.ts.map +1 -0
  89. package/dist/schemas/interaction-policy.js +34 -0
  90. package/dist/schemas/interaction-policy.js.map +1 -0
  91. package/dist/schemas/messaging.d.ts +776 -0
  92. package/dist/schemas/messaging.d.ts.map +1 -0
  93. package/dist/schemas/messaging.js +68 -0
  94. package/dist/schemas/messaging.js.map +1 -0
  95. package/dist/schemas/needs-clarification.d.ts +62 -0
  96. package/dist/schemas/needs-clarification.d.ts.map +1 -0
  97. package/dist/schemas/needs-clarification.js +13 -0
  98. package/dist/schemas/needs-clarification.js.map +1 -0
  99. package/dist/schemas/strategy.d.ts +537 -0
  100. package/dist/schemas/strategy.d.ts.map +1 -0
  101. package/dist/schemas/strategy.js +71 -0
  102. package/dist/schemas/strategy.js.map +1 -0
  103. package/dist/schemas/tokens.d.ts +35 -0
  104. package/dist/schemas/tokens.d.ts.map +1 -0
  105. package/dist/schemas/tokens.js +15 -0
  106. package/dist/schemas/tokens.js.map +1 -0
  107. package/dist/schemas/visual-identity.d.ts +224 -0
  108. package/dist/schemas/visual-identity.d.ts.map +1 -0
  109. package/dist/schemas/visual-identity.js +42 -0
  110. package/dist/schemas/visual-identity.js.map +1 -0
  111. package/dist/server.d.ts +3 -0
  112. package/dist/server.d.ts.map +1 -0
  113. package/dist/server.js +75 -0
  114. package/dist/server.js.map +1 -0
  115. package/dist/tools/brand-audit-content.d.ts +3 -0
  116. package/dist/tools/brand-audit-content.d.ts.map +1 -0
  117. package/dist/tools/brand-audit-content.js +116 -0
  118. package/dist/tools/brand-audit-content.js.map +1 -0
  119. package/dist/tools/brand-audit-drift.d.ts +3 -0
  120. package/dist/tools/brand-audit-drift.d.ts.map +1 -0
  121. package/dist/tools/brand-audit-drift.js +301 -0
  122. package/dist/tools/brand-audit-drift.js.map +1 -0
  123. package/dist/tools/brand-audit.d.ts +3 -0
  124. package/dist/tools/brand-audit.d.ts.map +1 -0
  125. package/dist/tools/brand-audit.js +129 -0
  126. package/dist/tools/brand-audit.js.map +1 -0
  127. package/dist/tools/brand-build-journey.d.ts +3 -0
  128. package/dist/tools/brand-build-journey.d.ts.map +1 -0
  129. package/dist/tools/brand-build-journey.js +312 -0
  130. package/dist/tools/brand-build-journey.js.map +1 -0
  131. package/dist/tools/brand-build-matrix.d.ts +3 -0
  132. package/dist/tools/brand-build-matrix.d.ts.map +1 -0
  133. package/dist/tools/brand-build-matrix.js +525 -0
  134. package/dist/tools/brand-build-matrix.js.map +1 -0
  135. package/dist/tools/brand-build-personas.d.ts +3 -0
  136. package/dist/tools/brand-build-personas.d.ts.map +1 -0
  137. package/dist/tools/brand-build-personas.js +436 -0
  138. package/dist/tools/brand-build-personas.js.map +1 -0
  139. package/dist/tools/brand-build-themes.d.ts +3 -0
  140. package/dist/tools/brand-build-themes.d.ts.map +1 -0
  141. package/dist/tools/brand-build-themes.js +476 -0
  142. package/dist/tools/brand-build-themes.js.map +1 -0
  143. package/dist/tools/brand-check-compliance.d.ts +3 -0
  144. package/dist/tools/brand-check-compliance.d.ts.map +1 -0
  145. package/dist/tools/brand-check-compliance.js +243 -0
  146. package/dist/tools/brand-check-compliance.js.map +1 -0
  147. package/dist/tools/brand-clarify.d.ts +21 -0
  148. package/dist/tools/brand-clarify.d.ts.map +1 -0
  149. package/dist/tools/brand-clarify.js +497 -0
  150. package/dist/tools/brand-clarify.js.map +1 -0
  151. package/dist/tools/brand-compile-messaging.d.ts +3 -0
  152. package/dist/tools/brand-compile-messaging.d.ts.map +1 -0
  153. package/dist/tools/brand-compile-messaging.js +759 -0
  154. package/dist/tools/brand-compile-messaging.js.map +1 -0
  155. package/dist/tools/brand-compile.d.ts +3 -0
  156. package/dist/tools/brand-compile.d.ts.map +1 -0
  157. package/dist/tools/brand-compile.js +182 -0
  158. package/dist/tools/brand-compile.js.map +1 -0
  159. package/dist/tools/brand-deepen-identity.d.ts +3 -0
  160. package/dist/tools/brand-deepen-identity.d.ts.map +1 -0
  161. package/dist/tools/brand-deepen-identity.js +483 -0
  162. package/dist/tools/brand-deepen-identity.js.map +1 -0
  163. package/dist/tools/brand-export.d.ts +17 -0
  164. package/dist/tools/brand-export.d.ts.map +1 -0
  165. package/dist/tools/brand-export.js +730 -0
  166. package/dist/tools/brand-export.js.map +1 -0
  167. package/dist/tools/brand-extract-figma.d.ts +3 -0
  168. package/dist/tools/brand-extract-figma.d.ts.map +1 -0
  169. package/dist/tools/brand-extract-figma.js +174 -0
  170. package/dist/tools/brand-extract-figma.js.map +1 -0
  171. package/dist/tools/brand-extract-messaging.d.ts +3 -0
  172. package/dist/tools/brand-extract-messaging.d.ts.map +1 -0
  173. package/dist/tools/brand-extract-messaging.js +620 -0
  174. package/dist/tools/brand-extract-messaging.js.map +1 -0
  175. package/dist/tools/brand-extract-web.d.ts +3 -0
  176. package/dist/tools/brand-extract-web.d.ts.map +1 -0
  177. package/dist/tools/brand-extract-web.js +477 -0
  178. package/dist/tools/brand-extract-web.js.map +1 -0
  179. package/dist/tools/brand-feedback.d.ts +3 -0
  180. package/dist/tools/brand-feedback.d.ts.map +1 -0
  181. package/dist/tools/brand-feedback.js +366 -0
  182. package/dist/tools/brand-feedback.js.map +1 -0
  183. package/dist/tools/brand-ingest-assets.d.ts +3 -0
  184. package/dist/tools/brand-ingest-assets.d.ts.map +1 -0
  185. package/dist/tools/brand-ingest-assets.js +233 -0
  186. package/dist/tools/brand-ingest-assets.js.map +1 -0
  187. package/dist/tools/brand-init.d.ts +3 -0
  188. package/dist/tools/brand-init.d.ts.map +1 -0
  189. package/dist/tools/brand-init.js +66 -0
  190. package/dist/tools/brand-init.js.map +1 -0
  191. package/dist/tools/brand-preflight.d.ts +3 -0
  192. package/dist/tools/brand-preflight.d.ts.map +1 -0
  193. package/dist/tools/brand-preflight.js +608 -0
  194. package/dist/tools/brand-preflight.js.map +1 -0
  195. package/dist/tools/brand-report.d.ts +3 -0
  196. package/dist/tools/brand-report.d.ts.map +1 -0
  197. package/dist/tools/brand-report.js +154 -0
  198. package/dist/tools/brand-report.js.map +1 -0
  199. package/dist/tools/brand-runtime.d.ts +3 -0
  200. package/dist/tools/brand-runtime.d.ts.map +1 -0
  201. package/dist/tools/brand-runtime.js +37 -0
  202. package/dist/tools/brand-runtime.js.map +1 -0
  203. package/dist/tools/brand-set-logo.d.ts +3 -0
  204. package/dist/tools/brand-set-logo.d.ts.map +1 -0
  205. package/dist/tools/brand-set-logo.js +170 -0
  206. package/dist/tools/brand-set-logo.js.map +1 -0
  207. package/dist/tools/brand-start.d.ts +3 -0
  208. package/dist/tools/brand-start.d.ts.map +1 -0
  209. package/dist/tools/brand-start.js +686 -0
  210. package/dist/tools/brand-start.js.map +1 -0
  211. package/dist/tools/brand-status.d.ts +3 -0
  212. package/dist/tools/brand-status.d.ts.map +1 -0
  213. package/dist/tools/brand-status.js +175 -0
  214. package/dist/tools/brand-status.js.map +1 -0
  215. package/dist/tools/brand-write.d.ts +3 -0
  216. package/dist/tools/brand-write.d.ts.map +1 -0
  217. package/dist/tools/brand-write.js +442 -0
  218. package/dist/tools/brand-write.js.map +1 -0
  219. package/dist/types/index.d.ts +331 -0
  220. package/dist/types/index.d.ts.map +1 -0
  221. package/dist/types/index.js +52 -0
  222. package/dist/types/index.js.map +1 -0
  223. package/package.json +60 -0
@@ -0,0 +1,301 @@
1
+ import { z } from "zod";
2
+ import { readFile } from "node:fs/promises";
3
+ import { BrandDir } from "../lib/brand-dir.js";
4
+ import { buildResponse, safeParseParams } from "../lib/response.js";
5
+ import { loadBrandContext, scoreContent, isHtmlContent, } from "../lib/content-scorer.js";
6
+ import { ERROR_CODES } from "../types/index.js";
7
+ // ---------------------------------------------------------------------------
8
+ // Content resolution
9
+ // ---------------------------------------------------------------------------
10
+ async function resolveContent(input) {
11
+ if (/\.(html?|md|txt)$/i.test(input.trim()) && !input.includes("\n") && input.length < 500) {
12
+ try {
13
+ const content = await readFile(input.trim(), "utf-8");
14
+ return { content, isHtml: /\.html?$/i.test(input.trim()) || isHtmlContent(content) };
15
+ }
16
+ catch { /* not a file */ }
17
+ }
18
+ return { content: input, isHtml: isHtmlContent(input) };
19
+ }
20
+ // ---------------------------------------------------------------------------
21
+ // Statistical helpers
22
+ // ---------------------------------------------------------------------------
23
+ function mean(arr) {
24
+ return arr.length > 0 ? arr.reduce((a, b) => a + b, 0) / arr.length : 0;
25
+ }
26
+ function median(arr) {
27
+ if (arr.length === 0)
28
+ return 0;
29
+ const sorted = [...arr].sort((a, b) => a - b);
30
+ const mid = Math.floor(sorted.length / 2);
31
+ return sorted.length % 2 !== 0 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
32
+ }
33
+ function stddev(arr) {
34
+ if (arr.length < 2)
35
+ return 0;
36
+ const avg = mean(arr);
37
+ const variance = arr.reduce((sum, v) => sum + (v - avg) ** 2, 0) / arr.length;
38
+ return Math.sqrt(variance);
39
+ }
40
+ function detectDriftPatterns(results) {
41
+ const patterns = [];
42
+ const total = results.length;
43
+ if (total < 2)
44
+ return patterns;
45
+ // Collect all issues across items, grouped by dimension+message
46
+ const issueMap = new Map();
47
+ for (const r of results) {
48
+ for (const issue of r.score.issues) {
49
+ const key = `${issue.dimension}:${issue.message}`;
50
+ const entry = issueMap.get(key) || { count: 0, dimension: issue.dimension, message: issue.message, labels: [] };
51
+ entry.count++;
52
+ entry.labels.push(r.label);
53
+ issueMap.set(key, entry);
54
+ }
55
+ }
56
+ // Issues appearing in >50% of items are systematic
57
+ for (const [, entry] of issueMap) {
58
+ if (entry.count >= Math.ceil(total * 0.5) && entry.count >= 2) {
59
+ patterns.push({
60
+ dimension: entry.dimension,
61
+ pattern: entry.message,
62
+ affected_items: entry.count,
63
+ total_items: total,
64
+ detail: `Affects: ${entry.labels.slice(0, 3).join(", ")}${entry.labels.length > 3 ? ` (+${entry.labels.length - 3} more)` : ""}`,
65
+ });
66
+ }
67
+ }
68
+ // Check for dimensions that are consistently low across items
69
+ const dimNames = ["token_compliance", "visual_compliance", "voice_alignment", "message_coverage"];
70
+ for (const dim of dimNames) {
71
+ const scores = results
72
+ .map((r) => r.score.dimensions[dim]?.score)
73
+ .filter((s) => s !== undefined);
74
+ if (scores.length >= 2) {
75
+ const avg = mean(scores);
76
+ if (avg < 60) {
77
+ patterns.push({
78
+ dimension: dim,
79
+ pattern: `Consistently low ${dim.replace(/_/g, " ")}`,
80
+ affected_items: scores.filter((s) => s < 60).length,
81
+ total_items: scores.length,
82
+ detail: `Average: ${Math.round(avg)}/100`,
83
+ });
84
+ }
85
+ }
86
+ }
87
+ return patterns;
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // Drift report markdown
91
+ // ---------------------------------------------------------------------------
92
+ function buildDriftReport(itemResults, corpusStats, driftPatterns, threshold) {
93
+ const lines = [
94
+ "# Brand Drift Report",
95
+ "",
96
+ `**Generated:** ${new Date().toISOString().split("T")[0]}`,
97
+ `**Items audited:** ${itemResults.length}`,
98
+ `**Threshold:** ${threshold}`,
99
+ "",
100
+ "## Summary",
101
+ "",
102
+ `| Metric | Value |`,
103
+ `|--------|-------|`,
104
+ `| Mean score | ${corpusStats.mean_score}/100 |`,
105
+ `| Median score | ${corpusStats.median_score}/100 |`,
106
+ `| Items below threshold | ${corpusStats.items_below_threshold}/${itemResults.length} |`,
107
+ "",
108
+ ];
109
+ if (driftPatterns.length > 0) {
110
+ lines.push("## Systematic Drift Patterns", "");
111
+ for (const p of driftPatterns) {
112
+ lines.push(`- **${p.dimension}**: ${p.pattern} (${p.affected_items}/${p.total_items} items)`);
113
+ lines.push(` - ${p.detail}`);
114
+ }
115
+ lines.push("");
116
+ }
117
+ lines.push("## Per-Item Scores", "");
118
+ lines.push("| Item | Score | Status |");
119
+ lines.push("|------|-------|--------|");
120
+ for (const item of itemResults) {
121
+ const status = item.below_threshold ? "BELOW" : "OK";
122
+ lines.push(`| ${item.label} | ${item.overall_score}/100 | ${status} |`);
123
+ }
124
+ lines.push("");
125
+ // Detail section for below-threshold items
126
+ const belowItems = itemResults.filter((i) => i.below_threshold);
127
+ if (belowItems.length > 0) {
128
+ lines.push("## Items Below Threshold", "");
129
+ for (const item of belowItems) {
130
+ lines.push(`### ${item.label} (${item.overall_score}/100)`, "");
131
+ if (item.top_issues.length > 0) {
132
+ for (const issue of item.top_issues) {
133
+ lines.push(`- ${issue}`);
134
+ }
135
+ lines.push("");
136
+ }
137
+ }
138
+ }
139
+ return lines.join("\n");
140
+ }
141
+ // ---------------------------------------------------------------------------
142
+ // Handler
143
+ // ---------------------------------------------------------------------------
144
+ async function handler(input) {
145
+ const brandDir = new BrandDir(process.cwd());
146
+ if (!(await brandDir.exists())) {
147
+ return buildResponse({
148
+ what_happened: "No .brand/ directory found",
149
+ next_steps: ["Run brand_start to create a brand system first"],
150
+ data: { error: ERROR_CODES.NOT_INITIALIZED },
151
+ });
152
+ }
153
+ let ctx;
154
+ try {
155
+ ctx = await loadBrandContext(brandDir);
156
+ }
157
+ catch {
158
+ return buildResponse({
159
+ what_happened: "Could not read brand identity data",
160
+ next_steps: ["Run brand_extract_web to populate core identity"],
161
+ data: { error: ERROR_CODES.NO_CORE_IDENTITY },
162
+ });
163
+ }
164
+ // Parse items
165
+ let items;
166
+ try {
167
+ const parsed = JSON.parse(input.items);
168
+ if (!Array.isArray(parsed))
169
+ throw new Error("Expected array");
170
+ items = parsed.map((item, i) => ({
171
+ label: item.label || `Item ${i + 1}`,
172
+ content: item.content || (typeof item === "string" ? item : ""),
173
+ }));
174
+ }
175
+ catch {
176
+ return buildResponse({
177
+ what_happened: "Could not parse items — expected a JSON array",
178
+ next_steps: [
179
+ 'Provide items as a JSON array: [{"content": "...", "label": "Homepage"}, ...]',
180
+ ],
181
+ data: { error: ERROR_CODES.INVALID_ITEMS },
182
+ });
183
+ }
184
+ if (items.length === 0) {
185
+ return buildResponse({
186
+ what_happened: "No items to audit",
187
+ next_steps: ["Provide at least one content item"],
188
+ data: { error: ERROR_CODES.EMPTY_ITEMS },
189
+ });
190
+ }
191
+ // Cap at 20 items
192
+ if (items.length > 20) {
193
+ items = items.slice(0, 20);
194
+ }
195
+ // Score each item
196
+ const scored = [];
197
+ for (const item of items) {
198
+ const { content, isHtml } = await resolveContent(item.content);
199
+ if (!content.trim())
200
+ continue;
201
+ const result = scoreContent(content, isHtml, ctx);
202
+ scored.push({ label: item.label, score: result });
203
+ }
204
+ if (scored.length === 0) {
205
+ return buildResponse({
206
+ what_happened: "All items were empty — nothing to audit",
207
+ next_steps: ["Provide content items with actual text or HTML"],
208
+ data: { error: ERROR_CODES.ALL_EMPTY },
209
+ });
210
+ }
211
+ // Compute stats
212
+ const overallScores = scored.map((s) => s.score.overall);
213
+ const belowThreshold = overallScores.filter((s) => s < input.threshold).length;
214
+ const corpusStats = {
215
+ mean_score: Math.round(mean(overallScores)),
216
+ median_score: Math.round(median(overallScores)),
217
+ min_score: Math.min(...overallScores),
218
+ max_score: Math.max(...overallScores),
219
+ stddev: Math.round(stddev(overallScores) * 10) / 10,
220
+ items_below_threshold: belowThreshold,
221
+ };
222
+ // Per-dimension averages
223
+ const dimNames = ["token_compliance", "visual_compliance", "voice_alignment", "message_coverage"];
224
+ const perDimensionAverages = {};
225
+ for (const dim of dimNames) {
226
+ const scores = scored
227
+ .map((s) => s.score.dimensions[dim]?.score)
228
+ .filter((s) => s !== undefined);
229
+ if (scores.length > 0) {
230
+ perDimensionAverages[dim] = Math.round(mean(scores));
231
+ }
232
+ }
233
+ // Detect systematic drift
234
+ const driftPatterns = detectDriftPatterns(scored);
235
+ // Build per-item results (compact for response)
236
+ const itemResults = scored.map((s) => ({
237
+ label: s.label,
238
+ overall_score: s.score.overall,
239
+ below_threshold: s.score.overall < input.threshold,
240
+ dimensions: Object.fromEntries(Object.entries(s.score.dimensions)
241
+ .filter(([, v]) => v !== undefined)
242
+ .map(([k, v]) => [k, v.score])),
243
+ top_issues: s.score.issues
244
+ .filter((i) => i.severity !== "info")
245
+ .slice(0, 3)
246
+ .map((i) => i.message),
247
+ }));
248
+ // Write drift report
249
+ const report = buildDriftReport(itemResults, corpusStats, driftPatterns, input.threshold);
250
+ await brandDir.writeMarkdown("drift-report.md", report);
251
+ // Build summary
252
+ const driftSummary = driftPatterns.length > 0
253
+ ? ` Systematic drift in ${driftPatterns.map((p) => p.dimension.replace(/_/g, " ")).join(", ")}.`
254
+ : "";
255
+ return buildResponse({
256
+ what_happened: `Drift audit: ${belowThreshold}/${scored.length} items below threshold (${input.threshold}). Mean: ${corpusStats.mean_score}/100.${driftSummary}`,
257
+ next_steps: belowThreshold > 0
258
+ ? [
259
+ `${belowThreshold} item(s) scored below ${input.threshold} — review .brand/drift-report.md`,
260
+ ...(driftPatterns.length > 0
261
+ ? [`Systematic drift detected — fix the root cause, not individual items`]
262
+ : []),
263
+ "Run brand_write before creating new content to refresh brand context",
264
+ ]
265
+ : ["All items above threshold — brand identity is being applied consistently"],
266
+ data: {
267
+ items_audited: scored.length,
268
+ threshold: input.threshold,
269
+ items_below_threshold: belowThreshold,
270
+ corpus_stats: corpusStats,
271
+ per_dimension_averages: perDimensionAverages,
272
+ systematic_drift: driftPatterns.slice(0, 5),
273
+ items: itemResults,
274
+ report_file: ".brand/drift-report.md",
275
+ },
276
+ });
277
+ }
278
+ // ---------------------------------------------------------------------------
279
+ // Registration
280
+ // ---------------------------------------------------------------------------
281
+ const paramsShape = {
282
+ items: z
283
+ .string()
284
+ .describe('JSON array of content items to audit. Each item: {"content": "text or HTML or file path", "label": "descriptive name"}. Max 20 items. Example: \'[{"content": "public/page.html", "label": "Homepage"}, {"content": "<p>Draft copy</p>", "label": "Email draft"}]\''),
285
+ threshold: z
286
+ .number()
287
+ .min(0)
288
+ .max(100)
289
+ .default(70)
290
+ .describe("Minimum acceptable score (0-100). Items below this are flagged as drifted. Default: 70."),
291
+ };
292
+ const ParamsSchema = z.object(paramsShape);
293
+ export function register(server) {
294
+ server.tool("brand_audit_drift", "Batch audit multiple content items to detect systematic brand drift. Scores each item against brand identity, computes corpus-level statistics (mean, median, stddev), and identifies recurring patterns across items (e.g., same off-palette color in 4/5 items). Writes a detailed drift report to .brand/drift-report.md. Use when reviewing a content corpus, auditing a website, or checking whether brand identity is being applied consistently across multiple pieces.", paramsShape, async (args) => {
295
+ const parsed = safeParseParams(ParamsSchema, args);
296
+ if (!parsed.success)
297
+ return parsed.response;
298
+ return handler(parsed.data);
299
+ });
300
+ }
301
+ //# sourceMappingURL=brand-audit-drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-audit-drift.js","sourceRoot":"","sources":["../../src/tools/brand-audit-drift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=brand-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-audit.d.ts","sourceRoot":"","sources":["../../src/tools/brand-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmJzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAMzC"}
@@ -0,0 +1,129 @@
1
+ import { BrandDir } from "../lib/brand-dir.js";
2
+ import { buildResponse } from "../lib/response.js";
3
+ import { BrandConfigSchema, CoreIdentitySchema } from "../schemas/index.js";
4
+ import { access } from "node:fs/promises";
5
+ import { join } from "node:path";
6
+ import { ERROR_CODES } from "../types/index.js";
7
+ async function handler() {
8
+ const brandDir = new BrandDir(process.cwd());
9
+ if (!(await brandDir.exists())) {
10
+ return buildResponse({
11
+ what_happened: "No .brand/ directory found",
12
+ next_steps: [
13
+ "Run brand_init first to create the .brand/ directory",
14
+ "If this keeps happening, run brand_feedback to report the issue.",
15
+ ],
16
+ data: { error: ERROR_CODES.NOT_INITIALIZED },
17
+ });
18
+ }
19
+ const results = [];
20
+ for (const file of ["brand.config.yaml", "core-identity.yaml"]) {
21
+ try {
22
+ await access(join(brandDir.brandPath, file));
23
+ results.push({ check: `File: ${file}`, status: "pass", detail: "exists" });
24
+ }
25
+ catch {
26
+ results.push({ check: `File: ${file}`, status: "fail", detail: "missing" });
27
+ }
28
+ }
29
+ try {
30
+ await access(join(brandDir.brandPath, "tokens.json"));
31
+ results.push({ check: "File: tokens.json", status: "pass", detail: "exists" });
32
+ }
33
+ catch {
34
+ results.push({ check: "File: tokens.json", status: "warn", detail: "missing — run brand_compile" });
35
+ }
36
+ try {
37
+ BrandConfigSchema.parse(await brandDir.readConfig());
38
+ results.push({ check: "Schema: brand.config.yaml", status: "pass", detail: "valid" });
39
+ }
40
+ catch (err) {
41
+ results.push({ check: "Schema: brand.config.yaml", status: "fail", detail: `invalid: ${err instanceof Error ? err.message : String(err)}` });
42
+ }
43
+ let identity;
44
+ try {
45
+ identity = CoreIdentitySchema.parse(await brandDir.readCoreIdentity());
46
+ results.push({ check: "Schema: core-identity.yaml", status: "pass", detail: "valid" });
47
+ }
48
+ catch (err) {
49
+ results.push({ check: "Schema: core-identity.yaml", status: "fail", detail: `invalid: ${err instanceof Error ? err.message : String(err)}` });
50
+ return formatResults(results);
51
+ }
52
+ const hasPrimary = identity.colors.some((c) => c.role === "primary");
53
+ results.push({
54
+ check: "Primary color",
55
+ status: hasPrimary ? "pass" : "warn",
56
+ detail: hasPrimary ? identity.colors.find((c) => c.role === "primary").value : "no color assigned 'primary' role",
57
+ });
58
+ results.push({
59
+ check: "Typography",
60
+ status: identity.typography.length > 0 ? "pass" : "warn",
61
+ detail: identity.typography.length > 0
62
+ ? `${identity.typography.length} font(s): ${identity.typography.map((t) => t.family).join(", ")}`
63
+ : "no fonts detected",
64
+ });
65
+ const invalidColors = identity.colors.filter((c) => !/^#[0-9a-fA-F]{3,8}$/.test(c.value));
66
+ results.push({
67
+ check: "Color hex values",
68
+ status: invalidColors.length === 0 ? "pass" : "fail",
69
+ detail: invalidColors.length === 0
70
+ ? `all ${identity.colors.length} colors are valid hex`
71
+ : `${invalidColors.length} invalid: ${invalidColors.map((c) => c.value).join(", ")}`,
72
+ });
73
+ results.push({
74
+ check: "Logo",
75
+ status: identity.logo.length > 0 ? "pass" : "warn",
76
+ detail: identity.logo.length > 0
77
+ ? `${identity.logo.length} logo(s) — ${identity.logo.map((l) => `${l.type} (${l.source})`).join(", ")}`
78
+ : "no logo found",
79
+ });
80
+ for (const logo of identity.logo) {
81
+ for (const variant of logo.variants) {
82
+ if (variant.inline_svg) {
83
+ const valid = variant.inline_svg.includes("<svg") && variant.inline_svg.includes("</svg>");
84
+ results.push({
85
+ check: `Logo SVG: ${variant.name}`,
86
+ status: valid ? "pass" : "fail",
87
+ detail: valid ? "well-formed" : "malformed SVG",
88
+ });
89
+ }
90
+ }
91
+ }
92
+ const allConf = [
93
+ ...identity.colors.map((c) => c.confidence),
94
+ ...identity.typography.map((t) => t.confidence),
95
+ ...identity.logo.map((l) => l.confidence),
96
+ ];
97
+ const lowCount = allConf.filter((c) => c === "low").length;
98
+ results.push({
99
+ check: "Confidence distribution",
100
+ status: lowCount === 0 ? "pass" : "warn",
101
+ detail: `confirmed: ${allConf.filter((c) => c === "confirmed").length}, high: ${allConf.filter((c) => c === "high").length}, medium: ${allConf.filter((c) => c === "medium").length}, low: ${lowCount}`,
102
+ });
103
+ return formatResults(results);
104
+ }
105
+ function formatResults(results) {
106
+ const passes = results.filter((r) => r.status === "pass").length;
107
+ const warns = results.filter((r) => r.status === "warn").length;
108
+ const fails = results.filter((r) => r.status === "fail").length;
109
+ const overall = fails > 0 ? "FAIL" : warns > 0 ? "WARN" : "PASS";
110
+ const lines = results.map((r) => `${r.status === "pass" ? "✓" : r.status === "warn" ? "⚠" : "✗"} ${r.check}: ${r.detail}`);
111
+ const nextSteps = [];
112
+ if (fails > 0)
113
+ nextSteps.push("Fix failing checks before proceeding");
114
+ if (warns > 0)
115
+ nextSteps.push("Review warnings — run brand_compile to address clarification items");
116
+ if (fails === 0 && warns === 0) {
117
+ nextSteps.push("Brand system passes all checks");
118
+ nextSteps.push("Run brand_deepen_identity to start Session 2 — capture composition rules, visual patterns, and anti-patterns that make your brand recognizable beyond tokens");
119
+ }
120
+ return buildResponse({
121
+ what_happened: `Audit complete: ${overall} (${passes} pass, ${warns} warn, ${fails} fail)`,
122
+ next_steps: nextSteps,
123
+ data: { overall, summary: { pass: passes, warn: warns, fail: fails }, report: lines.join("\n") },
124
+ });
125
+ }
126
+ export function register(server) {
127
+ server.tool("brand_audit", "Validate the .brand/ directory for completeness and correctness. Checks file existence, YAML schema validity, primary color assignment, typography coverage, logo embedding (SVG well-formedness), and confidence distribution. Use after brand_compile to verify readiness, or anytime to diagnose issues. Returns pass/warn/fail for each check with actionable details. NOT for checking content copy — use brand_audit_content. NOT for checking HTML/CSS — use brand_preflight.", async () => handler());
128
+ }
129
+ //# sourceMappingURL=brand-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-audit.js","sourceRoot":"","sources":["../../src/tools/brand-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=brand-build-journey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-build-journey.d.ts","sourceRoot":"","sources":["../../src/tools/brand-build-journey.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+UzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAWzC"}