@vibekiln/cutline-mcp-cli 0.14.0 → 0.15.1
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/dist/commands/setup.js +10 -4
- package/dist/servers/{chunk-EWUELVO2.js → chunk-FHWY2TYO.js} +8 -0
- package/dist/servers/cutline-server.js +68 -1
- package/dist/servers/{data-client-OIQ6SINO.js → data-client-3OADPXXN.js} +5 -1
- package/dist/servers/exploration-server.js +1 -1
- package/dist/servers/integrations-server.js +1 -1
- package/dist/servers/output-server.js +1 -1
- package/dist/servers/premortem-server.js +1 -1
- package/dist/servers/slopburn-server.js +1 -1
- package/dist/servers/tools-server.js +66 -5
- package/package.json +1 -1
package/dist/commands/setup.js
CHANGED
|
@@ -147,7 +147,7 @@ function writeAuditVisibilityConfig(hiddenDimensions) {
|
|
|
147
147
|
mkdirSync(configDir, { recursive: true });
|
|
148
148
|
writeFileSync(configPath, JSON.stringify(next, null, 2) + '\n');
|
|
149
149
|
}
|
|
150
|
-
function resolveServeRuntime() {
|
|
150
|
+
function resolveServeRuntime(options) {
|
|
151
151
|
// Optional explicit override for advanced environments.
|
|
152
152
|
if (process.env.CUTLINE_MCP_BIN?.trim()) {
|
|
153
153
|
return {
|
|
@@ -168,9 +168,12 @@ function resolveServeRuntime() {
|
|
|
168
168
|
// Fallback for machines without a global install.
|
|
169
169
|
const voltaNpx = join(homedir(), '.volta', 'bin', 'npx');
|
|
170
170
|
const npxCommand = existsSync(voltaNpx) ? voltaNpx : 'npx';
|
|
171
|
+
const packageName = options?.staging
|
|
172
|
+
? '@kylewadegrove/cutline-mcp-cli-staging@latest'
|
|
173
|
+
: '@vibekiln/cutline-mcp-cli@latest';
|
|
171
174
|
return {
|
|
172
175
|
command: npxCommand,
|
|
173
|
-
argsPrefix: ['-y',
|
|
176
|
+
argsPrefix: ['-y', packageName],
|
|
174
177
|
source: 'npx',
|
|
175
178
|
};
|
|
176
179
|
}
|
|
@@ -340,7 +343,7 @@ export async function setupCommand(options) {
|
|
|
340
343
|
console.log(chalk.dim(' Hidden audit dimensions: none\n'));
|
|
341
344
|
}
|
|
342
345
|
// ── 3. Write MCP server config to IDEs ───────────────────────────────────
|
|
343
|
-
const runtime = resolveServeRuntime();
|
|
346
|
+
const runtime = resolveServeRuntime({ staging: options.staging });
|
|
344
347
|
const serverConfig = buildServerConfig(runtime, { staging: options.staging });
|
|
345
348
|
const home = homedir();
|
|
346
349
|
const ideConfigs = [
|
|
@@ -495,7 +498,10 @@ export async function setupCommand(options) {
|
|
|
495
498
|
}
|
|
496
499
|
console.log();
|
|
497
500
|
console.log(chalk.dim(` cutline-mcp v${version} · docs: https://thecutline.ai/docs/setup`));
|
|
498
|
-
|
|
501
|
+
const bootstrapPackage = options.staging
|
|
502
|
+
? '@kylewadegrove/cutline-mcp-cli-staging@latest'
|
|
503
|
+
: '@vibekiln/cutline-mcp-cli@latest';
|
|
504
|
+
console.log(chalk.dim(' Testing bootstrap:'), chalk.cyan(`npx -y ${bootstrapPackage} setup${options.staging ? ' --staging' : ''}`));
|
|
499
505
|
console.log(chalk.dim(' Optional repo policy contract:'), chalk.cyan('cutline-mcp policy-init'));
|
|
500
506
|
console.log();
|
|
501
507
|
}
|
|
@@ -1024,6 +1024,12 @@ async function getPersona(personaId) {
|
|
|
1024
1024
|
const res = await proxy("persona.get", { id: personaId });
|
|
1025
1025
|
return res.doc;
|
|
1026
1026
|
}
|
|
1027
|
+
async function getProductAgenda(params) {
|
|
1028
|
+
return proxy("journey.product_agenda", params);
|
|
1029
|
+
}
|
|
1030
|
+
async function getDiscoverabilityAgenda(params) {
|
|
1031
|
+
return getProductAgenda(params);
|
|
1032
|
+
}
|
|
1027
1033
|
async function callCF(functionName, body, timeoutMs = 6e4) {
|
|
1028
1034
|
const res = await performAuthedRequest(async ({ baseUrl, idToken, environment }) => {
|
|
1029
1035
|
const endpoint = resolveFunctionEndpointName(functionName, environment);
|
|
@@ -1325,6 +1331,8 @@ export {
|
|
|
1325
1331
|
updateScanRateLimit,
|
|
1326
1332
|
listPersonas,
|
|
1327
1333
|
getPersona,
|
|
1334
|
+
getProductAgenda,
|
|
1335
|
+
getDiscoverabilityAgenda,
|
|
1328
1336
|
cfGenerateTrialRun,
|
|
1329
1337
|
cfGenerateChatSuggestion,
|
|
1330
1338
|
cfGenerateAnswer,
|
|
@@ -70,6 +70,7 @@ import {
|
|
|
70
70
|
getNodesWithEmbeddings,
|
|
71
71
|
getPersona,
|
|
72
72
|
getPremortem,
|
|
73
|
+
getProductAgenda,
|
|
73
74
|
getPublicSiteUrlForCurrentAuth,
|
|
74
75
|
getScanRateLimit,
|
|
75
76
|
getStoredInstallId,
|
|
@@ -99,7 +100,7 @@ import {
|
|
|
99
100
|
upsertEntities,
|
|
100
101
|
upsertNodes,
|
|
101
102
|
validateRequestSize
|
|
102
|
-
} from "./chunk-
|
|
103
|
+
} from "./chunk-FHWY2TYO.js";
|
|
103
104
|
|
|
104
105
|
// ../mcp/dist/mcp/src/cutline-server.js
|
|
105
106
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -5406,6 +5407,60 @@ async function listCutlineTools() {
|
|
|
5406
5407
|
required: ["personaId"]
|
|
5407
5408
|
}
|
|
5408
5409
|
},
|
|
5410
|
+
{
|
|
5411
|
+
name: "journey_product_agenda",
|
|
5412
|
+
description: "\u{1F512} PREMIUM - Build a Markdown product agenda from Cutline Journeys (Human Discoverability audit + optional query playground today). Returns markdown, agenda_items, agenda_version, sections_included, and MCP hints.",
|
|
5413
|
+
inputSchema: {
|
|
5414
|
+
type: "object",
|
|
5415
|
+
properties: {
|
|
5416
|
+
personaId: { type: "string", description: "Persona whose Journey runs to pull from" },
|
|
5417
|
+
audit_id: {
|
|
5418
|
+
type: "string",
|
|
5419
|
+
description: "Specific answerAudits doc id; omit with include_latest_audit true (default) to use latest completed audit"
|
|
5420
|
+
},
|
|
5421
|
+
playground_id: {
|
|
5422
|
+
type: "string",
|
|
5423
|
+
description: "Specific queryPlaygrounds doc id; set include_latest_playground true to merge latest playground"
|
|
5424
|
+
},
|
|
5425
|
+
include_latest_audit: {
|
|
5426
|
+
type: "boolean",
|
|
5427
|
+
description: "When audit_id omitted, use latest completed audit (default true)"
|
|
5428
|
+
},
|
|
5429
|
+
include_latest_playground: {
|
|
5430
|
+
type: "boolean",
|
|
5431
|
+
description: "When true and playground_id omitted, merge latest completed playground run"
|
|
5432
|
+
}
|
|
5433
|
+
},
|
|
5434
|
+
required: ["personaId"]
|
|
5435
|
+
}
|
|
5436
|
+
},
|
|
5437
|
+
{
|
|
5438
|
+
name: "journey_discoverability_agenda",
|
|
5439
|
+
description: "\u{1F512} PREMIUM - Deprecated: use journey_product_agenda. Same as before (Human Discoverability agenda).",
|
|
5440
|
+
inputSchema: {
|
|
5441
|
+
type: "object",
|
|
5442
|
+
properties: {
|
|
5443
|
+
personaId: { type: "string", description: "Persona whose Journey discoverability runs to include" },
|
|
5444
|
+
audit_id: {
|
|
5445
|
+
type: "string",
|
|
5446
|
+
description: "Specific answerAudits doc id; omit with include_latest_audit true (default) to use latest completed audit"
|
|
5447
|
+
},
|
|
5448
|
+
playground_id: {
|
|
5449
|
+
type: "string",
|
|
5450
|
+
description: "Specific queryPlaygrounds doc id; set include_latest_playground true to merge latest playground"
|
|
5451
|
+
},
|
|
5452
|
+
include_latest_audit: {
|
|
5453
|
+
type: "boolean",
|
|
5454
|
+
description: "When audit_id omitted, use latest completed audit (default true)"
|
|
5455
|
+
},
|
|
5456
|
+
include_latest_playground: {
|
|
5457
|
+
type: "boolean",
|
|
5458
|
+
description: "When true and playground_id omitted, merge latest completed playground run"
|
|
5459
|
+
}
|
|
5460
|
+
},
|
|
5461
|
+
required: ["personaId"]
|
|
5462
|
+
}
|
|
5463
|
+
},
|
|
5409
5464
|
{
|
|
5410
5465
|
name: "personas_chat",
|
|
5411
5466
|
description: "\u{1F512} PREMIUM - Chat with a persona.",
|
|
@@ -6518,6 +6573,18 @@ Competitive threats: ${competitors}` : ""
|
|
|
6518
6573
|
const persona = await getPersona(personaId);
|
|
6519
6574
|
return { content: [{ type: "text", text: JSON.stringify({ persona }) }] };
|
|
6520
6575
|
}
|
|
6576
|
+
case "journey_product_agenda":
|
|
6577
|
+
case "journey_discoverability_agenda": {
|
|
6578
|
+
const { personaId, audit_id, playground_id, include_latest_audit, include_latest_playground } = args;
|
|
6579
|
+
const agenda = await getProductAgenda({
|
|
6580
|
+
personaId,
|
|
6581
|
+
audit_id,
|
|
6582
|
+
playground_id,
|
|
6583
|
+
include_latest_audit,
|
|
6584
|
+
include_latest_playground
|
|
6585
|
+
});
|
|
6586
|
+
return { content: [{ type: "text", text: JSON.stringify(agenda) }] };
|
|
6587
|
+
}
|
|
6521
6588
|
case "personas_chat": {
|
|
6522
6589
|
const { persona, userMessage, product, conversationHistory } = args;
|
|
6523
6590
|
const result = await cfChatWithPersona(persona, userMessage, product, conversationHistory);
|
|
@@ -43,6 +43,7 @@ import {
|
|
|
43
43
|
getAllNodesLight,
|
|
44
44
|
getBindingsForEntity,
|
|
45
45
|
getChat,
|
|
46
|
+
getDiscoverabilityAgenda,
|
|
46
47
|
getEngagement,
|
|
47
48
|
getEntitiesWithEmbeddings,
|
|
48
49
|
getEntityById,
|
|
@@ -57,6 +58,7 @@ import {
|
|
|
57
58
|
getPersona,
|
|
58
59
|
getPodcastIntroductions,
|
|
59
60
|
getPremortem,
|
|
61
|
+
getProductAgenda,
|
|
60
62
|
getPublicSiteUrlForCurrentAuth,
|
|
61
63
|
getReadinessReport,
|
|
62
64
|
getScanRateLimit,
|
|
@@ -97,7 +99,7 @@ import {
|
|
|
97
99
|
upsertEntities,
|
|
98
100
|
upsertNodes,
|
|
99
101
|
upsertSlopburnRun
|
|
100
|
-
} from "./chunk-
|
|
102
|
+
} from "./chunk-FHWY2TYO.js";
|
|
101
103
|
export {
|
|
102
104
|
__dataClientInternals,
|
|
103
105
|
addEdges,
|
|
@@ -143,6 +145,7 @@ export {
|
|
|
143
145
|
getAllNodesLight,
|
|
144
146
|
getBindingsForEntity,
|
|
145
147
|
getChat,
|
|
148
|
+
getDiscoverabilityAgenda,
|
|
146
149
|
getEngagement,
|
|
147
150
|
getEntitiesWithEmbeddings,
|
|
148
151
|
getEntityById,
|
|
@@ -157,6 +160,7 @@ export {
|
|
|
157
160
|
getPersona,
|
|
158
161
|
getPodcastIntroductions,
|
|
159
162
|
getPremortem,
|
|
163
|
+
getProductAgenda,
|
|
160
164
|
getPublicSiteUrlForCurrentAuth,
|
|
161
165
|
getReadinessReport,
|
|
162
166
|
getScanRateLimit,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
requirePremiumWithAutoAuth,
|
|
15
15
|
updateExplorationSession,
|
|
16
16
|
validateRequestSize
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-FHWY2TYO.js";
|
|
18
18
|
|
|
19
19
|
// ../mcp/dist/mcp/src/exploration-server.js
|
|
20
20
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
requirePremiumWithAutoAuth,
|
|
14
14
|
validateAuth,
|
|
15
15
|
validateRequestSize
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-FHWY2TYO.js";
|
|
17
17
|
|
|
18
18
|
// ../mcp/dist/mcp/src/integrations-server.js
|
|
19
19
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
mapErrorToMcp,
|
|
14
14
|
requirePremiumWithAutoAuth,
|
|
15
15
|
validateRequestSize
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-FHWY2TYO.js";
|
|
17
17
|
|
|
18
18
|
// ../mcp/dist/mcp/src/output-server.js
|
|
19
19
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -16,12 +16,13 @@ import {
|
|
|
16
16
|
cfSaveWikiMarkdown,
|
|
17
17
|
getPersona,
|
|
18
18
|
getPodcastIntroductions,
|
|
19
|
+
getProductAgenda,
|
|
19
20
|
listPersonas,
|
|
20
21
|
mapErrorToMcp,
|
|
21
22
|
requirePremiumWithAutoAuth,
|
|
22
23
|
validateAuth,
|
|
23
24
|
validateRequestSize
|
|
24
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-FHWY2TYO.js";
|
|
25
26
|
|
|
26
27
|
// ../mcp/dist/mcp/src/tools-server.js
|
|
27
28
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -108,7 +109,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
108
109
|
productId: { type: "string", description: "Optional product ID to filter personas" },
|
|
109
110
|
auth_token: { type: "string" }
|
|
110
111
|
},
|
|
111
|
-
required: [
|
|
112
|
+
required: []
|
|
112
113
|
}
|
|
113
114
|
},
|
|
114
115
|
{
|
|
@@ -120,7 +121,51 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
120
121
|
personaId: { type: "string" },
|
|
121
122
|
auth_token: { type: "string" }
|
|
122
123
|
},
|
|
123
|
-
required: ["personaId"
|
|
124
|
+
required: ["personaId"]
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: "journey_product_agenda",
|
|
129
|
+
description: "Build a Markdown product agenda from Cutline Journeys (Human Discoverability audit + optional query playground today; more sections later). Returns markdown, agenda_items, agenda_version, sections_included, and mcp_arguments_hint.",
|
|
130
|
+
inputSchema: {
|
|
131
|
+
type: "object",
|
|
132
|
+
properties: {
|
|
133
|
+
personaId: { type: "string", description: "Persona whose Journey runs to pull from" },
|
|
134
|
+
audit_id: { type: "string", description: "answerAudits doc id (optional)" },
|
|
135
|
+
playground_id: { type: "string", description: "queryPlaygrounds doc id (optional)" },
|
|
136
|
+
include_latest_audit: {
|
|
137
|
+
type: "boolean",
|
|
138
|
+
description: "If audit_id omitted, use latest completed audit (default true)"
|
|
139
|
+
},
|
|
140
|
+
include_latest_playground: {
|
|
141
|
+
type: "boolean",
|
|
142
|
+
description: "Merge latest completed playground when true"
|
|
143
|
+
},
|
|
144
|
+
auth_token: { type: "string" }
|
|
145
|
+
},
|
|
146
|
+
required: ["personaId"]
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: "journey_discoverability_agenda",
|
|
151
|
+
description: "Deprecated \u2014 use journey_product_agenda. Same behavior: Markdown agenda from Human Discoverability (audit + optional playground).",
|
|
152
|
+
inputSchema: {
|
|
153
|
+
type: "object",
|
|
154
|
+
properties: {
|
|
155
|
+
personaId: { type: "string", description: "Persona whose Journey runs to pull from" },
|
|
156
|
+
audit_id: { type: "string", description: "answerAudits doc id (optional)" },
|
|
157
|
+
playground_id: { type: "string", description: "queryPlaygrounds doc id (optional)" },
|
|
158
|
+
include_latest_audit: {
|
|
159
|
+
type: "boolean",
|
|
160
|
+
description: "If audit_id omitted, use latest completed audit (default true)"
|
|
161
|
+
},
|
|
162
|
+
include_latest_playground: {
|
|
163
|
+
type: "boolean",
|
|
164
|
+
description: "Merge latest completed playground when true"
|
|
165
|
+
},
|
|
166
|
+
auth_token: { type: "string" }
|
|
167
|
+
},
|
|
168
|
+
required: ["personaId"]
|
|
124
169
|
}
|
|
125
170
|
},
|
|
126
171
|
{
|
|
@@ -151,7 +196,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
151
196
|
},
|
|
152
197
|
auth_token: { type: "string" }
|
|
153
198
|
},
|
|
154
|
-
required: ["persona", "userMessage"
|
|
199
|
+
required: ["persona", "userMessage"]
|
|
155
200
|
}
|
|
156
201
|
},
|
|
157
202
|
{
|
|
@@ -168,7 +213,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
168
213
|
},
|
|
169
214
|
auth_token: { type: "string" }
|
|
170
215
|
},
|
|
171
|
-
required: ["productId"
|
|
216
|
+
required: ["productId"]
|
|
172
217
|
}
|
|
173
218
|
}
|
|
174
219
|
]
|
|
@@ -249,6 +294,22 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
249
294
|
content: [{ type: "text", text: JSON.stringify({ persona }) }]
|
|
250
295
|
};
|
|
251
296
|
}
|
|
297
|
+
case "journey_product_agenda":
|
|
298
|
+
case "journey_discoverability_agenda": {
|
|
299
|
+
const { personaId, audit_id, playground_id, include_latest_audit, include_latest_playground, auth_token } = args;
|
|
300
|
+
const normalizedAuthToken = auth_token && auth_token !== "auto" && auth_token.trim() !== "" ? auth_token : void 0;
|
|
301
|
+
await requirePremiumWithAutoAuth(normalizedAuthToken);
|
|
302
|
+
const agenda = await getProductAgenda({
|
|
303
|
+
personaId,
|
|
304
|
+
audit_id,
|
|
305
|
+
playground_id,
|
|
306
|
+
include_latest_audit,
|
|
307
|
+
include_latest_playground
|
|
308
|
+
});
|
|
309
|
+
return {
|
|
310
|
+
content: [{ type: "text", text: JSON.stringify(agenda) }]
|
|
311
|
+
};
|
|
312
|
+
}
|
|
252
313
|
case "personas_chat": {
|
|
253
314
|
const { persona, userMessage, product, conversationHistory, auth_token } = args;
|
|
254
315
|
const normalizedAuthToken = auth_token && auth_token !== "auto" && auth_token.trim() !== "" ? auth_token : void 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibekiln/cutline-mcp-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.1",
|
|
4
4
|
"description": "CLI and MCP servers for Cutline, including SlopBurn: a product quality engineering roguelike RPG for vibecoding workflows.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|