@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,312 @@
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 paramsShape = {
7
+ mode: z
8
+ .enum(["interview", "record", "view"])
9
+ .default("interview")
10
+ .describe("'interview' presents default journey stages for customization; 'record' writes stages to strategy.yaml; 'view' returns current stages"),
11
+ answers: z
12
+ .string()
13
+ .optional()
14
+ .describe("JSON string with journey stage customizations (for record mode). Array of stage objects, or a single stage object to update."),
15
+ };
16
+ const ParamsSchema = z.object(paramsShape);
17
+ // --- Default journey stages ---
18
+ function getDefaultStages() {
19
+ return [
20
+ {
21
+ id: "first-touch",
22
+ name: "First Touch",
23
+ buyer_mindset: "What is this? Why should I care?",
24
+ content_goal: "Spark interest. Lead with problem recognition.",
25
+ story_types: ["Brand Narrative"],
26
+ narrative_elements: ["Problem", "Hero"],
27
+ claims_policy: {
28
+ preferred_salience: "Lead",
29
+ max_per_piece: 1,
30
+ },
31
+ tone_shift: "More provocative, less consultative",
32
+ },
33
+ {
34
+ id: "context-and-meaning",
35
+ name: "Context & Meaning",
36
+ buyer_mindset: "Do I understand this? Is it for me?",
37
+ content_goal: "Deepen context. Show unique POV.",
38
+ story_types: ["Brand Narrative", "Product/Service Story"],
39
+ narrative_elements: ["Problem", "Guide", "Journey"],
40
+ claims_policy: {
41
+ preferred_salience: ["Lead", "Support"],
42
+ max_per_piece: 3,
43
+ },
44
+ tone_shift: "More educational, framework-oriented",
45
+ },
46
+ {
47
+ id: "validation-and-proof",
48
+ name: "Validation & Proof",
49
+ buyer_mindset: "Is this legit? Do others trust this?",
50
+ content_goal: "Offer credibility. Show outcomes.",
51
+ story_types: ["Customer/Social Proof", "Product/Service Story"],
52
+ narrative_elements: ["Victory", "Proof Point", "Journey"],
53
+ claims_policy: {
54
+ preferred_salience: ["Support", "Lead"],
55
+ max_per_piece: null,
56
+ min_confidence: 0.8,
57
+ },
58
+ tone_shift: "More concrete, metrics-forward",
59
+ },
60
+ {
61
+ id: "decision-support",
62
+ name: "Decision Support",
63
+ buyer_mindset: "Am I ready? What happens next?",
64
+ content_goal: "Remove friction. Provide clarity.",
65
+ story_types: ["Product/Service Story"],
66
+ narrative_elements: ["Guide", "Victory", "Hero"],
67
+ claims_policy: {
68
+ preferred_salience: "Lead",
69
+ max_per_piece: 2,
70
+ },
71
+ tone_shift: "More direct, consultative, action-oriented",
72
+ },
73
+ ];
74
+ }
75
+ // --- Interview mode ---
76
+ async function handleInterview(brandDir) {
77
+ let clientName = "this brand";
78
+ try {
79
+ const config = await brandDir.readConfig();
80
+ clientName = config.client_name;
81
+ }
82
+ catch {
83
+ // no config available
84
+ }
85
+ // Check if journey stages already exist
86
+ let existingStages = [];
87
+ if (await brandDir.hasStrategy()) {
88
+ const strategy = await brandDir.readStrategy();
89
+ existingStages = strategy.journey_stages ?? [];
90
+ }
91
+ const defaults = getDefaultStages();
92
+ const stageTable = defaults.map((s) => ({
93
+ id: s.id,
94
+ name: s.name,
95
+ buyer_mindset: s.buyer_mindset,
96
+ content_goal: s.content_goal,
97
+ tone_shift: s.tone_shift,
98
+ }));
99
+ return buildResponse({
100
+ what_happened: existingStages.length > 0
101
+ ? `Found ${existingStages.length} existing journey stage(s) for "${clientName}". Presenting defaults for review.`
102
+ : `No journey stages defined yet for "${clientName}". Presenting the 4 default buyer journey stages.`,
103
+ next_steps: [
104
+ "Present the default stages table and ask the user to customize or accept them",
105
+ "After the user responds, call brand_build_journey with mode='record' and the final stages as answers",
106
+ ],
107
+ data: {
108
+ client_name: clientName,
109
+ existing_stages: existingStages.length > 0 ? existingStages : null,
110
+ default_stages: stageTable,
111
+ defaults_full: defaults,
112
+ conversation_guide: {
113
+ instruction: [
114
+ `Present the 4 default buyer journey stages as a table for "${clientName}":`,
115
+ "",
116
+ "| Stage | Buyer Mindset | Content Goal | Tone Shift |",
117
+ "|-------|--------------|--------------|------------|",
118
+ ...defaults.map((s) => `| **${s.name}** | ${s.buyer_mindset} | ${s.content_goal} | ${s.tone_shift} |`),
119
+ "",
120
+ "Say: 'These are the standard buyer journey stages. They work for most B2B brands. Want to customize any of them, or do these work as-is?'",
121
+ "",
122
+ "If the user says they're fine, call brand_build_journey with mode='record' and no answers (writes defaults).",
123
+ "If they want to customize, walk through each stage they want to change. Gather their edits, then call brand_build_journey with mode='record' and the customized stages as the answers parameter.",
124
+ "",
125
+ "Each stage has these fields that can be customized:",
126
+ " - name: display name",
127
+ " - buyer_mindset: the question in the buyer's head",
128
+ " - content_goal: what content should accomplish",
129
+ " - story_types: which story archetypes fit (Brand Narrative, Product/Service Story, Customer/Social Proof)",
130
+ " - narrative_elements: which narrative elements to emphasize (Problem, Hero, Guide, Journey, Victory, Proof Point)",
131
+ " - claims_policy: how claims are deployed (preferred_salience, max_per_piece, min_confidence)",
132
+ " - tone_shift: how tone adjusts at this stage",
133
+ ].join("\n"),
134
+ },
135
+ },
136
+ });
137
+ }
138
+ // --- Record mode ---
139
+ async function handleRecord(brandDir, answersRaw) {
140
+ // Parse answers if provided
141
+ let stages;
142
+ if (!answersRaw) {
143
+ // No answers = write defaults
144
+ stages = getDefaultStages();
145
+ }
146
+ else {
147
+ let parsed;
148
+ try {
149
+ parsed = JSON.parse(answersRaw);
150
+ }
151
+ catch {
152
+ return buildResponse({
153
+ what_happened: "Failed to parse answers -- invalid JSON",
154
+ next_steps: ["Provide answers as a valid JSON string (array of stage objects or a single stage object)"],
155
+ data: { error: ERROR_CODES.INVALID_JSON, raw: answersRaw },
156
+ });
157
+ }
158
+ const defaults = getDefaultStages();
159
+ if (Array.isArray(parsed)) {
160
+ // Full array of stages -- validate each has at least an id
161
+ stages = parsed.map((item) => {
162
+ const defaultStage = defaults.find((d) => d.id === item.id);
163
+ if (defaultStage) {
164
+ // Merge customizations over defaults
165
+ return {
166
+ ...defaultStage,
167
+ ...item,
168
+ claims_policy: {
169
+ ...defaultStage.claims_policy,
170
+ ...(item.claims_policy ?? {}),
171
+ },
172
+ };
173
+ }
174
+ // Fully custom stage
175
+ return item;
176
+ });
177
+ }
178
+ else if (parsed && typeof parsed === "object" && "id" in parsed) {
179
+ // Single stage update -- merge into defaults
180
+ const single = parsed;
181
+ stages = defaults.map((d) => {
182
+ if (d.id === single.id) {
183
+ return {
184
+ ...d,
185
+ ...single,
186
+ claims_policy: {
187
+ ...d.claims_policy,
188
+ ...(single.claims_policy ?? {}),
189
+ },
190
+ };
191
+ }
192
+ return d;
193
+ });
194
+ // If the single stage wasn't found in defaults, append it
195
+ if (!defaults.some((d) => d.id === single.id)) {
196
+ stages.push(single);
197
+ }
198
+ }
199
+ else {
200
+ return buildResponse({
201
+ what_happened: "Invalid answers format",
202
+ next_steps: [
203
+ "Provide answers as a JSON array of stage objects, or a single stage object with an 'id' field",
204
+ ],
205
+ data: { error: ERROR_CODES.INVALID_FORMAT },
206
+ });
207
+ }
208
+ }
209
+ // Read or create strategy.yaml, merging journey_stages without overwriting other fields
210
+ let strategy;
211
+ if (await brandDir.hasStrategy()) {
212
+ strategy = await brandDir.readStrategy();
213
+ strategy.journey_stages = stages;
214
+ }
215
+ else {
216
+ strategy = {
217
+ schema_version: SCHEMA_VERSION,
218
+ session: 4,
219
+ personas: [],
220
+ journey_stages: stages,
221
+ messaging_matrix: [],
222
+ themes: [],
223
+ };
224
+ }
225
+ await brandDir.writeStrategy(strategy);
226
+ const isDefaults = !answersRaw;
227
+ const stageNames = stages.map((s) => s.name);
228
+ return buildResponse({
229
+ what_happened: `Recorded ${stages.length} buyer journey stage(s) to strategy.yaml${isDefaults ? " (defaults)" : ""}`,
230
+ next_steps: [
231
+ "Journey stages are set. Next, define personas with brand_build_personas",
232
+ "Or view current stages with brand_build_journey mode='view'",
233
+ ],
234
+ data: {
235
+ stages_recorded: stageNames,
236
+ stage_count: stages.length,
237
+ used_defaults: isDefaults,
238
+ strategy_file: ".brand/strategy.yaml",
239
+ },
240
+ });
241
+ }
242
+ // --- View mode ---
243
+ async function handleView(brandDir) {
244
+ let clientName = "this brand";
245
+ try {
246
+ const config = await brandDir.readConfig();
247
+ clientName = config.client_name;
248
+ }
249
+ catch {
250
+ // no config available
251
+ }
252
+ if (!(await brandDir.hasStrategy())) {
253
+ return buildResponse({
254
+ what_happened: `No strategy.yaml found for "${clientName}"`,
255
+ next_steps: [
256
+ "Run brand_build_journey with mode='interview' to define buyer journey stages",
257
+ ],
258
+ data: { error: ERROR_CODES.NO_STRATEGY },
259
+ });
260
+ }
261
+ const strategy = await brandDir.readStrategy();
262
+ const stages = strategy.journey_stages ?? [];
263
+ if (stages.length === 0) {
264
+ return buildResponse({
265
+ what_happened: `Strategy exists for "${clientName}" but no journey stages are defined`,
266
+ next_steps: [
267
+ "Run brand_build_journey with mode='interview' to define buyer journey stages",
268
+ ],
269
+ data: { stage_count: 0 },
270
+ });
271
+ }
272
+ return buildResponse({
273
+ what_happened: `${stages.length} buyer journey stage(s) defined for "${clientName}"`,
274
+ next_steps: [
275
+ "Review the stages below. To update, call brand_build_journey mode='record' with customized stages",
276
+ "If stages look good, proceed to brand_build_personas to define target personas",
277
+ ],
278
+ data: {
279
+ client_name: clientName,
280
+ stage_count: stages.length,
281
+ stages,
282
+ },
283
+ });
284
+ }
285
+ // --- Main handler ---
286
+ async function handler(input) {
287
+ const brandDir = new BrandDir(process.cwd());
288
+ if (!(await brandDir.exists())) {
289
+ return buildResponse({
290
+ what_happened: "No .brand/ directory found",
291
+ next_steps: ["Run brand_start first to create a brand system"],
292
+ data: { error: ERROR_CODES.NOT_INITIALIZED },
293
+ });
294
+ }
295
+ switch (input.mode) {
296
+ case "interview":
297
+ return handleInterview(brandDir);
298
+ case "record":
299
+ return handleRecord(brandDir, input.answers);
300
+ case "view":
301
+ return handleView(brandDir);
302
+ }
303
+ }
304
+ export function register(server) {
305
+ server.tool("brand_build_journey", "Define buyer journey stages for content strategy — the path from awareness to purchase. Ships with 4 proven defaults (First Touch, Context & Meaning, Validation & Proof, Decision Support) that can be customized per brand. Mode 'interview' presents defaults for review. Mode 'record' writes stages (omit answers to accept defaults). Mode 'view' shows current stages. Part of Session 4 (content strategy). Returns stage definitions with buyer mindset, content goals, and tone shifts.", paramsShape, async (args) => {
306
+ const parsed = safeParseParams(ParamsSchema, args);
307
+ if (!parsed.success)
308
+ return parsed.response;
309
+ return handler(parsed.data);
310
+ });
311
+ }
312
+ //# sourceMappingURL=brand-build-journey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-build-journey.js","sourceRoot":"","sources":["../../src/tools/brand-build-journey.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-matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-build-matrix.d.ts","sourceRoot":"","sources":["../../src/tools/brand-build-matrix.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+lBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAWzC"}