@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,436 @@
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
+ // ─── Parameters ──────────────────────────────────────────────────────────────
7
+ const paramsShape = {
8
+ mode: z
9
+ .enum(["interview", "record", "list"])
10
+ .default("interview")
11
+ .describe("'interview' returns questions for building a new persona; 'record' writes persona data to strategy.yaml; 'list' shows all existing personas"),
12
+ persona_id: z
13
+ .string()
14
+ .optional()
15
+ .describe("ID of persona to update (for record mode, e.g. 'PER-001'). Omit to create a new persona."),
16
+ answers: z
17
+ .string()
18
+ .optional()
19
+ .describe("JSON string with persona fields (for record mode)"),
20
+ };
21
+ const ParamsSchema = z.object(paramsShape);
22
+ const PERSONA_QUESTIONS = [
23
+ {
24
+ number: 1,
25
+ key: "role",
26
+ question: "Who is this person? Title and day-to-day responsibility?",
27
+ maps_to: "role_tag, seniority",
28
+ },
29
+ {
30
+ number: 2,
31
+ key: "core_tension",
32
+ question: "What's their core tension — the internal conflict that makes them a buyer?",
33
+ maps_to: "core_tension",
34
+ },
35
+ {
36
+ number: 3,
37
+ key: "objections",
38
+ question: "Top 2-3 objections to working with someone like you?",
39
+ maps_to: "key_objections",
40
+ },
41
+ {
42
+ number: 4,
43
+ key: "information_needs",
44
+ question: "What do they need to believe at each stage to move forward?",
45
+ maps_to: "information_needs (first_touch, context_and_meaning, validation_and_proof, decision_support)",
46
+ },
47
+ {
48
+ number: 5,
49
+ key: "narrative_emphasis",
50
+ question: "Which of your brand's messages resonate most with this person?",
51
+ maps_to: "narrative_emphasis",
52
+ },
53
+ {
54
+ number: 6,
55
+ key: "preferred_channels",
56
+ question: "Where does this person pay attention?",
57
+ maps_to: "preferred_channels",
58
+ },
59
+ {
60
+ number: 7,
61
+ key: "decision_authority",
62
+ question: "What's their role in the buying decision?",
63
+ maps_to: "decision_authority",
64
+ },
65
+ ];
66
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
67
+ function getEmptyStrategy() {
68
+ return {
69
+ schema_version: SCHEMA_VERSION,
70
+ session: 4,
71
+ personas: [],
72
+ journey_stages: [],
73
+ messaging_matrix: [],
74
+ themes: [],
75
+ };
76
+ }
77
+ function nextPersonaId(existing) {
78
+ if (existing.length === 0)
79
+ return "PER-001";
80
+ // Find the highest numeric suffix
81
+ let max = 0;
82
+ for (const p of existing) {
83
+ const match = p.id.match(/PER-(\d+)/);
84
+ if (match) {
85
+ const num = parseInt(match[1], 10);
86
+ if (num > max)
87
+ max = num;
88
+ }
89
+ }
90
+ return `PER-${String(max + 1).padStart(3, "0")}`;
91
+ }
92
+ /**
93
+ * Split freeform text into an array on newlines, periods, semicolons, or "and" boundaries.
94
+ */
95
+ function splitFreeform(text, splitOn) {
96
+ if (!text || !text.trim())
97
+ return [];
98
+ const separator = splitOn === "channels"
99
+ ? /[,;\n]+/
100
+ : /[\n.;]+/;
101
+ return text
102
+ .split(separator)
103
+ .map((s) => s.trim())
104
+ .filter((s) => s.length > 0);
105
+ }
106
+ function generateNameFromRole(roleTag) {
107
+ // "VP Marketing" → "The VP of Marketing"
108
+ const cleaned = roleTag.trim();
109
+ if (cleaned.toLowerCase().startsWith("the "))
110
+ return cleaned;
111
+ return `The ${cleaned}`;
112
+ }
113
+ // ─── Interview mode ──────────────────────────────────────────────────────────
114
+ async function handleInterview(brandDir) {
115
+ let clientName = "this brand";
116
+ try {
117
+ const config = await brandDir.readConfig();
118
+ clientName = config.client_name;
119
+ }
120
+ catch {
121
+ // no config
122
+ }
123
+ // Read existing strategy for context
124
+ let existingPersonas = [];
125
+ let hasStrategy = false;
126
+ if (await brandDir.hasStrategy()) {
127
+ hasStrategy = true;
128
+ const strategy = await brandDir.readStrategy();
129
+ existingPersonas = strategy.personas ?? [];
130
+ }
131
+ // Read messaging for narrative context (if available)
132
+ let perspectiveContext = null;
133
+ try {
134
+ if (await brandDir.hasMessaging()) {
135
+ const messaging = await brandDir.readMessaging();
136
+ if (messaging.perspective) {
137
+ perspectiveContext = messaging.perspective.one_liner ?? null;
138
+ }
139
+ }
140
+ }
141
+ catch {
142
+ // no messaging
143
+ }
144
+ return buildResponse({
145
+ what_happened: hasStrategy
146
+ ? `Strategy file exists with ${existingPersonas.length} persona(s). Ready to build another.`
147
+ : `No strategy.yaml yet. Starting fresh persona building for "${clientName}".`,
148
+ next_steps: [
149
+ "Present the interview questions below — work through one persona at a time",
150
+ "After gathering answers, call brand_build_personas with mode='record' and answers=<JSON>",
151
+ "Most brands have 3-5 personas",
152
+ ],
153
+ data: {
154
+ client_name: clientName,
155
+ existing_personas: existingPersonas.map((p) => ({
156
+ id: p.id,
157
+ name: p.name,
158
+ role: p.role_tag,
159
+ status: p.status,
160
+ })),
161
+ interview: {
162
+ questions: PERSONA_QUESTIONS,
163
+ },
164
+ ...(perspectiveContext
165
+ ? { brand_context: { one_liner: perspectiveContext } }
166
+ : {}),
167
+ conversation_guide: { instruction: [
168
+ `You are building buyer personas for "${clientName}".`,
169
+ "",
170
+ "HOW TO RUN THIS INTERVIEW:",
171
+ "1. Work through ONE persona at a time.",
172
+ "2. Ask for a name/nickname first ('Let's give this persona a name — something memorable like The Overwhelmed VP').",
173
+ "3. Then walk through each question conversationally — do NOT dump all 7 at once.",
174
+ "4. Listen for answers, probe for specificity, then move to the next question.",
175
+ "5. After gathering all answers for one persona, call brand_build_personas with mode='record' to save.",
176
+ "6. After recording, ask 'Want to add another persona? Most brands have 3-5.'",
177
+ "7. Suggest marking personas as 'Hypothesis' if unvalidated.",
178
+ "",
179
+ "TONE: Strategic advisor — curious, pushing for actionable specificity.",
180
+ "GOAL: Get personas that are specific enough to drive content decisions, not vague demographics.",
181
+ "",
182
+ "KEY INSIGHT FOR Q2 (core_tension):",
183
+ "The best personas have a tension that's emotional, not just functional.",
184
+ "'Needs better reporting' is functional. 'Terrified of presenting numbers they can't defend' is a tension.",
185
+ "",
186
+ "KEY INSIGHT FOR Q4 (information_needs):",
187
+ "Walk through the four stages: first_touch (what catches attention), context_and_meaning (what builds understanding),",
188
+ "validation_and_proof (what builds confidence), decision_support (what closes the deal).",
189
+ ].join("\n") },
190
+ },
191
+ });
192
+ }
193
+ // ─── Record mode ─────────────────────────────────────────────────────────────
194
+ async function handleRecord(brandDir, personaId, answersRaw) {
195
+ let answers;
196
+ try {
197
+ answers = JSON.parse(answersRaw);
198
+ }
199
+ catch {
200
+ return buildResponse({
201
+ what_happened: "Failed to parse answers — invalid JSON",
202
+ next_steps: ["Provide answers as a valid JSON string"],
203
+ data: { error: ERROR_CODES.INVALID_JSON, raw: answersRaw },
204
+ });
205
+ }
206
+ // Read or create strategy
207
+ let strategy;
208
+ if (await brandDir.hasStrategy()) {
209
+ strategy = await brandDir.readStrategy();
210
+ }
211
+ else {
212
+ strategy = getEmptyStrategy();
213
+ }
214
+ // Ensure personas array exists
215
+ if (!strategy.personas) {
216
+ strategy.personas = [];
217
+ }
218
+ const isUpdate = !!personaId;
219
+ let existingIdx = -1;
220
+ if (isUpdate) {
221
+ existingIdx = strategy.personas.findIndex((p) => p.id === personaId);
222
+ if (existingIdx === -1) {
223
+ return buildResponse({
224
+ what_happened: `Persona "${personaId}" not found`,
225
+ next_steps: [
226
+ "Check the persona ID — use brand_build_personas mode='list' to see existing personas",
227
+ ],
228
+ data: {
229
+ error: ERROR_CODES.PERSONA_NOT_FOUND,
230
+ valid_ids: strategy.personas.map((p) => p.id),
231
+ },
232
+ });
233
+ }
234
+ }
235
+ // Parse fields from answers
236
+ const roleTag = answers.role_tag ?? answers.role ?? "";
237
+ const seniority = answers.seniority ?? "";
238
+ const name = answers.name ||
239
+ (roleTag ? generateNameFromRole(roleTag) : "Unnamed Persona");
240
+ // Parse key_objections: accept array or freeform string
241
+ let keyObjections = [];
242
+ if (Array.isArray(answers.key_objections)) {
243
+ keyObjections = answers.key_objections.filter((s) => typeof s === "string" && s.trim());
244
+ }
245
+ else if (typeof answers.key_objections === "string") {
246
+ keyObjections = splitFreeform(answers.key_objections, "objections");
247
+ }
248
+ else if (typeof answers.objections === "string") {
249
+ keyObjections = splitFreeform(answers.objections, "objections");
250
+ }
251
+ else if (Array.isArray(answers.objections)) {
252
+ keyObjections = answers.objections.filter((s) => typeof s === "string" && s.trim());
253
+ }
254
+ // Parse preferred_channels: accept array or comma-separated string
255
+ let preferredChannels = [];
256
+ if (Array.isArray(answers.preferred_channels)) {
257
+ preferredChannels = answers.preferred_channels.filter((s) => typeof s === "string" && s.trim());
258
+ }
259
+ else if (typeof answers.preferred_channels === "string") {
260
+ preferredChannels = splitFreeform(answers.preferred_channels, "channels");
261
+ }
262
+ else if (typeof answers.channels === "string") {
263
+ preferredChannels = splitFreeform(answers.channels, "channels");
264
+ }
265
+ else if (Array.isArray(answers.channels)) {
266
+ preferredChannels = answers.channels.filter((s) => typeof s === "string" && s.trim());
267
+ }
268
+ // Parse information_needs
269
+ const infoNeeds = answers.information_needs ?? {};
270
+ const informationNeeds = {
271
+ first_touch: infoNeeds.first_touch ?? "",
272
+ context_and_meaning: infoNeeds.context_and_meaning ?? "",
273
+ validation_and_proof: infoNeeds.validation_and_proof ?? "",
274
+ decision_support: infoNeeds.decision_support ?? "",
275
+ };
276
+ // Parse narrative_emphasis
277
+ const narrativeRaw = answers.narrative_emphasis ?? {};
278
+ const narrativeEmphasis = {
279
+ primary: narrativeRaw.primary ?? "",
280
+ ...(narrativeRaw.secondary
281
+ ? { secondary: narrativeRaw.secondary }
282
+ : {}),
283
+ ...(narrativeRaw.elements
284
+ ? { elements: narrativeRaw.elements }
285
+ : {}),
286
+ };
287
+ // Build the persona
288
+ const id = isUpdate ? personaId : nextPersonaId(strategy.personas);
289
+ const status = answers.status ?? "Hypothesis";
290
+ const persona = {
291
+ id,
292
+ name,
293
+ role_tag: roleTag,
294
+ seniority,
295
+ decision_authority: answers.decision_authority ?? "",
296
+ status,
297
+ core_tension: answers.core_tension ?? "",
298
+ key_objections: keyObjections,
299
+ information_needs: informationNeeds,
300
+ narrative_emphasis: narrativeEmphasis,
301
+ preferred_channels: preferredChannels,
302
+ ...(answers.company_stage
303
+ ? {
304
+ company_stage: Array.isArray(answers.company_stage)
305
+ ? answers.company_stage
306
+ : [answers.company_stage],
307
+ }
308
+ : {}),
309
+ ...(answers.source ? { source: answers.source } : {}),
310
+ };
311
+ // Insert or update
312
+ const changes = [];
313
+ if (isUpdate) {
314
+ strategy.personas[existingIdx] = persona;
315
+ changes.push(`Updated persona ${id} ("${name}")`);
316
+ }
317
+ else {
318
+ strategy.personas.push(persona);
319
+ changes.push(`Added persona ${id} ("${name}")`);
320
+ }
321
+ // Write back
322
+ await brandDir.writeStrategy(strategy);
323
+ const totalPersonas = strategy.personas.length;
324
+ return buildResponse({
325
+ what_happened: isUpdate
326
+ ? `Updated persona ${id} ("${name}") in strategy.yaml`
327
+ : `Recorded new persona ${id} ("${name}") to strategy.yaml`,
328
+ next_steps: totalPersonas < 3
329
+ ? [
330
+ `${totalPersonas} persona(s) so far. Most brands need 3-5.`,
331
+ "Ask if the user wants to add another persona",
332
+ "Run brand_build_personas mode='interview' to start the next one",
333
+ ]
334
+ : [
335
+ `${totalPersonas} persona(s) recorded. Good coverage for most brands.`,
336
+ "Ask if any more personas are needed, or move on to journey stages",
337
+ ],
338
+ data: {
339
+ persona_id: id,
340
+ persona_name: name,
341
+ changes,
342
+ total_personas: totalPersonas,
343
+ all_personas: strategy.personas.map((p) => ({
344
+ id: p.id,
345
+ name: p.name,
346
+ role: p.role_tag,
347
+ status: p.status,
348
+ })),
349
+ conversation_guide: isUpdate
350
+ ? { instruction: `Persona "${name}" updated. Ask if any other personas need changes, or if they want to add a new one.` }
351
+ : { instruction: `Persona "${name}" recorded. Ask: "Want to add another persona? Most brands have 3-5." Suggest marking unvalidated personas as 'Hypothesis'.` },
352
+ },
353
+ });
354
+ }
355
+ // ─── List mode ───────────────────────────────────────────────────────────────
356
+ async function handleList(brandDir) {
357
+ if (!(await brandDir.hasStrategy())) {
358
+ return buildResponse({
359
+ what_happened: "No strategy.yaml found — no personas exist yet",
360
+ next_steps: [
361
+ "Run brand_build_personas mode='interview' to start building personas",
362
+ ],
363
+ data: { personas: [], total: 0 },
364
+ });
365
+ }
366
+ const strategy = await brandDir.readStrategy();
367
+ const personas = strategy.personas ?? [];
368
+ if (personas.length === 0) {
369
+ return buildResponse({
370
+ what_happened: "Strategy file exists but contains no personas",
371
+ next_steps: [
372
+ "Run brand_build_personas mode='interview' to start building personas",
373
+ ],
374
+ data: { personas: [], total: 0 },
375
+ });
376
+ }
377
+ return buildResponse({
378
+ what_happened: `Found ${personas.length} persona(s) in strategy.yaml`,
379
+ next_steps: [
380
+ "Review personas with the user",
381
+ "Use mode='record' with persona_id to update any persona",
382
+ "Use mode='interview' to add a new persona",
383
+ ],
384
+ data: {
385
+ personas: personas.map((p) => ({
386
+ id: p.id,
387
+ name: p.name,
388
+ role_tag: p.role_tag,
389
+ status: p.status,
390
+ core_tension: p.core_tension,
391
+ key_objections: p.key_objections,
392
+ decision_authority: p.decision_authority,
393
+ preferred_channels: p.preferred_channels,
394
+ })),
395
+ total: personas.length,
396
+ },
397
+ });
398
+ }
399
+ // ─── Main handler ────────────────────────────────────────────────────────────
400
+ async function handler(input) {
401
+ const brandDir = new BrandDir(process.cwd());
402
+ if (!(await brandDir.exists())) {
403
+ return buildResponse({
404
+ what_happened: "No .brand/ directory found",
405
+ next_steps: ["Run brand_start first to create a brand system"],
406
+ data: { error: ERROR_CODES.NOT_INITIALIZED },
407
+ });
408
+ }
409
+ if (input.mode === "interview") {
410
+ return handleInterview(brandDir);
411
+ }
412
+ if (input.mode === "list") {
413
+ return handleList(brandDir);
414
+ }
415
+ // Record mode — validate required params
416
+ if (!input.answers) {
417
+ return buildResponse({
418
+ what_happened: "Missing required parameter: answers",
419
+ next_steps: [
420
+ "Provide answers as a JSON string with persona fields (role_tag, core_tension, key_objections, etc.)",
421
+ ],
422
+ data: { error: ERROR_CODES.MISSING_ANSWERS },
423
+ });
424
+ }
425
+ return handleRecord(brandDir, input.persona_id, input.answers);
426
+ }
427
+ // ─── Registration ────────────────────────────────────────────────────────────
428
+ export function register(server) {
429
+ server.tool("brand_build_personas", "Build buyer personas through a guided 7-question interview — role, core tension, objections, information needs per journey stage, narrative emphasis, preferred channels, and decision authority. Mode 'interview' returns questions. Mode 'record' saves a persona (auto-generates ID like PER-001, parses freeform text). Mode 'list' shows all personas. Most brands need 3-5 personas. Part of Session 4. Returns persona data and total count.", paramsShape, async (args) => {
430
+ const parsed = safeParseParams(ParamsSchema, args);
431
+ if (!parsed.success)
432
+ return parsed.response;
433
+ return handler(parsed.data);
434
+ });
435
+ }
436
+ //# sourceMappingURL=brand-build-personas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-build-personas.js","sourceRoot":"","sources":["../../src/tools/brand-build-personas.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-themes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-build-themes.d.ts","sourceRoot":"","sources":["../../src/tools/brand-build-themes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgkBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAWzC"}