@kylewadegrove/cutline-mcp-cli 0.6.1 → 0.7.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/dist/commands/init.js +49 -0
- package/dist/commands/setup.js +3 -1
- package/dist/commands/upgrade.js +3 -1
- package/dist/servers/chunk-DE7R7WKY.js +331 -0
- package/dist/servers/chunk-XKS3J74N.js +1066 -0
- package/dist/servers/cutline-server.js +54 -71
- package/dist/servers/{data-client-2IQIMRIS.js → data-client-7MEIYP5S.js} +41 -2
- package/dist/servers/exploration-server.js +6 -29
- package/dist/servers/integrations-server.js +4 -18
- package/dist/servers/output-server.js +8 -21
- package/dist/servers/premortem-server.js +131 -59
- package/dist/servers/tools-server.js +22 -26
- package/dist/utils/config-store.d.ts +1 -0
- package/package.json +1 -10
- package/dist/servers/chunk-7FHM2GD3.js +0 -5836
- package/dist/servers/chunk-JBJYSV4P.js +0 -139
- package/dist/servers/chunk-M37M2UA4.js +0 -10508
- package/dist/servers/chunk-NUBIEJTU.js +0 -398
- package/dist/servers/chunk-PQUAX5YW.js +0 -464
- package/dist/servers/pipeline-O5GJPNR4.js +0 -20
- package/dist/servers/premortem-handoff-XT4K3YDJ.js +0 -10
package/dist/commands/init.js
CHANGED
|
@@ -4,6 +4,7 @@ import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs';
|
|
|
4
4
|
import { resolve, join } from 'node:path';
|
|
5
5
|
import { getRefreshToken } from '../auth/keychain.js';
|
|
6
6
|
import { fetchFirebaseApiKey } from '../utils/config.js';
|
|
7
|
+
import { saveConfig, loadConfig } from '../utils/config-store.js';
|
|
7
8
|
const CUTLINE_CONFIG = '.cutline/config.json';
|
|
8
9
|
async function authenticate(options) {
|
|
9
10
|
const refreshToken = await getRefreshToken();
|
|
@@ -33,6 +34,8 @@ async function authenticate(options) {
|
|
|
33
34
|
tier: isPremium ? 'premium' : 'free',
|
|
34
35
|
email: payload.email,
|
|
35
36
|
uid: payload.user_id || payload.sub,
|
|
37
|
+
idToken,
|
|
38
|
+
baseUrl,
|
|
36
39
|
};
|
|
37
40
|
}
|
|
38
41
|
catch {
|
|
@@ -206,6 +209,42 @@ export async function initCommand(options) {
|
|
|
206
209
|
else {
|
|
207
210
|
console.log(chalk.yellow(' No .cutline/config.json found — generating generic rules.'));
|
|
208
211
|
}
|
|
212
|
+
// Generate API key for authenticated users (skips if one already exists)
|
|
213
|
+
let generatedApiKey = null;
|
|
214
|
+
if (auth?.idToken && auth.baseUrl) {
|
|
215
|
+
const existing = loadConfig();
|
|
216
|
+
if (existing.apiKey) {
|
|
217
|
+
console.log(chalk.dim(' API key: already configured'));
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
const keySpinner = ora('Generating API key...').start();
|
|
221
|
+
try {
|
|
222
|
+
const keyRes = await fetch(`${auth.baseUrl}/mcpDataProxy`, {
|
|
223
|
+
method: 'POST',
|
|
224
|
+
headers: {
|
|
225
|
+
'Content-Type': 'application/json',
|
|
226
|
+
Authorization: `Bearer ${auth.idToken}`,
|
|
227
|
+
},
|
|
228
|
+
body: JSON.stringify({ action: 'apiKey.create', params: { name: 'cursor-ide' } }),
|
|
229
|
+
});
|
|
230
|
+
if (keyRes.ok) {
|
|
231
|
+
const keyData = await keyRes.json();
|
|
232
|
+
generatedApiKey = keyData.key;
|
|
233
|
+
saveConfig({ apiKey: generatedApiKey });
|
|
234
|
+
keySpinner.succeed(chalk.green('API key generated and saved'));
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
const errBody = await keyRes.text().catch(() => '');
|
|
238
|
+
keySpinner.warn(chalk.yellow(`API key generation skipped (${keyRes.status})`));
|
|
239
|
+
if (errBody)
|
|
240
|
+
console.log(chalk.dim(` ${errBody.slice(0, 120)}`));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch (e) {
|
|
244
|
+
keySpinner.warn(chalk.yellow('API key generation skipped (network error)'));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
209
248
|
console.log();
|
|
210
249
|
const filesWritten = [];
|
|
211
250
|
// 1. Cursor rules
|
|
@@ -240,6 +279,16 @@ export async function initCommand(options) {
|
|
|
240
279
|
console.log(chalk.dim('\n Upgrade to Premium for product-specific constraint graphs and .cutline.md'));
|
|
241
280
|
console.log(chalk.dim(' →'), chalk.cyan('cutline-mcp upgrade'), chalk.dim('or https://thecutline.ai/upgrade'));
|
|
242
281
|
}
|
|
282
|
+
if (generatedApiKey) {
|
|
283
|
+
console.log();
|
|
284
|
+
console.log(chalk.bold(' API Key (shown once):'));
|
|
285
|
+
console.log(chalk.cyan(` ${generatedApiKey}`));
|
|
286
|
+
console.log();
|
|
287
|
+
console.log(chalk.dim(' Add to your Cursor MCP config for best performance:'));
|
|
288
|
+
console.log(chalk.dim(' "env": { "CUTLINE_API_KEY": "') + chalk.cyan(generatedApiKey) + chalk.dim('" }'));
|
|
289
|
+
console.log();
|
|
290
|
+
console.log(chalk.dim(' Or it will be used automatically from ~/.cutline-mcp/config.json'));
|
|
291
|
+
}
|
|
243
292
|
console.log();
|
|
244
293
|
console.log(chalk.bold(' Next step:'));
|
|
245
294
|
console.log(chalk.dim(' Run'), chalk.cyan('cutline-mcp setup'), chalk.dim('to get the MCP server config for your IDE.\n'));
|
package/dist/commands/setup.js
CHANGED
|
@@ -245,7 +245,9 @@ export async function setupCommand(options) {
|
|
|
245
245
|
}
|
|
246
246
|
const items = [
|
|
247
247
|
{ cmd: 'Run a deep dive on my product idea', desc: 'Pre-mortem analysis — risks, assumptions, experiments' },
|
|
248
|
-
{ cmd: '
|
|
248
|
+
{ cmd: 'Plan this feature with constraints from my product', desc: 'RGR plan — constraint-aware implementation roadmap' },
|
|
249
|
+
{ cmd: 'Run an audit over my code', desc: 'Quick security scan — safe for any codebase' },
|
|
250
|
+
{ cmd: 'Run a code audit for my product', desc: 'Full engineering audit + RGR remediation plan' },
|
|
249
251
|
{ cmd: 'Check constraints for src/api/upload.ts', desc: 'Get NFR boundaries for a specific file' },
|
|
250
252
|
{ cmd: 'Generate .cutline.md for my product', desc: 'Write the constraint routing engine' },
|
|
251
253
|
{ cmd: 'What does my persona think about X?', desc: 'AI persona feedback on features' },
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -88,7 +88,9 @@ export async function upgradeCommand(options) {
|
|
|
88
88
|
console.log(chalk.bold(' Then ask your AI agent:\n'));
|
|
89
89
|
const items = [
|
|
90
90
|
{ cmd: 'Run a deep dive on my product idea', desc: 'Pre-mortem analysis — risks, assumptions, experiments' },
|
|
91
|
-
{ cmd: '
|
|
91
|
+
{ cmd: 'Plan this feature with constraints from my product', desc: 'RGR plan — constraint-aware implementation roadmap' },
|
|
92
|
+
{ cmd: 'Run an audit over my code', desc: 'Quick security scan — safe for any codebase' },
|
|
93
|
+
{ cmd: 'Run a code audit for my product', desc: 'Full engineering audit + RGR remediation plan' },
|
|
92
94
|
{ cmd: 'Generate .cutline.md for my product', desc: 'Write the constraint routing engine' },
|
|
93
95
|
];
|
|
94
96
|
for (const item of items) {
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
// ../mcp/dist/mcp/src/schemas.js
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var PMJsonSchema = z.object({
|
|
4
|
+
project: z.object({
|
|
5
|
+
name: z.string(),
|
|
6
|
+
brief: z.string(),
|
|
7
|
+
constraints: z.object({
|
|
8
|
+
team: z.string().optional(),
|
|
9
|
+
budget_usd: z.number().optional(),
|
|
10
|
+
deadline_days: z.number().int().optional(),
|
|
11
|
+
must_ship_scope: z.string().optional()
|
|
12
|
+
}).optional(),
|
|
13
|
+
reference_classes: z.array(z.string()).optional().default([])
|
|
14
|
+
}),
|
|
15
|
+
personas: z.object({
|
|
16
|
+
user_personas: z.array(z.object({
|
|
17
|
+
name: z.string(),
|
|
18
|
+
role: z.string().optional(),
|
|
19
|
+
segment: z.string().optional(),
|
|
20
|
+
is_buyer: z.boolean().optional(),
|
|
21
|
+
description: z.string(),
|
|
22
|
+
motivations: z.array(z.string()).optional(),
|
|
23
|
+
skills: z.array(z.string()).optional(),
|
|
24
|
+
objections: z.array(z.string()).optional()
|
|
25
|
+
})).optional(),
|
|
26
|
+
buyer_personas: z.array(z.object({
|
|
27
|
+
name: z.string(),
|
|
28
|
+
role: z.string().optional(),
|
|
29
|
+
segment: z.string().optional(),
|
|
30
|
+
is_buyer: z.boolean().optional(),
|
|
31
|
+
description: z.string(),
|
|
32
|
+
motivations: z.array(z.string()).optional(),
|
|
33
|
+
skills: z.array(z.string()).optional(),
|
|
34
|
+
objections: z.array(z.string()).optional()
|
|
35
|
+
})).optional()
|
|
36
|
+
}).optional(),
|
|
37
|
+
outside_view: z.object({
|
|
38
|
+
base_rates: z.array(z.object({
|
|
39
|
+
statement: z.string(),
|
|
40
|
+
p50: z.number().optional(),
|
|
41
|
+
p90: z.number().optional(),
|
|
42
|
+
source_hint: z.string().optional()
|
|
43
|
+
})).optional(),
|
|
44
|
+
failed_analogs: z.array(z.string()).optional(),
|
|
45
|
+
success_analogs: z.array(z.string()).optional()
|
|
46
|
+
}).optional(),
|
|
47
|
+
pricing: z.object({
|
|
48
|
+
monthly: z.number().optional(),
|
|
49
|
+
annual: z.number().optional(),
|
|
50
|
+
tiers: z.array(z.object({
|
|
51
|
+
name: z.string(),
|
|
52
|
+
price_month_usd: z.number(),
|
|
53
|
+
features: z.array(z.string()).optional()
|
|
54
|
+
})).optional(),
|
|
55
|
+
freemium: z.object({
|
|
56
|
+
enabled: z.boolean(),
|
|
57
|
+
features: z.array(z.string()).optional()
|
|
58
|
+
}).optional(),
|
|
59
|
+
trialDays: z.number().optional(),
|
|
60
|
+
adTier: z.object({
|
|
61
|
+
enabled: z.boolean(),
|
|
62
|
+
notes: z.string().optional()
|
|
63
|
+
}).optional(),
|
|
64
|
+
strategy: z.string().optional()
|
|
65
|
+
}).optional(),
|
|
66
|
+
kill_criteria: z.array(z.object({
|
|
67
|
+
name: z.string(),
|
|
68
|
+
threshold: z.string(),
|
|
69
|
+
status: z.enum(["unknown", "pass", "fail"]).optional(),
|
|
70
|
+
evidence: z.string().optional()
|
|
71
|
+
})).optional(),
|
|
72
|
+
decision: z.object({
|
|
73
|
+
recommendation: z.enum(["No-Go", "Revise", "Go (guarded)"]),
|
|
74
|
+
rationale: z.string(),
|
|
75
|
+
what_would_change_my_mind: z.string().optional(),
|
|
76
|
+
market_feasibility: z.object({
|
|
77
|
+
score: z.enum(["strong", "moderate", "weak"]),
|
|
78
|
+
rationale: z.string(),
|
|
79
|
+
nfr_coverage_pct: z.number().optional()
|
|
80
|
+
}).optional(),
|
|
81
|
+
productionalization_feasibility: z.object({
|
|
82
|
+
score: z.enum(["strong", "moderate", "weak"]),
|
|
83
|
+
rationale: z.string(),
|
|
84
|
+
nfr_coverage_pct: z.number().optional()
|
|
85
|
+
}).optional(),
|
|
86
|
+
engineering_time_reduction: z.object({
|
|
87
|
+
unassisted_hours: z.number(),
|
|
88
|
+
assisted_hours: z.number(),
|
|
89
|
+
speedup_factor: z.number()
|
|
90
|
+
}).optional()
|
|
91
|
+
}).optional(),
|
|
92
|
+
confidence: z.object({
|
|
93
|
+
p50: z.number(),
|
|
94
|
+
p75: z.number().optional(),
|
|
95
|
+
p90: z.number()
|
|
96
|
+
}).optional(),
|
|
97
|
+
risks: z.array(z.object({
|
|
98
|
+
area: z.enum(["Demand", "Channel", "UnitEcon", "Ops", "Legal", "Competition", "Tech"]).optional(),
|
|
99
|
+
description: z.string(),
|
|
100
|
+
likelihood: z.enum(["Low", "Med", "High"]).optional(),
|
|
101
|
+
impact: z.enum(["Low", "Med", "High", "Severe"]).optional(),
|
|
102
|
+
mitigation: z.string().optional(),
|
|
103
|
+
owner: z.string().optional()
|
|
104
|
+
})).optional(),
|
|
105
|
+
assumptions: z.array(z.object({
|
|
106
|
+
statement: z.string(),
|
|
107
|
+
falsifiable: z.boolean(),
|
|
108
|
+
owner: z.string(),
|
|
109
|
+
due_by: z.string()
|
|
110
|
+
})).optional(),
|
|
111
|
+
experiments: z.array(z.object({
|
|
112
|
+
name: z.string(),
|
|
113
|
+
cost_usd: z.number(),
|
|
114
|
+
days: z.number().int(),
|
|
115
|
+
reduces_uncertainty_on: z.array(z.string()),
|
|
116
|
+
success_criterion: z.string()
|
|
117
|
+
})).optional(),
|
|
118
|
+
competitors: z.array(z.object({
|
|
119
|
+
name: z.string(),
|
|
120
|
+
notes: z.string().optional()
|
|
121
|
+
})).optional(),
|
|
122
|
+
market: z.object({
|
|
123
|
+
tam_usd: z.number().optional(),
|
|
124
|
+
sam_usd: z.number().optional(),
|
|
125
|
+
som_3yr_usd: z.number().optional(),
|
|
126
|
+
method: z.string().optional(),
|
|
127
|
+
notes: z.string().optional(),
|
|
128
|
+
tam_rationale: z.array(z.string()).optional(),
|
|
129
|
+
sam_rationale: z.array(z.string()).optional(),
|
|
130
|
+
som_rationale: z.array(z.string()).optional(),
|
|
131
|
+
growth_cagr: z.number().optional(),
|
|
132
|
+
geo_scope: z.string().optional(),
|
|
133
|
+
segments: z.array(z.string()).optional(),
|
|
134
|
+
pricing_model: z.string().optional(),
|
|
135
|
+
arpa_usd: z.number().optional(),
|
|
136
|
+
adoption_notes: z.string().optional(),
|
|
137
|
+
icp: z.array(z.string()).optional(),
|
|
138
|
+
ease_of_spend: z.enum(["Low", "Med", "High"]).optional(),
|
|
139
|
+
ease_of_reach: z.enum(["Low", "Med", "High"]).optional(),
|
|
140
|
+
how_to_reach: z.array(z.string()).optional(),
|
|
141
|
+
channels: z.array(z.string()).optional(),
|
|
142
|
+
decision_makers: z.array(z.string()).optional(),
|
|
143
|
+
adoption_ramp: z.array(z.object({
|
|
144
|
+
month: z.number().int(),
|
|
145
|
+
adoption_pct: z.number().optional(),
|
|
146
|
+
revenue_usd: z.number().optional(),
|
|
147
|
+
notes: z.string().optional()
|
|
148
|
+
})).optional(),
|
|
149
|
+
sources: z.array(z.object({
|
|
150
|
+
title: z.string(),
|
|
151
|
+
url: z.string().optional(),
|
|
152
|
+
as_of: z.string().optional()
|
|
153
|
+
})).optional(),
|
|
154
|
+
confidence: z.object({
|
|
155
|
+
p50: z.number().optional(),
|
|
156
|
+
p90: z.number().optional()
|
|
157
|
+
}).optional()
|
|
158
|
+
}).optional(),
|
|
159
|
+
icp: z.object({
|
|
160
|
+
primary_icp: z.object({
|
|
161
|
+
title: z.string(),
|
|
162
|
+
description: z.string(),
|
|
163
|
+
demographics: z.object({
|
|
164
|
+
company_size: z.string(),
|
|
165
|
+
industry: z.string(),
|
|
166
|
+
geography: z.string(),
|
|
167
|
+
budget_range: z.string(),
|
|
168
|
+
job_titles: z.array(z.string()).optional(),
|
|
169
|
+
tech_stack: z.array(z.string()).optional()
|
|
170
|
+
}),
|
|
171
|
+
psychographics: z.object({
|
|
172
|
+
pain_points: z.array(z.string()),
|
|
173
|
+
goals: z.array(z.string()),
|
|
174
|
+
values: z.array(z.string()),
|
|
175
|
+
frustrations: z.array(z.string()).optional()
|
|
176
|
+
}),
|
|
177
|
+
buying_behavior: z.object({
|
|
178
|
+
decision_makers: z.array(z.string()),
|
|
179
|
+
buying_triggers: z.array(z.string()),
|
|
180
|
+
objections: z.array(z.string()),
|
|
181
|
+
sales_cycle_days: z.number().optional(),
|
|
182
|
+
preferred_channels: z.array(z.string()).optional()
|
|
183
|
+
}),
|
|
184
|
+
fit_score: z.number(),
|
|
185
|
+
rationale: z.string()
|
|
186
|
+
}),
|
|
187
|
+
secondary_icps: z.array(z.object({
|
|
188
|
+
title: z.string(),
|
|
189
|
+
description: z.string(),
|
|
190
|
+
key_differences: z.array(z.string()),
|
|
191
|
+
fit_score: z.number()
|
|
192
|
+
})).optional(),
|
|
193
|
+
anti_personas: z.array(z.object({
|
|
194
|
+
title: z.string(),
|
|
195
|
+
description: z.string(),
|
|
196
|
+
why_poor_fit: z.array(z.string())
|
|
197
|
+
})),
|
|
198
|
+
consulting_fit: z.object({
|
|
199
|
+
ideal_client_profile: z.string(),
|
|
200
|
+
engagement_signals: z.array(z.string()),
|
|
201
|
+
disqualifiers: z.array(z.string()),
|
|
202
|
+
stakeholder_map: z.array(z.string()).optional()
|
|
203
|
+
}).optional(),
|
|
204
|
+
sources: z.array(z.object({
|
|
205
|
+
title: z.string(),
|
|
206
|
+
url: z.string().optional(),
|
|
207
|
+
as_of: z.string().optional()
|
|
208
|
+
})).optional()
|
|
209
|
+
}).optional(),
|
|
210
|
+
metrics: z.object({
|
|
211
|
+
north_star: z.string().optional(),
|
|
212
|
+
leading: z.array(z.string()).optional(),
|
|
213
|
+
unit_econ: z.object({
|
|
214
|
+
target_cac: z.number().optional(),
|
|
215
|
+
target_gpm: z.number().optional(),
|
|
216
|
+
payback_months: z.number().optional()
|
|
217
|
+
}).optional()
|
|
218
|
+
}).optional(),
|
|
219
|
+
plan: z.object({
|
|
220
|
+
tasks: z.array(z.object({
|
|
221
|
+
id: z.string().optional(),
|
|
222
|
+
name: z.string(),
|
|
223
|
+
owner: z.enum(["Eng", "Design", "PM", "Compliance"]).optional(),
|
|
224
|
+
days: z.number().int(),
|
|
225
|
+
deps: z.array(z.string()).optional()
|
|
226
|
+
})).optional()
|
|
227
|
+
}).optional(),
|
|
228
|
+
notes: z.object({
|
|
229
|
+
pre_mortem: z.string().optional(),
|
|
230
|
+
evidence_gaps: z.array(z.string()).optional()
|
|
231
|
+
}).optional(),
|
|
232
|
+
role_summaries: z.array(z.object({
|
|
233
|
+
role: z.string(),
|
|
234
|
+
summary: z.string()
|
|
235
|
+
})).optional()
|
|
236
|
+
}).passthrough();
|
|
237
|
+
var RunInputSchema = z.object({
|
|
238
|
+
mode: z.enum(["product", "consulting"]).optional().default("product"),
|
|
239
|
+
project: z.object({
|
|
240
|
+
name: z.string(),
|
|
241
|
+
brief: z.string(),
|
|
242
|
+
constraints: z.object({
|
|
243
|
+
team: z.string().optional(),
|
|
244
|
+
budget_usd: z.number().optional(),
|
|
245
|
+
deadline_days: z.number().int().optional(),
|
|
246
|
+
must_ship_scope: z.string().optional()
|
|
247
|
+
}).optional(),
|
|
248
|
+
reference_classes: z.array(z.string()).optional().default([]),
|
|
249
|
+
tech_stack: z.array(z.string()).optional()
|
|
250
|
+
}),
|
|
251
|
+
client: z.object({
|
|
252
|
+
name: z.string().optional(),
|
|
253
|
+
industry: z.string().optional(),
|
|
254
|
+
size: z.enum(["startup", "smb", "enterprise"]).optional(),
|
|
255
|
+
stakeholders: z.array(z.object({
|
|
256
|
+
name: z.string(),
|
|
257
|
+
role: z.string().optional(),
|
|
258
|
+
influence: z.enum(["decision_maker", "influencer", "blocker", "champion"]).optional()
|
|
259
|
+
})).optional()
|
|
260
|
+
}).optional(),
|
|
261
|
+
kill_criteria: z.array(z.object({ name: z.string(), threshold: z.string() })).optional(),
|
|
262
|
+
pessimism: z.number().min(0).max(1).optional(),
|
|
263
|
+
organizationId: z.string().optional(),
|
|
264
|
+
productId: z.string().optional(),
|
|
265
|
+
seed_personas: z.object({
|
|
266
|
+
user_personas: z.array(z.object({
|
|
267
|
+
name: z.string(),
|
|
268
|
+
role: z.string().optional(),
|
|
269
|
+
segment: z.string().optional(),
|
|
270
|
+
is_buyer: z.boolean().optional(),
|
|
271
|
+
description: z.string(),
|
|
272
|
+
motivations: z.array(z.string()).optional(),
|
|
273
|
+
skills: z.array(z.string()).optional(),
|
|
274
|
+
objections: z.array(z.string()).optional()
|
|
275
|
+
})).optional(),
|
|
276
|
+
buyer_personas: z.array(z.object({
|
|
277
|
+
name: z.string(),
|
|
278
|
+
role: z.string().optional(),
|
|
279
|
+
segment: z.string().optional(),
|
|
280
|
+
is_buyer: z.boolean().optional(),
|
|
281
|
+
description: z.string(),
|
|
282
|
+
motivations: z.array(z.string()).optional(),
|
|
283
|
+
skills: z.array(z.string()).optional(),
|
|
284
|
+
objections: z.array(z.string()).optional()
|
|
285
|
+
})).optional()
|
|
286
|
+
}).optional(),
|
|
287
|
+
conversational_artifacts: z.object({
|
|
288
|
+
risks: z.array(z.object({
|
|
289
|
+
title: z.string(),
|
|
290
|
+
description: z.string().optional(),
|
|
291
|
+
category: z.string().optional(),
|
|
292
|
+
severity: z.enum(["low", "medium", "high", "critical"]).optional(),
|
|
293
|
+
likelihood: z.number().min(0).max(1).optional(),
|
|
294
|
+
impact: z.number().min(0).max(1).optional()
|
|
295
|
+
})).optional(),
|
|
296
|
+
assumptions: z.array(z.object({
|
|
297
|
+
statement: z.string(),
|
|
298
|
+
category: z.string().optional(),
|
|
299
|
+
confidence: z.number().min(0).max(1).optional(),
|
|
300
|
+
importance: z.number().min(0).max(1).optional()
|
|
301
|
+
})).optional(),
|
|
302
|
+
market_context: z.string().optional(),
|
|
303
|
+
competitors: z.array(z.object({
|
|
304
|
+
name: z.string(),
|
|
305
|
+
description: z.string().optional(),
|
|
306
|
+
threat_level: z.enum(["low", "medium", "high"]).optional()
|
|
307
|
+
})).optional(),
|
|
308
|
+
conversation_summary: z.string().optional(),
|
|
309
|
+
target_users: z.string().optional()
|
|
310
|
+
}).optional(),
|
|
311
|
+
code_context: z.object({
|
|
312
|
+
files_audited: z.array(z.string()).optional(),
|
|
313
|
+
ecosystem: z.object({
|
|
314
|
+
languages: z.array(z.string()).optional(),
|
|
315
|
+
frameworks: z.array(z.string()).optional(),
|
|
316
|
+
orms: z.array(z.string()).optional()
|
|
317
|
+
}).optional(),
|
|
318
|
+
binding_health: z.object({
|
|
319
|
+
healthy: z.number().optional(),
|
|
320
|
+
total: z.number().optional(),
|
|
321
|
+
coverage_pct: z.number().optional()
|
|
322
|
+
}).optional(),
|
|
323
|
+
sensitive_data_count: z.number().optional(),
|
|
324
|
+
security_gaps: z.array(z.string()).optional()
|
|
325
|
+
}).optional()
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
export {
|
|
329
|
+
PMJsonSchema,
|
|
330
|
+
RunInputSchema
|
|
331
|
+
};
|