@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,476 @@
|
|
|
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", "list"])
|
|
9
|
+
.default("interview")
|
|
10
|
+
.describe("'interview' returns questions for defining content themes; 'record' writes a theme to strategy.yaml; 'list' returns all current themes"),
|
|
11
|
+
theme_id: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("ID of theme to edit (for record mode, optional — omit to create new)"),
|
|
15
|
+
answers: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("JSON string with theme data (required when mode='record')"),
|
|
19
|
+
};
|
|
20
|
+
const ParamsSchema = z.object(paramsShape);
|
|
21
|
+
const THEME_QUESTIONS = [
|
|
22
|
+
{
|
|
23
|
+
number: 1,
|
|
24
|
+
question: "What's the most important idea you want the market to associate with you right now?",
|
|
25
|
+
maps_to: "name + strategic_priority",
|
|
26
|
+
guidance: "The name should be a short label (2-5 words). The strategic_priority is the explanation of why this idea matters right now.",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
number: 2,
|
|
30
|
+
question: "What proof do you have for this? Which data points, case studies, or observations back it up?",
|
|
31
|
+
maps_to: "key_claims",
|
|
32
|
+
guidance: "These become the proof points attached to this theme. Can be existing claims from the brand system or new ones.",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
number: 3,
|
|
36
|
+
question: "Which audiences care most about this theme?",
|
|
37
|
+
maps_to: "target_personas",
|
|
38
|
+
guidance: "Reference existing persona IDs (e.g. PER-001) if available, or describe the audience and we'll match them.",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
number: 4,
|
|
42
|
+
question: "Is this about building awareness (Brand Heat), deepening engagement (Momentum), or driving action (Conversion)?",
|
|
43
|
+
maps_to: "content_intent",
|
|
44
|
+
guidance: "Pick one primary intent. Brand Heat = thought leadership + awareness. Momentum = engagement + trust. Conversion = pipeline + action.",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
number: 5,
|
|
48
|
+
question: "Is this theme evergreen or time-bound? If time-bound, which quarter?",
|
|
49
|
+
maps_to: "quarter + status",
|
|
50
|
+
guidance: 'Examples: "evergreen", "Q2 2026", "H2 2026". Time-bound themes get Active status; evergreen themes can be Active or Planned.',
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
// --- Helpers ---
|
|
54
|
+
function getEmptyStrategy() {
|
|
55
|
+
return {
|
|
56
|
+
schema_version: SCHEMA_VERSION,
|
|
57
|
+
session: 4,
|
|
58
|
+
personas: [],
|
|
59
|
+
journey_stages: [],
|
|
60
|
+
messaging_matrix: [],
|
|
61
|
+
themes: [],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function generateThemeId(existingThemes) {
|
|
65
|
+
const maxNum = existingThemes.reduce((max, t) => {
|
|
66
|
+
const match = t.id.match(/^THM-(\d+)$/);
|
|
67
|
+
return match ? Math.max(max, parseInt(match[1], 10)) : max;
|
|
68
|
+
}, 0);
|
|
69
|
+
return `THM-${String(maxNum + 1).padStart(3, "0")}`;
|
|
70
|
+
}
|
|
71
|
+
/** Parse content intent from natural language */
|
|
72
|
+
function parseContentIntent(raw) {
|
|
73
|
+
const lower = raw.toLowerCase().trim();
|
|
74
|
+
if (lower.includes("brand heat") ||
|
|
75
|
+
lower.includes("awareness") ||
|
|
76
|
+
lower.includes("thought leadership")) {
|
|
77
|
+
return "Brand Heat";
|
|
78
|
+
}
|
|
79
|
+
if (lower.includes("momentum") ||
|
|
80
|
+
lower.includes("engagement") ||
|
|
81
|
+
lower.includes("education") ||
|
|
82
|
+
lower.includes("trust")) {
|
|
83
|
+
return "Momentum";
|
|
84
|
+
}
|
|
85
|
+
if (lower.includes("conversion") ||
|
|
86
|
+
lower.includes("sales") ||
|
|
87
|
+
lower.includes("pipeline") ||
|
|
88
|
+
lower.includes("action") ||
|
|
89
|
+
lower.includes("driving action")) {
|
|
90
|
+
return "Conversion";
|
|
91
|
+
}
|
|
92
|
+
// If the raw value is already one of the canonical names, use it
|
|
93
|
+
if (["Brand Heat", "Momentum", "Conversion"].includes(raw.trim())) {
|
|
94
|
+
return raw.trim();
|
|
95
|
+
}
|
|
96
|
+
// Fallback — return as-is so the user can refine
|
|
97
|
+
return raw.trim();
|
|
98
|
+
}
|
|
99
|
+
/** Parse freeform text into a string array */
|
|
100
|
+
function parseStringArray(val) {
|
|
101
|
+
if (Array.isArray(val)) {
|
|
102
|
+
return val.map((v) => String(v).trim()).filter((v) => v.length > 0);
|
|
103
|
+
}
|
|
104
|
+
if (typeof val === "string" && val.trim()) {
|
|
105
|
+
return val
|
|
106
|
+
.split(/[,;\n]+/)
|
|
107
|
+
.map((s) => s.trim())
|
|
108
|
+
.filter((s) => s.length > 0);
|
|
109
|
+
}
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
/** Match freeform persona references against existing persona names/IDs */
|
|
113
|
+
function resolvePersonaRefs(raw, existingPersonas) {
|
|
114
|
+
const inputs = parseStringArray(raw);
|
|
115
|
+
if (existingPersonas.length === 0) {
|
|
116
|
+
// No personas to match against — return raw values
|
|
117
|
+
return inputs;
|
|
118
|
+
}
|
|
119
|
+
return inputs.map((input) => {
|
|
120
|
+
const lower = input.toLowerCase();
|
|
121
|
+
// Direct ID match (e.g. "PER-001")
|
|
122
|
+
const idMatch = existingPersonas.find((p) => p.id.toLowerCase() === lower);
|
|
123
|
+
if (idMatch)
|
|
124
|
+
return idMatch.id;
|
|
125
|
+
// Name match (e.g. "The Overwhelmed VP")
|
|
126
|
+
const nameMatch = existingPersonas.find((p) => p.name.toLowerCase() === lower);
|
|
127
|
+
if (nameMatch)
|
|
128
|
+
return nameMatch.id;
|
|
129
|
+
// Partial name match
|
|
130
|
+
const partialMatch = existingPersonas.find((p) => p.name.toLowerCase().includes(lower) ||
|
|
131
|
+
lower.includes(p.name.toLowerCase()) ||
|
|
132
|
+
p.role_tag.toLowerCase().includes(lower) ||
|
|
133
|
+
lower.includes(p.role_tag.toLowerCase()));
|
|
134
|
+
if (partialMatch)
|
|
135
|
+
return partialMatch.id;
|
|
136
|
+
// No match — return as-is
|
|
137
|
+
return input;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/** Determine status from quarter and explicit status */
|
|
141
|
+
function resolveStatus(quarter, explicitStatus) {
|
|
142
|
+
if (explicitStatus) {
|
|
143
|
+
const lower = explicitStatus.toLowerCase();
|
|
144
|
+
if (lower === "active")
|
|
145
|
+
return "Active";
|
|
146
|
+
if (lower === "planned")
|
|
147
|
+
return "Planned";
|
|
148
|
+
if (lower === "retired")
|
|
149
|
+
return "Retired";
|
|
150
|
+
}
|
|
151
|
+
// Default: Active if quarter provided, Planned otherwise
|
|
152
|
+
return quarter && quarter.trim() ? "Active" : "Planned";
|
|
153
|
+
}
|
|
154
|
+
/** Parse quarter from freeform text */
|
|
155
|
+
function parseQuarter(raw) {
|
|
156
|
+
if (!raw)
|
|
157
|
+
return undefined;
|
|
158
|
+
const str = String(raw).trim().toLowerCase();
|
|
159
|
+
if (!str || str === "evergreen" || str === "none" || str === "n/a") {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
return String(raw).trim();
|
|
163
|
+
}
|
|
164
|
+
// --- Interview mode ---
|
|
165
|
+
async function handleInterview(brandDir) {
|
|
166
|
+
let clientName = "this brand";
|
|
167
|
+
try {
|
|
168
|
+
const config = await brandDir.readConfig();
|
|
169
|
+
clientName = config.client_name;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// no config
|
|
173
|
+
}
|
|
174
|
+
// Check for existing strategy + personas
|
|
175
|
+
let existingThemeCount = 0;
|
|
176
|
+
let existingPersonas = [];
|
|
177
|
+
if (await brandDir.hasStrategy()) {
|
|
178
|
+
const strategy = await brandDir.readStrategy();
|
|
179
|
+
existingThemeCount = strategy.themes.length;
|
|
180
|
+
existingPersonas = strategy.personas.map((p) => ({
|
|
181
|
+
id: p.id,
|
|
182
|
+
name: p.name,
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
const personaContext = existingPersonas.length > 0
|
|
186
|
+
? {
|
|
187
|
+
available_personas: existingPersonas,
|
|
188
|
+
note: "Reference these persona IDs when answering Q3.",
|
|
189
|
+
}
|
|
190
|
+
: {
|
|
191
|
+
available_personas: [],
|
|
192
|
+
note: "No personas defined yet. Describe audiences in plain language — they can be formalized later with brand_build_personas.",
|
|
193
|
+
};
|
|
194
|
+
return buildResponse({
|
|
195
|
+
what_happened: existingThemeCount > 0
|
|
196
|
+
? `${existingThemeCount} theme(s) already exist for "${clientName}". Ready to add more.`
|
|
197
|
+
: `No content themes defined yet for "${clientName}". Starting theme interview.`,
|
|
198
|
+
next_steps: [
|
|
199
|
+
"Present the questions below — work through one theme at a time",
|
|
200
|
+
"After gathering answers, call brand_build_themes with mode='record', answers=<JSON>",
|
|
201
|
+
"Repeat for each theme (most brands have 3-5 active themes)",
|
|
202
|
+
],
|
|
203
|
+
data: {
|
|
204
|
+
client_name: clientName,
|
|
205
|
+
existing_themes: existingThemeCount,
|
|
206
|
+
personas: personaContext,
|
|
207
|
+
questions: THEME_QUESTIONS,
|
|
208
|
+
intent_definitions: {
|
|
209
|
+
"Brand Heat": "Provocative, POV-forward, conversation-starting. Goal: awareness + thought leadership. Makes people say 'I never thought about it that way.'",
|
|
210
|
+
Momentum: "Deep, useful, framework-oriented. Goal: engagement + trust. Makes people say 'I need to save this.'",
|
|
211
|
+
Conversion: "Direct, outcome-focused, proof-heavy. Goal: pipeline + action. Makes people say 'I need to talk to them.'",
|
|
212
|
+
},
|
|
213
|
+
conversation_guide: {
|
|
214
|
+
instruction: [
|
|
215
|
+
`You are defining editorial content themes for "${clientName}". These are the strategic pillars that organize what to write about.`,
|
|
216
|
+
"",
|
|
217
|
+
"HOW TO RUN THIS INTERVIEW:",
|
|
218
|
+
"1. Work through ONE theme at a time. Ask all 5 questions for each theme.",
|
|
219
|
+
"2. Ask conversationally — do NOT dump all questions at once.",
|
|
220
|
+
"3. When you have answers for a theme, call brand_build_themes with mode='record' to save it.",
|
|
221
|
+
"4. Then ask: 'Want to add another theme?'",
|
|
222
|
+
"5. Most brands have 3-5 active themes. Suggest they balance across all three intents.",
|
|
223
|
+
"",
|
|
224
|
+
"EXPLAIN THE THREE INTENTS:",
|
|
225
|
+
"Before question 4, explain the three content intents clearly:",
|
|
226
|
+
"- **Brand Heat** — Provocative, POV-forward, conversation-starting. Goal: awareness + thought leadership.",
|
|
227
|
+
"- **Momentum** — Deep, useful, framework-oriented. Goal: engagement + trust.",
|
|
228
|
+
"- **Conversion** — Direct, outcome-focused, proof-heavy. Goal: pipeline + action.",
|
|
229
|
+
"",
|
|
230
|
+
"Suggest they aim for at least one theme in each intent category to cover the full funnel.",
|
|
231
|
+
"",
|
|
232
|
+
"AFTER ALL THEMES ARE RECORDED:",
|
|
233
|
+
"Say: 'Your content strategy is taking shape. Run brand_build_matrix to generate message variants for each persona x journey stage, then brand_status --strategy to see the full coverage picture.'",
|
|
234
|
+
"",
|
|
235
|
+
"TONE: Collaborative strategist — curious, direct, non-judgmental.",
|
|
236
|
+
"GOAL: Get specific, actionable themes — not vague categories.",
|
|
237
|
+
].join("\n"),
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
// --- Record mode ---
|
|
243
|
+
async function handleRecord(brandDir, themeId, answersRaw) {
|
|
244
|
+
let answers;
|
|
245
|
+
try {
|
|
246
|
+
answers = JSON.parse(answersRaw);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return buildResponse({
|
|
250
|
+
what_happened: "Failed to parse answers — invalid JSON",
|
|
251
|
+
next_steps: ["Provide answers as a valid JSON string"],
|
|
252
|
+
data: { error: ERROR_CODES.INVALID_JSON, raw: answersRaw },
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// Read or create strategy
|
|
256
|
+
let strategy;
|
|
257
|
+
if (await brandDir.hasStrategy()) {
|
|
258
|
+
strategy = await brandDir.readStrategy();
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
strategy = getEmptyStrategy();
|
|
262
|
+
}
|
|
263
|
+
const isEdit = !!themeId;
|
|
264
|
+
let targetId;
|
|
265
|
+
let existingIndex = -1;
|
|
266
|
+
if (isEdit) {
|
|
267
|
+
existingIndex = strategy.themes.findIndex((t) => t.id === themeId);
|
|
268
|
+
if (existingIndex === -1) {
|
|
269
|
+
return buildResponse({
|
|
270
|
+
what_happened: `Theme "${themeId}" not found`,
|
|
271
|
+
next_steps: [
|
|
272
|
+
"Check the theme ID with brand_build_themes mode='list'",
|
|
273
|
+
"Or omit theme_id to create a new theme",
|
|
274
|
+
],
|
|
275
|
+
data: { error: ERROR_CODES.THEME_NOT_FOUND, theme_id: themeId },
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
targetId = themeId;
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
targetId = generateThemeId(strategy.themes);
|
|
282
|
+
}
|
|
283
|
+
// Parse the answers
|
|
284
|
+
const name = String(answers.name ?? "").trim();
|
|
285
|
+
if (!name) {
|
|
286
|
+
return buildResponse({
|
|
287
|
+
what_happened: "Missing required field: name",
|
|
288
|
+
next_steps: [
|
|
289
|
+
"Provide at least a 'name' field in the answers JSON",
|
|
290
|
+
],
|
|
291
|
+
data: { error: ERROR_CODES.MISSING_NAME },
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
const rawIntent = String(answers.content_intent ?? answers.intent ?? "");
|
|
295
|
+
const contentIntent = parseContentIntent(rawIntent);
|
|
296
|
+
const quarter = parseQuarter(answers.quarter);
|
|
297
|
+
const status = resolveStatus(quarter, answers.status);
|
|
298
|
+
// Resolve persona references against existing personas
|
|
299
|
+
const existingPersonas = strategy.personas.map((p) => ({
|
|
300
|
+
id: p.id,
|
|
301
|
+
name: p.name,
|
|
302
|
+
role_tag: p.role_tag,
|
|
303
|
+
}));
|
|
304
|
+
const targetPersonas = resolvePersonaRefs(answers.target_personas ?? answers.personas ?? answers.audiences ?? [], existingPersonas);
|
|
305
|
+
const keyClaims = parseStringArray(answers.key_claims ?? answers.proof ?? answers.claims ?? []);
|
|
306
|
+
const theme = {
|
|
307
|
+
id: targetId,
|
|
308
|
+
name,
|
|
309
|
+
status,
|
|
310
|
+
...(quarter ? { quarter } : {}),
|
|
311
|
+
content_intent: contentIntent,
|
|
312
|
+
strategic_priority: String(answers.strategic_priority ?? answers.priority ?? "").trim(),
|
|
313
|
+
...(answers.narrative_route
|
|
314
|
+
? { narrative_route: String(answers.narrative_route) }
|
|
315
|
+
: {}),
|
|
316
|
+
target_personas: targetPersonas,
|
|
317
|
+
...(keyClaims.length > 0 ? { key_claims: keyClaims } : {}),
|
|
318
|
+
...(answers.success_criteria
|
|
319
|
+
? { success_criteria: String(answers.success_criteria) }
|
|
320
|
+
: {}),
|
|
321
|
+
};
|
|
322
|
+
// Insert or update
|
|
323
|
+
if (isEdit && existingIndex >= 0) {
|
|
324
|
+
strategy.themes[existingIndex] = theme;
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
strategy.themes.push(theme);
|
|
328
|
+
}
|
|
329
|
+
await brandDir.writeStrategy(strategy);
|
|
330
|
+
const changes = [
|
|
331
|
+
isEdit
|
|
332
|
+
? `Updated theme ${targetId}: "${name}"`
|
|
333
|
+
: `Created theme ${targetId}: "${name}"`,
|
|
334
|
+
`Intent: ${contentIntent}`,
|
|
335
|
+
`Status: ${status}${quarter ? ` (${quarter})` : ""}`,
|
|
336
|
+
`Personas: ${targetPersonas.length > 0 ? targetPersonas.join(", ") : "none specified"}`,
|
|
337
|
+
...(keyClaims.length > 0
|
|
338
|
+
? [`Claims: ${keyClaims.length} proof point(s)`]
|
|
339
|
+
: []),
|
|
340
|
+
];
|
|
341
|
+
// Check intent distribution
|
|
342
|
+
const intentCounts = { "Brand Heat": 0, Momentum: 0, Conversion: 0 };
|
|
343
|
+
for (const t of strategy.themes) {
|
|
344
|
+
if (t.content_intent in intentCounts) {
|
|
345
|
+
intentCounts[t.content_intent]++;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
const missingIntents = Object.entries(intentCounts)
|
|
349
|
+
.filter(([, count]) => count === 0)
|
|
350
|
+
.map(([intent]) => intent);
|
|
351
|
+
const nextSteps = [];
|
|
352
|
+
nextSteps.push(`${strategy.themes.length} theme(s) total. Want to add another?`);
|
|
353
|
+
if (missingIntents.length > 0) {
|
|
354
|
+
nextSteps.push(`No themes yet for: ${missingIntents.join(", ")}. Consider adding coverage for a balanced strategy.`);
|
|
355
|
+
}
|
|
356
|
+
if (strategy.themes.length >= 3 && missingIntents.length === 0) {
|
|
357
|
+
nextSteps.push("Your content strategy is taking shape. Run brand_build_matrix to generate message variants for each persona x journey stage, then brand_status --strategy to see the full coverage picture.");
|
|
358
|
+
}
|
|
359
|
+
return buildResponse({
|
|
360
|
+
what_happened: isEdit
|
|
361
|
+
? `Updated theme "${name}" (${targetId}) in strategy.yaml`
|
|
362
|
+
: `Recorded new theme "${name}" (${targetId}) to strategy.yaml`,
|
|
363
|
+
next_steps: nextSteps,
|
|
364
|
+
data: {
|
|
365
|
+
theme: theme,
|
|
366
|
+
changes,
|
|
367
|
+
total_themes: strategy.themes.length,
|
|
368
|
+
intent_distribution: intentCounts,
|
|
369
|
+
missing_intents: missingIntents,
|
|
370
|
+
},
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
// --- List mode ---
|
|
374
|
+
async function handleList(brandDir) {
|
|
375
|
+
if (!(await brandDir.hasStrategy())) {
|
|
376
|
+
return buildResponse({
|
|
377
|
+
what_happened: "No strategy.yaml found — no themes defined yet",
|
|
378
|
+
next_steps: [
|
|
379
|
+
"Run brand_build_themes mode='interview' to start defining content themes",
|
|
380
|
+
],
|
|
381
|
+
data: { themes: [] },
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
const strategy = await brandDir.readStrategy();
|
|
385
|
+
const themes = strategy.themes;
|
|
386
|
+
if (themes.length === 0) {
|
|
387
|
+
return buildResponse({
|
|
388
|
+
what_happened: "Strategy exists but no themes defined yet",
|
|
389
|
+
next_steps: [
|
|
390
|
+
"Run brand_build_themes mode='interview' to start defining content themes",
|
|
391
|
+
],
|
|
392
|
+
data: { themes: [] },
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
// Build summary for each theme
|
|
396
|
+
const themeSummaries = themes.map((t) => ({
|
|
397
|
+
id: t.id,
|
|
398
|
+
name: t.name,
|
|
399
|
+
content_intent: t.content_intent,
|
|
400
|
+
status: t.status,
|
|
401
|
+
quarter: t.quarter ?? "evergreen",
|
|
402
|
+
target_personas: t.target_personas,
|
|
403
|
+
key_claims_count: t.key_claims?.length ?? 0,
|
|
404
|
+
}));
|
|
405
|
+
// Intent distribution
|
|
406
|
+
const intentCounts = { "Brand Heat": 0, Momentum: 0, Conversion: 0 };
|
|
407
|
+
for (const t of themes) {
|
|
408
|
+
if (t.content_intent in intentCounts) {
|
|
409
|
+
intentCounts[t.content_intent]++;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
const missingIntents = Object.entries(intentCounts)
|
|
413
|
+
.filter(([, count]) => count === 0)
|
|
414
|
+
.map(([intent]) => intent);
|
|
415
|
+
const statusCounts = {
|
|
416
|
+
Active: themes.filter((t) => t.status === "Active").length,
|
|
417
|
+
Planned: themes.filter((t) => t.status === "Planned").length,
|
|
418
|
+
Retired: themes.filter((t) => t.status === "Retired").length,
|
|
419
|
+
};
|
|
420
|
+
const nextSteps = [];
|
|
421
|
+
if (missingIntents.length > 0) {
|
|
422
|
+
nextSteps.push(`No themes for: ${missingIntents.join(", ")}. Consider adding coverage.`);
|
|
423
|
+
}
|
|
424
|
+
nextSteps.push("Run brand_build_themes mode='record' to add or edit themes");
|
|
425
|
+
if (themes.length >= 3) {
|
|
426
|
+
nextSteps.push("Run brand_build_matrix to generate message variants for each persona x journey stage");
|
|
427
|
+
}
|
|
428
|
+
return buildResponse({
|
|
429
|
+
what_happened: `Found ${themes.length} content theme(s)`,
|
|
430
|
+
next_steps: nextSteps,
|
|
431
|
+
data: {
|
|
432
|
+
themes: themeSummaries,
|
|
433
|
+
intent_distribution: intentCounts,
|
|
434
|
+
missing_intents: missingIntents,
|
|
435
|
+
status_distribution: statusCounts,
|
|
436
|
+
},
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
// --- Main handler ---
|
|
440
|
+
async function handler(input) {
|
|
441
|
+
const brandDir = new BrandDir(process.cwd());
|
|
442
|
+
if (!(await brandDir.exists())) {
|
|
443
|
+
return buildResponse({
|
|
444
|
+
what_happened: "No .brand/ directory found",
|
|
445
|
+
next_steps: ["Run brand_start first to create a brand system"],
|
|
446
|
+
data: { error: ERROR_CODES.NOT_INITIALIZED },
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
switch (input.mode) {
|
|
450
|
+
case "interview":
|
|
451
|
+
return handleInterview(brandDir);
|
|
452
|
+
case "list":
|
|
453
|
+
return handleList(brandDir);
|
|
454
|
+
case "record": {
|
|
455
|
+
if (!input.answers) {
|
|
456
|
+
return buildResponse({
|
|
457
|
+
what_happened: "Missing required parameter: answers",
|
|
458
|
+
next_steps: [
|
|
459
|
+
"Provide answers as a JSON string with at least: name, content_intent, strategic_priority, target_personas",
|
|
460
|
+
],
|
|
461
|
+
data: { error: ERROR_CODES.MISSING_ANSWERS },
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
return handleRecord(brandDir, input.theme_id, input.answers);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
export function register(server) {
|
|
469
|
+
server.tool("brand_build_themes", "Define editorial content themes — the strategic pillars that organize what to write about. Each theme has a content intent (Brand Heat for awareness, Momentum for engagement, Conversion for pipeline), target personas, and proof points. Mode 'interview' guides through 5 questions per theme. Mode 'record' saves (auto-generates ID like THM-001). Mode 'list' shows all themes with intent distribution. Most brands need 3-5 themes balanced across all three intents. Returns theme data and balance analysis.", paramsShape, async (args) => {
|
|
470
|
+
const parsed = safeParseParams(ParamsSchema, args);
|
|
471
|
+
if (!parsed.success)
|
|
472
|
+
return parsed.response;
|
|
473
|
+
return handler(parsed.data);
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=brand-build-themes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand-build-themes.js","sourceRoot":"","sources":["../../src/tools/brand-build-themes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand-check-compliance.d.ts","sourceRoot":"","sources":["../../src/tools/brand-check-compliance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuQzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAWzC"}
|