@brandsystem/mcp 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +515 -0
- package/bin/brandsystem-mcp.mjs +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/brand-dir.d.ts +56 -0
- package/dist/lib/brand-dir.d.ts.map +1 -0
- package/dist/lib/brand-dir.js +270 -0
- package/dist/lib/brand-dir.js.map +1 -0
- package/dist/lib/color-namer.d.ts +28 -0
- package/dist/lib/color-namer.d.ts.map +1 -0
- package/dist/lib/color-namer.js +155 -0
- package/dist/lib/color-namer.js.map +1 -0
- package/dist/lib/confidence.d.ts +19 -0
- package/dist/lib/confidence.d.ts.map +1 -0
- package/dist/lib/confidence.js +66 -0
- package/dist/lib/confidence.js.map +1 -0
- package/dist/lib/content-scorer.d.ts +38 -0
- package/dist/lib/content-scorer.d.ts.map +1 -0
- package/dist/lib/content-scorer.js +571 -0
- package/dist/lib/content-scorer.js.map +1 -0
- package/dist/lib/css-parser.d.ts +45 -0
- package/dist/lib/css-parser.d.ts.map +1 -0
- package/dist/lib/css-parser.js +330 -0
- package/dist/lib/css-parser.js.map +1 -0
- package/dist/lib/dtcg-compiler.d.ts +7 -0
- package/dist/lib/dtcg-compiler.d.ts.map +1 -0
- package/dist/lib/dtcg-compiler.js +89 -0
- package/dist/lib/dtcg-compiler.js.map +1 -0
- package/dist/lib/interaction-policy-compiler.d.ts +40 -0
- package/dist/lib/interaction-policy-compiler.d.ts.map +1 -0
- package/dist/lib/interaction-policy-compiler.js +60 -0
- package/dist/lib/interaction-policy-compiler.js.map +1 -0
- package/dist/lib/logo-extractor.d.ts +49 -0
- package/dist/lib/logo-extractor.d.ts.map +1 -0
- package/dist/lib/logo-extractor.js +384 -0
- package/dist/lib/logo-extractor.js.map +1 -0
- package/dist/lib/report-html.d.ts +20 -0
- package/dist/lib/report-html.d.ts.map +1 -0
- package/dist/lib/report-html.js +938 -0
- package/dist/lib/report-html.js.map +1 -0
- package/dist/lib/response.d.ts +20 -0
- package/dist/lib/response.d.ts.map +1 -0
- package/dist/lib/response.js +54 -0
- package/dist/lib/response.js.map +1 -0
- package/dist/lib/runtime-compiler.d.ts +60 -0
- package/dist/lib/runtime-compiler.d.ts.map +1 -0
- package/dist/lib/runtime-compiler.js +96 -0
- package/dist/lib/runtime-compiler.js.map +1 -0
- package/dist/lib/svg-resolver.d.ts +21 -0
- package/dist/lib/svg-resolver.d.ts.map +1 -0
- package/dist/lib/svg-resolver.js +115 -0
- package/dist/lib/svg-resolver.js.map +1 -0
- package/dist/lib/url-validator.d.ts +11 -0
- package/dist/lib/url-validator.d.ts.map +1 -0
- package/dist/lib/url-validator.js +93 -0
- package/dist/lib/url-validator.js.map +1 -0
- package/dist/lib/version.d.ts +2 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +19 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/lib/vim-generator.d.ts +13 -0
- package/dist/lib/vim-generator.d.ts.map +1 -0
- package/dist/lib/vim-generator.js +718 -0
- package/dist/lib/vim-generator.js.map +1 -0
- package/dist/resources/brand-resources.d.ts +4 -0
- package/dist/resources/brand-resources.d.ts.map +1 -0
- package/dist/resources/brand-resources.js +34 -0
- package/dist/resources/brand-resources.js.map +1 -0
- package/dist/schemas/brand-config.d.ts +28 -0
- package/dist/schemas/brand-config.d.ts.map +1 -0
- package/dist/schemas/brand-config.js +11 -0
- package/dist/schemas/brand-config.js.map +1 -0
- package/dist/schemas/brand-runtime.d.ts +251 -0
- package/dist/schemas/brand-runtime.d.ts.map +1 -0
- package/dist/schemas/brand-runtime.js +54 -0
- package/dist/schemas/brand-runtime.js.map +1 -0
- package/dist/schemas/core-identity.d.ts +302 -0
- package/dist/schemas/core-identity.d.ts.map +1 -0
- package/dist/schemas/core-identity.js +51 -0
- package/dist/schemas/core-identity.js.map +1 -0
- package/dist/schemas/index.d.ts +11 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +11 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/interaction-policy.d.ts +150 -0
- package/dist/schemas/interaction-policy.d.ts.map +1 -0
- package/dist/schemas/interaction-policy.js +34 -0
- package/dist/schemas/interaction-policy.js.map +1 -0
- package/dist/schemas/messaging.d.ts +776 -0
- package/dist/schemas/messaging.d.ts.map +1 -0
- package/dist/schemas/messaging.js +68 -0
- package/dist/schemas/messaging.js.map +1 -0
- package/dist/schemas/needs-clarification.d.ts +62 -0
- package/dist/schemas/needs-clarification.d.ts.map +1 -0
- package/dist/schemas/needs-clarification.js +13 -0
- package/dist/schemas/needs-clarification.js.map +1 -0
- package/dist/schemas/strategy.d.ts +537 -0
- package/dist/schemas/strategy.d.ts.map +1 -0
- package/dist/schemas/strategy.js +71 -0
- package/dist/schemas/strategy.js.map +1 -0
- package/dist/schemas/tokens.d.ts +35 -0
- package/dist/schemas/tokens.d.ts.map +1 -0
- package/dist/schemas/tokens.js +15 -0
- package/dist/schemas/tokens.js.map +1 -0
- package/dist/schemas/visual-identity.d.ts +224 -0
- package/dist/schemas/visual-identity.d.ts.map +1 -0
- package/dist/schemas/visual-identity.js +42 -0
- package/dist/schemas/visual-identity.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +75 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/brand-audit-content.d.ts +3 -0
- package/dist/tools/brand-audit-content.d.ts.map +1 -0
- package/dist/tools/brand-audit-content.js +116 -0
- package/dist/tools/brand-audit-content.js.map +1 -0
- package/dist/tools/brand-audit-drift.d.ts +3 -0
- package/dist/tools/brand-audit-drift.d.ts.map +1 -0
- package/dist/tools/brand-audit-drift.js +301 -0
- package/dist/tools/brand-audit-drift.js.map +1 -0
- package/dist/tools/brand-audit.d.ts +3 -0
- package/dist/tools/brand-audit.d.ts.map +1 -0
- package/dist/tools/brand-audit.js +129 -0
- package/dist/tools/brand-audit.js.map +1 -0
- package/dist/tools/brand-build-journey.d.ts +3 -0
- package/dist/tools/brand-build-journey.d.ts.map +1 -0
- package/dist/tools/brand-build-journey.js +312 -0
- package/dist/tools/brand-build-journey.js.map +1 -0
- package/dist/tools/brand-build-matrix.d.ts +3 -0
- package/dist/tools/brand-build-matrix.d.ts.map +1 -0
- package/dist/tools/brand-build-matrix.js +525 -0
- package/dist/tools/brand-build-matrix.js.map +1 -0
- package/dist/tools/brand-build-personas.d.ts +3 -0
- package/dist/tools/brand-build-personas.d.ts.map +1 -0
- package/dist/tools/brand-build-personas.js +436 -0
- package/dist/tools/brand-build-personas.js.map +1 -0
- package/dist/tools/brand-build-themes.d.ts +3 -0
- package/dist/tools/brand-build-themes.d.ts.map +1 -0
- package/dist/tools/brand-build-themes.js +476 -0
- package/dist/tools/brand-build-themes.js.map +1 -0
- package/dist/tools/brand-check-compliance.d.ts +3 -0
- package/dist/tools/brand-check-compliance.d.ts.map +1 -0
- package/dist/tools/brand-check-compliance.js +243 -0
- package/dist/tools/brand-check-compliance.js.map +1 -0
- package/dist/tools/brand-clarify.d.ts +21 -0
- package/dist/tools/brand-clarify.d.ts.map +1 -0
- package/dist/tools/brand-clarify.js +497 -0
- package/dist/tools/brand-clarify.js.map +1 -0
- package/dist/tools/brand-compile-messaging.d.ts +3 -0
- package/dist/tools/brand-compile-messaging.d.ts.map +1 -0
- package/dist/tools/brand-compile-messaging.js +759 -0
- package/dist/tools/brand-compile-messaging.js.map +1 -0
- package/dist/tools/brand-compile.d.ts +3 -0
- package/dist/tools/brand-compile.d.ts.map +1 -0
- package/dist/tools/brand-compile.js +182 -0
- package/dist/tools/brand-compile.js.map +1 -0
- package/dist/tools/brand-deepen-identity.d.ts +3 -0
- package/dist/tools/brand-deepen-identity.d.ts.map +1 -0
- package/dist/tools/brand-deepen-identity.js +483 -0
- package/dist/tools/brand-deepen-identity.js.map +1 -0
- package/dist/tools/brand-export.d.ts +17 -0
- package/dist/tools/brand-export.d.ts.map +1 -0
- package/dist/tools/brand-export.js +730 -0
- package/dist/tools/brand-export.js.map +1 -0
- package/dist/tools/brand-extract-figma.d.ts +3 -0
- package/dist/tools/brand-extract-figma.d.ts.map +1 -0
- package/dist/tools/brand-extract-figma.js +174 -0
- package/dist/tools/brand-extract-figma.js.map +1 -0
- package/dist/tools/brand-extract-messaging.d.ts +3 -0
- package/dist/tools/brand-extract-messaging.d.ts.map +1 -0
- package/dist/tools/brand-extract-messaging.js +620 -0
- package/dist/tools/brand-extract-messaging.js.map +1 -0
- package/dist/tools/brand-extract-web.d.ts +3 -0
- package/dist/tools/brand-extract-web.d.ts.map +1 -0
- package/dist/tools/brand-extract-web.js +477 -0
- package/dist/tools/brand-extract-web.js.map +1 -0
- package/dist/tools/brand-feedback.d.ts +3 -0
- package/dist/tools/brand-feedback.d.ts.map +1 -0
- package/dist/tools/brand-feedback.js +366 -0
- package/dist/tools/brand-feedback.js.map +1 -0
- package/dist/tools/brand-ingest-assets.d.ts +3 -0
- package/dist/tools/brand-ingest-assets.d.ts.map +1 -0
- package/dist/tools/brand-ingest-assets.js +233 -0
- package/dist/tools/brand-ingest-assets.js.map +1 -0
- package/dist/tools/brand-init.d.ts +3 -0
- package/dist/tools/brand-init.d.ts.map +1 -0
- package/dist/tools/brand-init.js +66 -0
- package/dist/tools/brand-init.js.map +1 -0
- package/dist/tools/brand-preflight.d.ts +3 -0
- package/dist/tools/brand-preflight.d.ts.map +1 -0
- package/dist/tools/brand-preflight.js +608 -0
- package/dist/tools/brand-preflight.js.map +1 -0
- package/dist/tools/brand-report.d.ts +3 -0
- package/dist/tools/brand-report.d.ts.map +1 -0
- package/dist/tools/brand-report.js +154 -0
- package/dist/tools/brand-report.js.map +1 -0
- package/dist/tools/brand-runtime.d.ts +3 -0
- package/dist/tools/brand-runtime.d.ts.map +1 -0
- package/dist/tools/brand-runtime.js +37 -0
- package/dist/tools/brand-runtime.js.map +1 -0
- package/dist/tools/brand-set-logo.d.ts +3 -0
- package/dist/tools/brand-set-logo.d.ts.map +1 -0
- package/dist/tools/brand-set-logo.js +170 -0
- package/dist/tools/brand-set-logo.js.map +1 -0
- package/dist/tools/brand-start.d.ts +3 -0
- package/dist/tools/brand-start.d.ts.map +1 -0
- package/dist/tools/brand-start.js +686 -0
- package/dist/tools/brand-start.js.map +1 -0
- package/dist/tools/brand-status.d.ts +3 -0
- package/dist/tools/brand-status.d.ts.map +1 -0
- package/dist/tools/brand-status.js +175 -0
- package/dist/tools/brand-status.js.map +1 -0
- package/dist/tools/brand-write.d.ts +3 -0
- package/dist/tools/brand-write.d.ts.map +1 -0
- package/dist/tools/brand-write.js +442 -0
- package/dist/tools/brand-write.js.map +1 -0
- package/dist/types/index.d.ts +331 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +52 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,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 @@
|
|
|
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"}
|