@vibekiln/cutline-mcp-cli 0.14.0 → 0.15.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.
@@ -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', '@vibekiln/cutline-mcp-cli@latest'],
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
- console.log(chalk.dim(' Testing bootstrap:'), chalk.cyan('npx -y @vibekiln/cutline-mcp-cli@latest setup'));
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-EWUELVO2.js";
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-EWUELVO2.js";
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-EWUELVO2.js";
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-EWUELVO2.js";
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-EWUELVO2.js";
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";
@@ -27,7 +27,7 @@ import {
27
27
  updatePremortem,
28
28
  validateAuth,
29
29
  validateRequestSize
30
- } from "./chunk-EWUELVO2.js";
30
+ } from "./chunk-FHWY2TYO.js";
31
31
 
32
32
  // ../mcp/dist/mcp/src/premortem-server.js
33
33
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
@@ -40,7 +40,7 @@ import {
40
40
  upsertSlopburnRun,
41
41
  validateAuth,
42
42
  validateRequestSize
43
- } from "./chunk-EWUELVO2.js";
43
+ } from "./chunk-FHWY2TYO.js";
44
44
 
45
45
  // ../mcp/dist/mcp/src/slopburn-server.js
46
46
  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-EWUELVO2.js";
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: ["auth_token"]
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", "auth_token"]
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", "auth_token"]
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", "auth_token"]
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.14.0",
3
+ "version": "0.15.0",
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",