@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,483 @@
1
+ import { z } from "zod";
2
+ import { BrandDir } from "../lib/brand-dir.js";
3
+ import { buildResponse, safeParseParams } from "../lib/response.js";
4
+ import { SCHEMA_VERSION } from "../schemas/index.js";
5
+ import { ERROR_CODES } from "../types/index.js";
6
+ const SECTIONS = [
7
+ "composition",
8
+ "patterns",
9
+ "illustration",
10
+ "photography",
11
+ "signature",
12
+ "anti_patterns",
13
+ ];
14
+ const paramsShape = {
15
+ mode: z
16
+ .enum(["interview", "record"])
17
+ .default("interview")
18
+ .describe("'interview' returns questions for missing sections; 'record' writes answers to visual-identity.yaml"),
19
+ section: z
20
+ .enum(SECTIONS)
21
+ .optional()
22
+ .describe("Which section to record (required when mode='record')"),
23
+ answers: z
24
+ .string()
25
+ .optional()
26
+ .describe("JSON string with structured answers for the section (required when mode='record')"),
27
+ };
28
+ const ParamsSchema = z.object(paramsShape);
29
+ const QUESTION_BANK = {
30
+ composition: [
31
+ {
32
+ key: "energy",
33
+ question: "How does your brand use space? Dense and energetic, or open and minimal?",
34
+ follow_up: "Can you describe the feeling you want a viewer to get from a typical layout?",
35
+ },
36
+ {
37
+ key: "layout_preference",
38
+ question: "Do your layouts favor symmetry and order, or intentional tension and asymmetry?",
39
+ },
40
+ {
41
+ key: "negative_space",
42
+ question: "What's the minimum breathing room in a composition before it feels cluttered?",
43
+ follow_up: "Think about a percentage — is 20% white space enough, or do you need 40%+?",
44
+ },
45
+ {
46
+ key: "grid",
47
+ question: "Do you use a specific grid system? If so, what's the base unit?",
48
+ },
49
+ ],
50
+ patterns: [
51
+ {
52
+ key: "type",
53
+ question: "Does your brand use geometric patterns, organic textures, photographic collage, or none?",
54
+ },
55
+ {
56
+ key: "usage",
57
+ question: "Are patterns structural (grids, dividers, background fills) or decorative (overlays, accents)?",
58
+ },
59
+ ],
60
+ illustration: [
61
+ {
62
+ key: "style",
63
+ question: "What illustration style represents your brand? Flat, dimensional, hand-drawn, abstract, collage?",
64
+ follow_up: "If you could point to one illustrator or brand whose style resonates, who would it be?",
65
+ },
66
+ {
67
+ key: "function",
68
+ question: "Do illustrations carry meaning (diagrams, data viz) or atmosphere (decorative, mood-setting)?",
69
+ },
70
+ ],
71
+ photography: [
72
+ {
73
+ key: "style",
74
+ question: "Does your brand use photography? If so: studio/controlled, lifestyle/candid, documentary/editorial, abstract/artistic?",
75
+ },
76
+ {
77
+ key: "anti_patterns",
78
+ question: "Any photography anti-patterns — styles that would feel off-brand?",
79
+ follow_up: "Think about stock photo clichés, overly staged shots, or specific color treatments to avoid.",
80
+ },
81
+ ],
82
+ signature: [
83
+ {
84
+ key: "description",
85
+ question: "What makes your brand recognizable beyond color and type?",
86
+ follow_up: "If someone covered the logo, what would still tell you it's your brand?",
87
+ },
88
+ {
89
+ key: "elements",
90
+ question: "Show me 2-3 pieces of work that feel the most 'you.' What's working in them?",
91
+ follow_up: "What specific elements — layout moves, textures, marks — make those pieces feel right?",
92
+ },
93
+ ],
94
+ anti_patterns: [
95
+ {
96
+ key: "visual_dont",
97
+ question: "What does bad look like for this brand? What visual choices would make you cringe?",
98
+ follow_up: "Think about specific offenders: gradients, shadows, rounded corners, stock imagery, specific color combos.",
99
+ },
100
+ {
101
+ key: "rules",
102
+ question: "Any specific things to never do? Each of these becomes a hard compliance rule.",
103
+ follow_up: "Be as specific as possible — 'no drop shadows' is enforceable; 'nothing ugly' is not.",
104
+ },
105
+ ],
106
+ };
107
+ // --- Helpers ---
108
+ /**
109
+ * Fuzzy deduplication for anti-pattern rules.
110
+ * Two rules are duplicates if:
111
+ * 1. They match exactly after normalization (strip parenthetical notes, collapse whitespace)
112
+ * 2. One fully contains the other
113
+ * 3. They share the same "no [noun phrase]" core
114
+ * 4. After stripping negation prefixes and filler words, 60%+ of significant words overlap
115
+ */
116
+ function isSemanticDuplicate(existing, candidate) {
117
+ const normalize = (s) => s
118
+ .toLowerCase()
119
+ .replace(/\(.*?\)/g, "") // strip parenthetical notes
120
+ .replace(/\s+/g, " ")
121
+ .trim();
122
+ const a = normalize(existing);
123
+ const b = normalize(candidate);
124
+ // Exact match after normalization
125
+ if (a === b)
126
+ return true;
127
+ // One contains the other
128
+ if (a.includes(b) || b.includes(a))
129
+ return true;
130
+ // Extract core noun phrase: "no [X]" pattern
131
+ const extractCore = (s) => {
132
+ const match = s.match(/no\s+(\w+(?:\s+\w+)?)/i);
133
+ return match?.[1]?.toLowerCase() || "";
134
+ };
135
+ const coreA = extractCore(a);
136
+ const coreB = extractCore(b);
137
+ if (coreA && coreB && coreA === coreB)
138
+ return true;
139
+ // Fuzzy keyword overlap: strip negation, filler, stem, then compare
140
+ const stopWords = new Set([
141
+ "no", "never", "dont", "do", "not", "avoid", "use", "any", "all",
142
+ "on", "the", "a", "an", "in", "as", "with", "for", "every", "always",
143
+ "of", "or", "is", "are", "be", "been", "being", "should", "must",
144
+ "will", "can", "may",
145
+ ]);
146
+ const stem = (w) => w.replace(/(ing|ed|ly|tion|ness|ment|able|ible)$/, "").replace(/s$/, "");
147
+ const extractKeywords = (s) => {
148
+ return s
149
+ .split(/\s+/)
150
+ .map((w) => w.replace(/[^a-z]/g, ""))
151
+ .filter((w) => w.length > 2 && !stopWords.has(w))
152
+ .map(stem);
153
+ };
154
+ const kwA = extractKeywords(a);
155
+ const kwB = extractKeywords(b);
156
+ if (kwA.length === 0 || kwB.length === 0)
157
+ return false;
158
+ const setA = new Set(kwA);
159
+ const setB = new Set(kwB);
160
+ const intersection = [...setA].filter((w) => setB.has(w));
161
+ const minSize = Math.min(setA.size, setB.size);
162
+ // If 60%+ of the smaller set's keywords appear in the larger, it's a duplicate
163
+ if (minSize > 0 && intersection.length / minSize >= 0.6)
164
+ return true;
165
+ return false;
166
+ }
167
+ function getMissingSections(visual) {
168
+ if (!visual)
169
+ return [...SECTIONS];
170
+ const missing = [];
171
+ if (!visual.composition)
172
+ missing.push("composition");
173
+ if (!visual.patterns)
174
+ missing.push("patterns");
175
+ if (!visual.illustration)
176
+ missing.push("illustration");
177
+ if (!visual.photography)
178
+ missing.push("photography");
179
+ if (!visual.signature)
180
+ missing.push("signature");
181
+ if (!visual.anti_patterns || visual.anti_patterns.length === 0)
182
+ missing.push("anti_patterns");
183
+ return missing;
184
+ }
185
+ function getEmptyVisualIdentity() {
186
+ return {
187
+ schema_version: SCHEMA_VERSION,
188
+ session: 2,
189
+ composition: null,
190
+ patterns: null,
191
+ illustration: null,
192
+ photography: null,
193
+ signature: null,
194
+ anti_patterns: [],
195
+ positioning_context: "",
196
+ };
197
+ }
198
+ // --- Interview mode ---
199
+ async function handleInterview(brandDir) {
200
+ const hasVisual = await brandDir.hasVisualIdentity();
201
+ let visual = null;
202
+ if (hasVisual) {
203
+ visual = await brandDir.readVisualIdentity();
204
+ }
205
+ // Read core identity for context
206
+ let clientName = "this brand";
207
+ try {
208
+ const config = await brandDir.readConfig();
209
+ clientName = config.client_name;
210
+ }
211
+ catch {
212
+ // no config available
213
+ }
214
+ const missing = getMissingSections(visual);
215
+ if (missing.length === 0) {
216
+ return buildResponse({
217
+ what_happened: `Visual identity for "${clientName}" is fully populated — all 6 sections have data.`,
218
+ next_steps: [
219
+ "Run brand_compile to generate a full VIM from core-identity + visual-identity",
220
+ "Run brand_deepen_identity with mode='record' to update any section if needed",
221
+ ],
222
+ data: {
223
+ complete: true,
224
+ sections_populated: SECTIONS.map((s) => s),
225
+ },
226
+ });
227
+ }
228
+ // Build interview agenda: questions for missing sections only
229
+ const agenda = missing.map((s) => ({
230
+ section: s,
231
+ questions: QUESTION_BANK[s],
232
+ }));
233
+ const populatedSections = SECTIONS.filter((s) => !missing.includes(s));
234
+ return buildResponse({
235
+ what_happened: hasVisual
236
+ ? `Visual identity exists but ${missing.length} section(s) still need data: ${missing.join(", ")}`
237
+ : `No visual-identity.yaml yet. All 6 sections need data.`,
238
+ next_steps: [
239
+ "Present the interview questions below — start with the first missing section",
240
+ "After gathering answers for a section, call brand_deepen_identity with mode='record', section=<name>, answers=<JSON>",
241
+ "Repeat for each section until all are populated, then suggest brand_compile",
242
+ ],
243
+ data: {
244
+ client_name: clientName,
245
+ missing_sections: missing,
246
+ populated_sections: populatedSections,
247
+ interview: agenda,
248
+ conversation_guide: {
249
+ instruction: [
250
+ `You are deepening the visual identity for "${clientName}" beyond core tokens (colors, type, logo).`,
251
+ "",
252
+ "HOW TO RUN THIS INTERVIEW:",
253
+ "1. Work through ONE section at a time. Start with the first missing section.",
254
+ "2. Ask the questions conversationally — do NOT dump all questions at once.",
255
+ "3. Listen for the answer, ask the follow-up if provided, then move to the next question in that section.",
256
+ "4. When you have enough answers for a section, call brand_deepen_identity with mode='record' to save them.",
257
+ "5. Then move to the next missing section.",
258
+ "",
259
+ "TONE: Collaborative creative director — curious, specific, non-judgmental.",
260
+ "GOAL: Get concrete, enforceable answers, not vague preferences.",
261
+ "",
262
+ "SECTION ORDER (suggested — adapt to the conversation):",
263
+ ...missing.map((s, i) => ` ${i + 1}. ${s}`),
264
+ "",
265
+ "ANTI-PATTERNS SECTION IS CRITICAL:",
266
+ "Each anti-pattern the user names becomes a hard compliance rule in preflight.",
267
+ "Push for specificity: 'no drop shadows' > 'nothing cheesy'.",
268
+ "",
269
+ "AFTER ALL SECTIONS ARE RECORDED:",
270
+ "Suggest running brand_compile to generate the full Visual Identity Manifest.",
271
+ ].join("\n"),
272
+ },
273
+ },
274
+ });
275
+ }
276
+ // --- Record mode ---
277
+ async function handleRecord(brandDir, section, answersRaw) {
278
+ let answers;
279
+ try {
280
+ answers = JSON.parse(answersRaw);
281
+ }
282
+ catch {
283
+ return buildResponse({
284
+ what_happened: "Failed to parse answers — invalid JSON",
285
+ next_steps: [
286
+ "Provide answers as a valid JSON string",
287
+ "If this keeps happening, run brand_feedback to report the issue.",
288
+ ],
289
+ data: { error: ERROR_CODES.INVALID_JSON, raw: answersRaw },
290
+ });
291
+ }
292
+ // Read or create visual identity
293
+ let visual;
294
+ if (await brandDir.hasVisualIdentity()) {
295
+ visual = await brandDir.readVisualIdentity();
296
+ }
297
+ else {
298
+ visual = getEmptyVisualIdentity();
299
+ // Try to pull positioning_context from config
300
+ try {
301
+ const config = await brandDir.readConfig();
302
+ visual.positioning_context = config.industry
303
+ ? `${config.client_name} — ${config.industry}`
304
+ : config.client_name;
305
+ }
306
+ catch {
307
+ // no config
308
+ }
309
+ }
310
+ const changes = [];
311
+ switch (section) {
312
+ case "composition": {
313
+ visual.composition = {
314
+ energy: answers.energy ?? "",
315
+ negative_space: answers.negative_space ?? "",
316
+ grid: answers.grid ?? "",
317
+ layout_preference: answers.layout_preference ?? "",
318
+ };
319
+ changes.push("Set composition spec (energy, negative_space, grid, layout_preference)");
320
+ break;
321
+ }
322
+ case "patterns": {
323
+ visual.patterns = {
324
+ type: answers.type ?? "none",
325
+ usage: answers.usage ?? "",
326
+ assets: answers.assets ?? [],
327
+ };
328
+ changes.push("Set patterns spec (type, usage, assets)");
329
+ break;
330
+ }
331
+ case "illustration": {
332
+ visual.illustration = {
333
+ style: answers.style ?? "",
334
+ function: answers.function ?? "",
335
+ assets: answers.assets ?? [],
336
+ };
337
+ changes.push("Set illustration spec (style, function, assets)");
338
+ break;
339
+ }
340
+ case "photography": {
341
+ visual.photography = {
342
+ style: answers.style ?? "none",
343
+ anti_patterns: answers.anti_patterns ?? [],
344
+ };
345
+ changes.push("Set photography spec (style, anti_patterns)");
346
+ break;
347
+ }
348
+ case "signature": {
349
+ visual.signature = {
350
+ description: answers.description ?? "",
351
+ elements: answers.elements ?? [],
352
+ };
353
+ changes.push("Set signature spec (description, elements)");
354
+ break;
355
+ }
356
+ case "anti_patterns": {
357
+ // Anti-patterns are additive — merge with existing.
358
+ // Accept multiple formats:
359
+ // 1. { rules: [{ rule: "...", severity: "hard" }] } (structured)
360
+ // 2. { rules: ["string", "string"] } (string array)
361
+ // 3. { rules: "sentence. sentence." } (freeform text)
362
+ // 4. { visual_dont: "...", rules: "..." } (freeform fields)
363
+ // 5. Top-level string fields treated as freeform rules
364
+ const rawRules = answers.rules ?? answers.visual_dont ?? answers.anti_patterns ?? "";
365
+ const parsedRules = [];
366
+ if (Array.isArray(rawRules)) {
367
+ for (const item of rawRules) {
368
+ if (typeof item === "string") {
369
+ parsedRules.push({ rule: item.trim(), severity: "hard" });
370
+ }
371
+ else if (item && typeof item === "object" && "rule" in item) {
372
+ parsedRules.push({
373
+ rule: item.rule,
374
+ severity: item.severity ?? "hard",
375
+ ...(item.preflight_id
376
+ ? { preflight_id: item.preflight_id }
377
+ : {}),
378
+ });
379
+ }
380
+ }
381
+ }
382
+ else if (typeof rawRules === "string" && rawRules.trim()) {
383
+ // Split freeform text on periods, newlines, or "No "/"Never " boundaries
384
+ const sentences = rawRules
385
+ .split(/(?:\.\s+|\n+|(?=(?:No |Never |Don't |Avoid )))/i)
386
+ .map((s) => s.trim().replace(/\.+$/, ""))
387
+ .filter((s) => s.length > 5);
388
+ for (const s of sentences) {
389
+ parsedRules.push({ rule: s, severity: "hard" });
390
+ }
391
+ }
392
+ // Also check for a separate visual_dont field if rules was something else
393
+ if (answers.visual_dont && answers.visual_dont !== rawRules) {
394
+ const dontText = String(answers.visual_dont);
395
+ const dontSentences = dontText
396
+ .split(/(?:\.\s+|\n+|(?=(?:No |Never |Don't |Avoid )))/i)
397
+ .map((s) => s.trim().replace(/\.+$/, ""))
398
+ .filter((s) => s.length > 5);
399
+ for (const s of dontSentences) {
400
+ parsedRules.push({ rule: s, severity: "hard" });
401
+ }
402
+ }
403
+ for (const r of parsedRules) {
404
+ const exists = visual.anti_patterns.some((existing) => isSemanticDuplicate(existing.rule, r.rule));
405
+ if (!exists) {
406
+ visual.anti_patterns.push(r);
407
+ changes.push(`Added anti-pattern rule: "${r.rule}" (${r.severity})`);
408
+ }
409
+ else {
410
+ changes.push(`Skipped duplicate anti-pattern: "${r.rule}"`);
411
+ }
412
+ }
413
+ if (parsedRules.length === 0) {
414
+ changes.push("Could not parse any anti-pattern rules from the provided answers. Try sending rules as a plain text string separated by periods, or as an array of strings.");
415
+ }
416
+ break;
417
+ }
418
+ }
419
+ // Write back
420
+ await brandDir.writeVisualIdentity(visual);
421
+ // Check remaining gaps
422
+ const missing = getMissingSections(visual);
423
+ const nextSteps = [];
424
+ if (missing.length > 0) {
425
+ nextSteps.push(`${missing.length} section(s) remaining: ${missing.join(", ")}. Continue the interview or call brand_deepen_identity mode='interview' to get questions.`);
426
+ }
427
+ else {
428
+ nextSteps.push("All 6 visual identity sections are now populated. Run brand_compile to generate the full Visual Identity Manifest.");
429
+ }
430
+ return buildResponse({
431
+ what_happened: `Recorded visual identity section "${section}" to visual-identity.yaml`,
432
+ next_steps: nextSteps,
433
+ data: {
434
+ section_recorded: section,
435
+ changes,
436
+ missing_sections: missing,
437
+ all_complete: missing.length === 0,
438
+ },
439
+ });
440
+ }
441
+ // --- Main handler ---
442
+ async function handler(input) {
443
+ const brandDir = new BrandDir(process.cwd());
444
+ if (!(await brandDir.exists())) {
445
+ return buildResponse({
446
+ what_happened: "No .brand/ directory found",
447
+ next_steps: ["Run brand_start first to create a brand system"],
448
+ data: { error: ERROR_CODES.NOT_INITIALIZED },
449
+ });
450
+ }
451
+ if (input.mode === "interview") {
452
+ return handleInterview(brandDir);
453
+ }
454
+ // Record mode — validate required params
455
+ if (!input.section) {
456
+ return buildResponse({
457
+ what_happened: "Missing required parameter: section",
458
+ next_steps: [
459
+ `Provide section as one of: ${SECTIONS.join(", ")}`,
460
+ ],
461
+ data: { error: ERROR_CODES.MISSING_SECTION },
462
+ });
463
+ }
464
+ if (!input.answers) {
465
+ return buildResponse({
466
+ what_happened: "Missing required parameter: answers",
467
+ next_steps: [
468
+ "Provide answers as a JSON string with keys matching the section's question keys",
469
+ ],
470
+ data: { error: ERROR_CODES.MISSING_ANSWERS },
471
+ });
472
+ }
473
+ return handleRecord(brandDir, input.section, input.answers);
474
+ }
475
+ export function register(server) {
476
+ server.tool("brand_deepen_identity", "Define visual identity rules beyond colors and fonts — composition energy, pattern language, illustration style, photography direction, signature moves, and anti-patterns (hard compliance rules). Session 2 interview with 6 sections. Mode 'interview' returns structured questions for missing sections. Mode 'record' saves answers. Use after Session 1 (core identity extracted). Anti-patterns become enforceable rules in brand_preflight. Returns section completion status.", paramsShape, async (args) => {
477
+ const parsed = safeParseParams(ParamsSchema, args);
478
+ if (!parsed.success)
479
+ return parsed.response;
480
+ return handler(parsed.data);
481
+ });
482
+ }
483
+ //# sourceMappingURL=brand-deepen-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-deepen-identity.js","sourceRoot":"","sources":["../../src/tools/brand-deepen-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { CoreIdentityData, VisualIdentityData, MessagingData } from "../schemas/index.js";
3
+ import type { BrandConfig } from "../types/index.js";
4
+ interface BrandData {
5
+ config: BrandConfig;
6
+ identity: CoreIdentityData;
7
+ visual: VisualIdentityData | null;
8
+ messaging: MessagingData | null;
9
+ }
10
+ export { type BrandData };
11
+ export declare function generateChat(data: BrandData, includeLogo: boolean): string;
12
+ export declare function generateCode(data: BrandData): string;
13
+ export declare function generateTeam(data: BrandData, includeLogo: boolean): string;
14
+ export declare function generateEmail(data: BrandData): string;
15
+ export declare function generateClaudeSkill(data: BrandData, includeLogo: boolean): string;
16
+ export declare function register(server: McpServer): void;
17
+ //# sourceMappingURL=brand-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-export.d.ts","sourceRoot":"","sources":["../../src/tools/brand-export.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAarD,UAAU,SAAS;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;CACjC;AAiND,OAAO,EAAE,KAAK,SAAS,EAAE,CAAC;AAE1B,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM,CAsD1E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAqEpD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM,CA0G1E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CA8FrD;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM,CAyJjF;AAiHD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAWzC"}