@planu/cli 1.0.7 → 1.0.9
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/engine/challenge-prioritizer.d.ts +17 -0
- package/dist/engine/challenge-prioritizer.d.ts.map +1 -0
- package/dist/engine/challenge-prioritizer.js +77 -0
- package/dist/engine/challenge-prioritizer.js.map +1 -0
- package/dist/engine/lifecycle-hints.d.ts +12 -0
- package/dist/engine/lifecycle-hints.d.ts.map +1 -0
- package/dist/engine/lifecycle-hints.js +79 -0
- package/dist/engine/lifecycle-hints.js.map +1 -0
- package/dist/engine/pdf/browser-finder.d.ts.map +1 -1
- package/dist/engine/pdf/browser-finder.js +61 -2
- package/dist/engine/pdf/browser-finder.js.map +1 -1
- package/dist/engine/pdf/html-to-pdf.d.ts.map +1 -1
- package/dist/engine/pdf/html-to-pdf.js +33 -8
- package/dist/engine/pdf/html-to-pdf.js.map +1 -1
- package/dist/tools/challenge-spec.d.ts.map +1 -1
- package/dist/tools/challenge-spec.js +13 -1
- package/dist/tools/challenge-spec.js.map +1 -1
- package/dist/tools/clarify-requirements/multiple-choice.d.ts +30 -0
- package/dist/tools/clarify-requirements/multiple-choice.d.ts.map +1 -0
- package/dist/tools/clarify-requirements/multiple-choice.js +292 -0
- package/dist/tools/clarify-requirements/multiple-choice.js.map +1 -0
- package/dist/tools/clarify-requirements.d.ts.map +1 -1
- package/dist/tools/clarify-requirements.js +43 -4
- package/dist/tools/clarify-requirements.js.map +1 -1
- package/dist/tools/export-pdf.d.ts.map +1 -1
- package/dist/tools/export-pdf.js +2 -8
- package/dist/tools/export-pdf.js.map +1 -1
- package/dist/tools/resolve-project-id.d.ts +46 -2
- package/dist/tools/resolve-project-id.d.ts.map +1 -1
- package/dist/tools/resolve-project-id.js +78 -2
- package/dist/tools/resolve-project-id.js.map +1 -1
- package/dist/tools/resolve-project-path.d.ts +21 -0
- package/dist/tools/resolve-project-path.d.ts.map +1 -0
- package/dist/tools/resolve-project-path.js +117 -0
- package/dist/tools/resolve-project-path.js.map +1 -0
- package/dist/tools/update-status/response-builder.d.ts.map +1 -1
- package/dist/tools/update-status/response-builder.js +20 -1
- package/dist/tools/update-status/response-builder.js.map +1 -1
- package/dist/types/analysis.d.ts +7 -0
- package/dist/types/analysis.d.ts.map +1 -1
- package/dist/types/common/primitives.d.ts +14 -0
- package/dist/types/common/primitives.d.ts.map +1 -1
- package/dist/types/cross-repo-search.d.ts +29 -0
- package/dist/types/cross-repo-search.d.ts.map +1 -1
- package/dist/types/spec/clarification.d.ts +8 -0
- package/dist/types/spec/clarification.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
// tools/clarify-requirements/multiple-choice.ts — SPEC-337
|
|
2
|
+
// Structured multiple-choice options for clarify_requirements interview mode.
|
|
3
|
+
// Provides: per-question options[], stack detection, suggestedDescription builder.
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
const OPTIONS_CATALOG = {
|
|
7
|
+
stack_frontend: [
|
|
8
|
+
'Next.js',
|
|
9
|
+
'Remix',
|
|
10
|
+
'Nuxt',
|
|
11
|
+
'SvelteKit',
|
|
12
|
+
'Astro',
|
|
13
|
+
'Vite + React',
|
|
14
|
+
'Angular',
|
|
15
|
+
'Other: ___',
|
|
16
|
+
],
|
|
17
|
+
stack_backend: [
|
|
18
|
+
'Express',
|
|
19
|
+
'Fastify',
|
|
20
|
+
'NestJS',
|
|
21
|
+
'Hono',
|
|
22
|
+
'FastAPI',
|
|
23
|
+
'Django',
|
|
24
|
+
'Spring Boot',
|
|
25
|
+
'Other: ___',
|
|
26
|
+
],
|
|
27
|
+
stack_database: [
|
|
28
|
+
'PostgreSQL',
|
|
29
|
+
'MySQL',
|
|
30
|
+
'SQLite',
|
|
31
|
+
'MongoDB',
|
|
32
|
+
'Redis',
|
|
33
|
+
'Supabase',
|
|
34
|
+
'PlanetScale',
|
|
35
|
+
'Other: ___',
|
|
36
|
+
],
|
|
37
|
+
stack_language: ['TypeScript', 'JavaScript', 'Python', 'Go', 'Java', 'Rust', 'Other: ___'],
|
|
38
|
+
auth_method: [
|
|
39
|
+
'Email + password',
|
|
40
|
+
'Google OAuth',
|
|
41
|
+
'GitHub OAuth',
|
|
42
|
+
'Magic link',
|
|
43
|
+
'JWT (custom)',
|
|
44
|
+
'Session-based',
|
|
45
|
+
'API key',
|
|
46
|
+
'Other: ___',
|
|
47
|
+
],
|
|
48
|
+
scope_type: ['New feature', 'Improvement to existing', 'Bug fix', 'Refactor', 'Other: ___'],
|
|
49
|
+
user_type: ['End user', 'Admin', 'Developer / internal', 'All users', 'Other: ___'],
|
|
50
|
+
mvp_scope: [
|
|
51
|
+
'Core happy path only',
|
|
52
|
+
'Happy path + error handling',
|
|
53
|
+
'Full feature with edge cases',
|
|
54
|
+
'MVP first, iterate later',
|
|
55
|
+
'Other: ___',
|
|
56
|
+
],
|
|
57
|
+
performance_target: [
|
|
58
|
+
'< 100ms (real-time)',
|
|
59
|
+
'< 500ms (interactive)',
|
|
60
|
+
'< 2s (acceptable)',
|
|
61
|
+
'No strict SLA',
|
|
62
|
+
'Other: ___',
|
|
63
|
+
],
|
|
64
|
+
ui_mockup: [
|
|
65
|
+
'Yes, Figma mockup available',
|
|
66
|
+
'Rough sketch only',
|
|
67
|
+
'No mockup — describe in text',
|
|
68
|
+
'Other: ___',
|
|
69
|
+
],
|
|
70
|
+
login_method: [
|
|
71
|
+
'Email/password',
|
|
72
|
+
'Google',
|
|
73
|
+
'Apple',
|
|
74
|
+
'Magic link',
|
|
75
|
+
'GitHub',
|
|
76
|
+
'SSO / SAML',
|
|
77
|
+
'Other: ___',
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Detect the project stack by reading package.json and/or requirements.txt
|
|
82
|
+
* from the given project path.
|
|
83
|
+
*/
|
|
84
|
+
export async function detectStack(projectPath) {
|
|
85
|
+
const result = {
|
|
86
|
+
framework: null,
|
|
87
|
+
language: null,
|
|
88
|
+
database: null,
|
|
89
|
+
detectedLibs: [],
|
|
90
|
+
};
|
|
91
|
+
try {
|
|
92
|
+
const pkgRaw = await readFile(join(projectPath, 'package.json'), 'utf-8');
|
|
93
|
+
const pkg = JSON.parse(pkgRaw);
|
|
94
|
+
const allDeps = {
|
|
95
|
+
...(pkg.dependencies ?? {}),
|
|
96
|
+
...(pkg.devDependencies ?? {}),
|
|
97
|
+
};
|
|
98
|
+
const libs = Object.keys(allDeps);
|
|
99
|
+
result.detectedLibs = libs;
|
|
100
|
+
// Framework detection
|
|
101
|
+
if (libs.includes('next')) {
|
|
102
|
+
result.framework = 'Next.js';
|
|
103
|
+
}
|
|
104
|
+
else if (libs.includes('@remix-run/react') || libs.includes('@remix-run/node')) {
|
|
105
|
+
result.framework = 'Remix';
|
|
106
|
+
}
|
|
107
|
+
else if (libs.includes('nuxt')) {
|
|
108
|
+
result.framework = 'Nuxt';
|
|
109
|
+
}
|
|
110
|
+
else if (libs.includes('@sveltejs/kit')) {
|
|
111
|
+
result.framework = 'SvelteKit';
|
|
112
|
+
}
|
|
113
|
+
else if (libs.includes('astro')) {
|
|
114
|
+
result.framework = 'Astro';
|
|
115
|
+
}
|
|
116
|
+
else if (libs.includes('fastify')) {
|
|
117
|
+
result.framework = 'Fastify';
|
|
118
|
+
}
|
|
119
|
+
else if (libs.includes('@nestjs/core')) {
|
|
120
|
+
result.framework = 'NestJS';
|
|
121
|
+
}
|
|
122
|
+
else if (libs.includes('express')) {
|
|
123
|
+
result.framework = 'Express';
|
|
124
|
+
}
|
|
125
|
+
else if (libs.includes('hono')) {
|
|
126
|
+
result.framework = 'Hono';
|
|
127
|
+
}
|
|
128
|
+
// Language (TypeScript presence)
|
|
129
|
+
if (libs.includes('typescript') || libs.includes('ts-node') || libs.includes('tsx')) {
|
|
130
|
+
result.language = 'TypeScript';
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
result.language = 'JavaScript';
|
|
134
|
+
}
|
|
135
|
+
// Database detection
|
|
136
|
+
if (libs.includes('pg') || libs.includes('postgres')) {
|
|
137
|
+
result.database = 'PostgreSQL';
|
|
138
|
+
}
|
|
139
|
+
else if (libs.includes('mysql2') || libs.includes('mysql')) {
|
|
140
|
+
result.database = 'MySQL';
|
|
141
|
+
}
|
|
142
|
+
else if (libs.includes('better-sqlite3') || libs.includes('sqlite3')) {
|
|
143
|
+
result.database = 'SQLite';
|
|
144
|
+
}
|
|
145
|
+
else if (libs.includes('mongoose') || libs.includes('mongodb')) {
|
|
146
|
+
result.database = 'MongoDB';
|
|
147
|
+
}
|
|
148
|
+
else if (libs.includes('@supabase/supabase-js')) {
|
|
149
|
+
result.database = 'Supabase';
|
|
150
|
+
}
|
|
151
|
+
else if (libs.includes('ioredis') || libs.includes('redis')) {
|
|
152
|
+
result.database = 'Redis';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// No package.json — try requirements.txt for Python
|
|
157
|
+
try {
|
|
158
|
+
const reqRaw = await readFile(join(projectPath, 'requirements.txt'), 'utf-8');
|
|
159
|
+
const lines = reqRaw
|
|
160
|
+
.split('\n')
|
|
161
|
+
.map((l) => (l.split('=')[0] ?? l).split('>')[0]?.split('<')[0]?.trim().toLowerCase() ?? '');
|
|
162
|
+
result.detectedLibs = lines.filter(Boolean);
|
|
163
|
+
if (lines.includes('django') || lines.includes('django-rest-framework')) {
|
|
164
|
+
result.framework = 'Django';
|
|
165
|
+
result.language = 'Python';
|
|
166
|
+
}
|
|
167
|
+
else if (lines.includes('fastapi')) {
|
|
168
|
+
result.framework = 'FastAPI';
|
|
169
|
+
result.language = 'Python';
|
|
170
|
+
}
|
|
171
|
+
else if (lines.includes('flask')) {
|
|
172
|
+
result.framework = 'Flask';
|
|
173
|
+
result.language = 'Python';
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
result.language = 'Python';
|
|
177
|
+
}
|
|
178
|
+
if (lines.includes('psycopg2') || lines.includes('psycopg2-binary')) {
|
|
179
|
+
result.database = 'PostgreSQL';
|
|
180
|
+
}
|
|
181
|
+
else if (lines.includes('pymysql') || lines.includes('mysql-connector-python')) {
|
|
182
|
+
result.database = 'MySQL';
|
|
183
|
+
}
|
|
184
|
+
else if (lines.includes('motor') || lines.includes('pymongo')) {
|
|
185
|
+
result.database = 'MongoDB';
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// No manifest files found — detection yields nulls
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Returns true if the question should be skipped because the stack already
|
|
196
|
+
* provides a definitive answer.
|
|
197
|
+
*/
|
|
198
|
+
export function shouldSkipQuestion(question, stack) {
|
|
199
|
+
const lower = question.question.toLowerCase();
|
|
200
|
+
if ((lower.includes('stack') || lower.includes('framework') || lower.includes('language')) &&
|
|
201
|
+
(stack.framework !== null || stack.language !== null)) {
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
if (lower.includes('database') && stack.database !== null) {
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Resolves option list from a catalog key.
|
|
211
|
+
*/
|
|
212
|
+
function resolveOptions(key) {
|
|
213
|
+
return OPTIONS_CATALOG[key];
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Attaches structured `options[]` to a question based on its content.
|
|
217
|
+
* Each question gets 3-8 concrete choices + 'Other: ___' fallback.
|
|
218
|
+
*/
|
|
219
|
+
export function attachOptions(question) {
|
|
220
|
+
const lower = question.question.toLowerCase();
|
|
221
|
+
let options;
|
|
222
|
+
if (lower.includes('login') || lower.includes('sign in') || lower.includes('sign up')) {
|
|
223
|
+
options = resolveOptions('login_method');
|
|
224
|
+
}
|
|
225
|
+
else if (lower.includes('auth')) {
|
|
226
|
+
options = resolveOptions('auth_method');
|
|
227
|
+
}
|
|
228
|
+
else if (lower.includes('frontend') || lower.includes('ui framework')) {
|
|
229
|
+
options = resolveOptions('stack_frontend');
|
|
230
|
+
}
|
|
231
|
+
else if (lower.includes('backend') || lower.includes('server framework')) {
|
|
232
|
+
options = resolveOptions('stack_backend');
|
|
233
|
+
}
|
|
234
|
+
else if (lower.includes('database') || lower.includes('db')) {
|
|
235
|
+
options = resolveOptions('stack_database');
|
|
236
|
+
}
|
|
237
|
+
else if (lower.includes('stack') || lower.includes('framework') || lower.includes('language')) {
|
|
238
|
+
options = resolveOptions('stack_language');
|
|
239
|
+
}
|
|
240
|
+
else if (lower.includes('new feature') ||
|
|
241
|
+
lower.includes('improvement') ||
|
|
242
|
+
lower.includes('feature or')) {
|
|
243
|
+
options = resolveOptions('scope_type');
|
|
244
|
+
}
|
|
245
|
+
else if (lower.includes('user') &&
|
|
246
|
+
(lower.includes('who') || lower.includes('primary') || lower.includes('persona'))) {
|
|
247
|
+
options = resolveOptions('user_type');
|
|
248
|
+
}
|
|
249
|
+
else if (lower.includes('must-have') ||
|
|
250
|
+
lower.includes('minimum viable') ||
|
|
251
|
+
lower.includes('mvp') ||
|
|
252
|
+
lower.includes('first version')) {
|
|
253
|
+
options = resolveOptions('mvp_scope');
|
|
254
|
+
}
|
|
255
|
+
else if (lower.includes('performance') ||
|
|
256
|
+
lower.includes('response time') ||
|
|
257
|
+
lower.includes('latency')) {
|
|
258
|
+
options = resolveOptions('performance_target');
|
|
259
|
+
}
|
|
260
|
+
else if (lower.includes('mockup') ||
|
|
261
|
+
lower.includes('design') ||
|
|
262
|
+
lower.includes('reference design')) {
|
|
263
|
+
options = resolveOptions('ui_mockup');
|
|
264
|
+
}
|
|
265
|
+
else if (lower.includes('scope') && lower.includes('done')) {
|
|
266
|
+
options = resolveOptions('mvp_scope');
|
|
267
|
+
}
|
|
268
|
+
if (options === undefined) {
|
|
269
|
+
return question;
|
|
270
|
+
}
|
|
271
|
+
return { ...question, options };
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Builds a `suggestedDescription` string from accumulated answers.
|
|
275
|
+
* The returned string is suitable for passing directly to create_spec.
|
|
276
|
+
*/
|
|
277
|
+
export function buildSuggestedDescription(topic, answers, questions) {
|
|
278
|
+
const parts = [`Feature: ${topic}.`];
|
|
279
|
+
for (const q of questions) {
|
|
280
|
+
const answer = answers[q.id];
|
|
281
|
+
if (answer === undefined || answer.trim() === '') {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const trimmedAnswer = answer.trim();
|
|
285
|
+
const shortQuestion = q.question
|
|
286
|
+
.replace(/^(What|Who|Is|Are|Does|Do|How|Which)\s+/i, '')
|
|
287
|
+
.replace(/\?$/, '');
|
|
288
|
+
parts.push(`${shortQuestion}: ${trimmedAnswer}.`);
|
|
289
|
+
}
|
|
290
|
+
return parts.join(' ');
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=multiple-choice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiple-choice.js","sourceRoot":"","sources":["../../../src/tools/clarify-requirements/multiple-choice.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,8EAA8E;AAC9E,mFAAmF;AAEnF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA2BjC,MAAM,eAAe,GAAmB;IACtC,cAAc,EAAE;QACd,SAAS;QACT,OAAO;QACP,MAAM;QACN,WAAW;QACX,OAAO;QACP,cAAc;QACd,SAAS;QACT,YAAY;KACb;IACD,aAAa,EAAE;QACb,SAAS;QACT,SAAS;QACT,QAAQ;QACR,MAAM;QACN,SAAS;QACT,QAAQ;QACR,aAAa;QACb,YAAY;KACb;IACD,cAAc,EAAE;QACd,YAAY;QACZ,OAAO;QACP,QAAQ;QACR,SAAS;QACT,OAAO;QACP,UAAU;QACV,aAAa;QACb,YAAY;KACb;IACD,cAAc,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC;IAC1F,WAAW,EAAE;QACX,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,YAAY;QACZ,cAAc;QACd,eAAe;QACf,SAAS;QACT,YAAY;KACb;IACD,UAAU,EAAE,CAAC,aAAa,EAAE,yBAAyB,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC;IAC3F,SAAS,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,YAAY,CAAC;IACnF,SAAS,EAAE;QACT,sBAAsB;QACtB,6BAA6B;QAC7B,8BAA8B;QAC9B,0BAA0B;QAC1B,YAAY;KACb;IACD,kBAAkB,EAAE;QAClB,qBAAqB;QACrB,uBAAuB;QACvB,mBAAmB;QACnB,eAAe;QACf,YAAY;KACb;IACD,SAAS,EAAE;QACT,6BAA6B;QAC7B,mBAAmB;QACnB,8BAA8B;QAC9B,YAAY;KACb;IACD,YAAY,EAAE;QACZ,gBAAgB;QAChB,QAAQ;QACR,OAAO;QACP,YAAY;QACZ,QAAQ;QACR,YAAY;QACZ,YAAY;KACb;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB;IACnD,MAAM,MAAM,GAAyB;QACnC,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,EAAE;KACjB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAG5B,CAAC;QACF,MAAM,OAAO,GAA2B;YACtC,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;YAC3B,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;SAC/B,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;QAE3B,sBAAsB;QACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACjF,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;QAC5B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC;QACjC,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC9B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;QAC5B,CAAC;QAED,iCAAiC;QACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpF,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;QACjC,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;QACjC,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC5B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACjE,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC9B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC;QAC/B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;QACpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC,CAAC;YAC9E,MAAM,KAAK,GAAG,MAAM;iBACjB,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CACvF,CAAC;YACJ,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE5C,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACxE,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;gBAC5B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC7B,CAAC;iBAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC7B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC7B,CAAC;iBAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;gBAC3B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC7B,CAAC;YAED,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACpE,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;YACjC,CAAC;iBAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBACjF,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC;YAC5B,CAAC;iBAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChE,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAA+B,EAC/B,KAA2B;IAE3B,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC9C,IACE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACtF,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,EACrD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAyB;IAC/C,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAA+B;IAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAE9C,IAAI,OAA6B,CAAC;IAElC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACtF,OAAO,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACxE,OAAO,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC3E,OAAO,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,OAAO,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAChG,OAAO,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC7C,CAAC;SAAM,IACL,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC7B,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC7B,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC5B,CAAC;QACD,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;SAAM,IACL,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACtB,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EACjF,CAAC;QACD,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;SAAM,IACL,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAChC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QACrB,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAC/B,CAAC;QACD,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;SAAM,IACL,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC7B,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC/B,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EACzB,CAAC;QACD,OAAO,GAAG,cAAc,CAAC,oBAAoB,CAAC,CAAC;IACjD,CAAC;SAAM,IACL,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAClC,CAAC;QACD,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,OAA+B,EAC/B,SAAkC;IAElC,MAAM,KAAK,GAAa,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC;IAE/C,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACjD,SAAS;QACX,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ;aAC7B,OAAO,CAAC,0CAA0C,EAAE,EAAE,CAAC;aACvD,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,KAAK,aAAa,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clarify-requirements.d.ts","sourceRoot":"","sources":["../../src/tools/clarify-requirements.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,wBAAwB,EAGxB,UAAU,EACX,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"clarify-requirements.d.ts","sourceRoot":"","sources":["../../src/tools/clarify-requirements.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,wBAAwB,EAGxB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAwG3B,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,UAAU,CAAC,CA4HrB"}
|
|
@@ -3,6 +3,7 @@ import { knowledgeStore } from '../storage/index.js';
|
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
4
|
import { isShortTopic, generateMetaQuestions, detectContradictions, buildSuggestedAnswers, } from './clarify-requirements/questions.js';
|
|
5
5
|
import { generateQuestions } from './clarify-requirements/questions-context.js';
|
|
6
|
+
import { detectStack, shouldSkipQuestion, attachOptions, buildSuggestedDescription, } from './clarify-requirements/multiple-choice.js';
|
|
6
7
|
/** Resume an existing clarification session with new answers. */
|
|
7
8
|
async function handleResumeSession(projectId, sessionId, newAnswers, knowledge) {
|
|
8
9
|
const existing = await knowledgeStore.getClarification(projectId, sessionId).catch(() => null);
|
|
@@ -32,6 +33,9 @@ async function handleResumeSession(projectId, sessionId, newAnswers, knowledge)
|
|
|
32
33
|
...q,
|
|
33
34
|
suggestedAnswers: q.suggestedAnswers ?? buildSuggestedAnswers(q, knowledge),
|
|
34
35
|
}));
|
|
36
|
+
const suggestedDescription = specReady
|
|
37
|
+
? buildSuggestedDescription(existing.topic, mergedAnswers, enriched)
|
|
38
|
+
: undefined;
|
|
35
39
|
const updated = {
|
|
36
40
|
...existing,
|
|
37
41
|
questions: enriched,
|
|
@@ -39,11 +43,14 @@ async function handleResumeSession(projectId, sessionId, newAnswers, knowledge)
|
|
|
39
43
|
isComplete: specReady,
|
|
40
44
|
contradictions: contradictions.length > 0 ? contradictions : undefined,
|
|
41
45
|
specReady,
|
|
46
|
+
interviewMode: 'multiple-choice',
|
|
47
|
+
...(suggestedDescription !== undefined ? { suggestedDescription } : {}),
|
|
42
48
|
};
|
|
43
49
|
await knowledgeStore.addClarification(projectId, updated);
|
|
44
50
|
const result = {
|
|
45
51
|
sessionId: existing.id,
|
|
46
52
|
topic: existing.topic,
|
|
53
|
+
interviewMode: 'multiple-choice',
|
|
47
54
|
questionsCount: existing.questions.length,
|
|
48
55
|
questions: enriched.map((q) => ({
|
|
49
56
|
id: q.id,
|
|
@@ -51,9 +58,12 @@ async function handleResumeSession(projectId, sessionId, newAnswers, knowledge)
|
|
|
51
58
|
category: q.category,
|
|
52
59
|
importance: q.importance,
|
|
53
60
|
suggestedAnswers: q.suggestedAnswers,
|
|
61
|
+
options: q.options,
|
|
62
|
+
skipped: q.skipped,
|
|
54
63
|
answered: mergedAnswers[q.id] !== undefined,
|
|
55
64
|
})),
|
|
56
65
|
specReady,
|
|
66
|
+
...(suggestedDescription !== undefined ? { suggestedDescription } : {}),
|
|
57
67
|
answeredCount: Object.keys(mergedAnswers).length,
|
|
58
68
|
...(contradictions.length > 0
|
|
59
69
|
? {
|
|
@@ -86,31 +96,57 @@ export async function handleClarifyRequirements(params) {
|
|
|
86
96
|
// Generate main clarification questions (cap total at maxQuestions)
|
|
87
97
|
const mainMaxQ = Math.max(1, maxQuestions - metaQuestions.length);
|
|
88
98
|
const mainQuestions = generateQuestions(topic, context, knowledge, mainMaxQ);
|
|
89
|
-
const
|
|
90
|
-
//
|
|
91
|
-
const
|
|
99
|
+
const rawQuestions = [...metaQuestions, ...mainQuestions].slice(0, maxQuestions);
|
|
100
|
+
// Detect project stack for auto-skip and option filtering (SPEC-337)
|
|
101
|
+
const projectPath = knowledge?.projectPath ?? '';
|
|
102
|
+
const stack = projectPath !== ''
|
|
103
|
+
? await detectStack(projectPath).catch(() => ({
|
|
104
|
+
framework: null,
|
|
105
|
+
language: null,
|
|
106
|
+
database: null,
|
|
107
|
+
detectedLibs: [],
|
|
108
|
+
}))
|
|
109
|
+
: { framework: null, language: null, database: null, detectedLibs: [] };
|
|
110
|
+
// Apply multiple-choice options + mark skipped questions (SPEC-337)
|
|
111
|
+
const questions = rawQuestions.map((q) => {
|
|
112
|
+
const withOptions = attachOptions(q);
|
|
113
|
+
const skipped = shouldSkipQuestion(q, stack);
|
|
114
|
+
return skipped ? { ...withOptions, skipped: true } : withOptions;
|
|
115
|
+
});
|
|
116
|
+
// Determine if spec is ready (all non-skipped critical questions have non-empty answers)
|
|
117
|
+
const criticalIds = questions
|
|
118
|
+
.filter((q) => q.importance === 'critical' && q.skipped !== true)
|
|
119
|
+
.map((q) => q.id);
|
|
92
120
|
const specReady = answers !== undefined &&
|
|
93
121
|
criticalIds.every((id) => {
|
|
94
122
|
const ans = answers[id];
|
|
95
123
|
return ans !== undefined && ans.trim() !== '';
|
|
96
124
|
});
|
|
125
|
+
// Build suggestedDescription when spec is ready (SPEC-337)
|
|
126
|
+
const currentAnswers = answers ?? {};
|
|
127
|
+
const suggestedDescription = specReady
|
|
128
|
+
? buildSuggestedDescription(topic, currentAnswers, questions)
|
|
129
|
+
: undefined;
|
|
97
130
|
// Create a clarification session
|
|
98
131
|
const session = {
|
|
99
132
|
id: randomUUID().slice(0, 8),
|
|
100
133
|
projectId,
|
|
101
134
|
topic,
|
|
102
135
|
questions,
|
|
103
|
-
answers:
|
|
136
|
+
answers: currentAnswers,
|
|
104
137
|
isComplete: specReady,
|
|
105
138
|
createdAt: new Date().toISOString(),
|
|
106
139
|
contradictions: contradictions.length > 0 ? contradictions : undefined,
|
|
107
140
|
specReady,
|
|
141
|
+
interviewMode: 'multiple-choice',
|
|
142
|
+
...(suggestedDescription !== undefined ? { suggestedDescription } : {}),
|
|
108
143
|
};
|
|
109
144
|
// Persist the session
|
|
110
145
|
await knowledgeStore.addClarification(projectId, session);
|
|
111
146
|
const result = {
|
|
112
147
|
sessionId: session.id,
|
|
113
148
|
topic,
|
|
149
|
+
interviewMode: 'multiple-choice',
|
|
114
150
|
questionsCount: questions.length,
|
|
115
151
|
hasMetaQuestions: metaQuestions.length > 0,
|
|
116
152
|
questions: questions.map((q) => ({
|
|
@@ -121,8 +157,11 @@ export async function handleClarifyRequirements(params) {
|
|
|
121
157
|
suggestedAnswer: q.suggestedAnswer,
|
|
122
158
|
/* v8 ignore next 1 */
|
|
123
159
|
suggestedAnswers: q.suggestedAnswers ?? [],
|
|
160
|
+
options: q.options,
|
|
161
|
+
skipped: q.skipped,
|
|
124
162
|
})),
|
|
125
163
|
specReady,
|
|
164
|
+
...(suggestedDescription !== undefined ? { suggestedDescription } : {}),
|
|
126
165
|
instructions: specReady
|
|
127
166
|
? 'All critical questions answered. Call create_spec with clarificationSessionId to create a precise spec.'
|
|
128
167
|
: 'Answer the questions above, then call create_spec with the gathered context. You can skip nice-to-have questions if the user does not have strong opinions.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clarify-requirements.js","sourceRoot":"","sources":["../../src/tools/clarify-requirements.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"clarify-requirements.js","sourceRoot":"","sources":["../../src/tools/clarify-requirements.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-pdf.d.ts","sourceRoot":"","sources":["../../src/tools/export-pdf.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"export-pdf.d.ts","sourceRoot":"","sources":["../../src/tools/export-pdf.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0EzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiB7D"}
|
package/dist/tools/export-pdf.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { safeLicensed } from './safe-handler.js';
|
|
3
|
-
import { htmlToPdf
|
|
3
|
+
import { htmlToPdf } from '../engine/pdf/index.js';
|
|
4
4
|
// ── Zod schema ────────────────────────────────────────────────────────────────
|
|
5
5
|
const ExportPdfInputSchema = {
|
|
6
6
|
htmlPath: z
|
|
@@ -32,19 +32,13 @@ const ExportPdfInputSchema = {
|
|
|
32
32
|
};
|
|
33
33
|
// ── Handler ───────────────────────────────────────────────────────────────────
|
|
34
34
|
async function handleExportPdf(args) {
|
|
35
|
-
// Validate browser availability upfront for a clearer error message
|
|
36
|
-
const browserInfo = findBrowserSync();
|
|
37
|
-
if (!browserInfo) {
|
|
38
|
-
throw new Error('No compatible browser found. Install Google Chrome or Chromium (or set PLANU_CHROME_PATH), then retry. ' +
|
|
39
|
-
'PDF generation requires a system browser to render HTML accurately.');
|
|
40
|
-
}
|
|
41
35
|
const options = {
|
|
42
36
|
outputPath: args.outputPath ?? '',
|
|
43
37
|
format: args.format ?? 'A4',
|
|
44
38
|
landscape: args.landscape ?? false,
|
|
45
39
|
printBackground: args.printBackground ?? true,
|
|
46
40
|
scale: args.scale ?? 1,
|
|
47
|
-
timeout: args.timeout ??
|
|
41
|
+
timeout: args.timeout ?? 60000,
|
|
48
42
|
watermark: args.watermark,
|
|
49
43
|
includeToc: args.includeToc ?? false,
|
|
50
44
|
pageNumbers: args.pageNumbers ?? true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-pdf.js","sourceRoot":"","sources":["../../src/tools/export-pdf.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"export-pdf.js","sourceRoot":"","sources":["../../src/tools/export-pdf.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,57 @@
|
|
|
1
|
-
import type { ToolResult } from '../types/index.js';
|
|
1
|
+
import type { ToolResult, RegisteredProjectSummary } from '../types/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Resolve projectId from either projectId or projectPath.
|
|
4
4
|
* projectPath takes precedence when both are provided.
|
|
5
5
|
* Returns null when neither is provided.
|
|
6
|
+
*
|
|
7
|
+
* This is the SYNC fast path for callers that always have an explicit param.
|
|
8
|
+
* For zero-config auto-detection use resolveProjectIdOrAutoDetect().
|
|
6
9
|
*/
|
|
7
10
|
export declare function resolveProjectId(params: {
|
|
8
11
|
projectId?: string;
|
|
9
12
|
projectPath?: string;
|
|
10
13
|
}): string | null;
|
|
11
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* Result returned by resolveProjectIdOrAutoDetect.
|
|
16
|
+
* On success: { ok: true, projectId, projectPath, autoDetected }
|
|
17
|
+
* On failure: { ok: false, errorResult } — return errorResult directly to the caller.
|
|
18
|
+
*/
|
|
19
|
+
export type ResolveResult = {
|
|
20
|
+
ok: true;
|
|
21
|
+
projectId: string;
|
|
22
|
+
projectPath: string;
|
|
23
|
+
autoDetected: boolean;
|
|
24
|
+
} | {
|
|
25
|
+
ok: false;
|
|
26
|
+
errorResult: ToolResult;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Resolve a projectId with full zero-config auto-detection (SPEC-341).
|
|
30
|
+
*
|
|
31
|
+
* Falls back to PLANU_PROJECT_PATH env var and the global project registry
|
|
32
|
+
* when neither projectId nor projectPath is passed explicitly.
|
|
33
|
+
*
|
|
34
|
+
* Returns a discriminated union so callers can early-return on failure:
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* const resolved = await resolveProjectIdOrAutoDetect(params);
|
|
38
|
+
* if (!resolved.ok) return resolved.errorResult;
|
|
39
|
+
* const { projectId, projectPath, autoDetected } = resolved;
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveProjectIdOrAutoDetect(params: {
|
|
43
|
+
projectId?: string;
|
|
44
|
+
projectPath?: string;
|
|
45
|
+
}): Promise<ResolveResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Build a ToolResult error for the "missing project" case.
|
|
48
|
+
* Includes a registeredProjects[] list so the user can see their options.
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildMissingProjectError(registeredProjects: RegisteredProjectSummary[]): ToolResult;
|
|
51
|
+
/**
|
|
52
|
+
* Build a ToolResult error for the "ambiguous project" case (multiple registered).
|
|
53
|
+
* Lists all known projects with their id + path so the user can pick one.
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildAmbiguousProjectError(registeredProjects: RegisteredProjectSummary[]): ToolResult;
|
|
12
56
|
export declare const missingProjectIdError: ToolResult;
|
|
13
57
|
//# sourceMappingURL=resolve-project-id.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-project-id.d.ts","sourceRoot":"","sources":["../../src/tools/resolve-project-id.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolve-project-id.d.ts","sourceRoot":"","sources":["../../src/tools/resolve-project-id.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAE9E;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,GAAG,IAAI,CAQhB;AAMD;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,WAAW,EAAE,UAAU,CAAA;CAAE,CAAC;AAE3C;;;;;;;;;;;;;GAaG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwBzB;AAMD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,kBAAkB,EAAE,wBAAwB,EAAE,GAC7C,UAAU,CASZ;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,kBAAkB,EAAE,wBAAwB,EAAE,GAC7C,UAAU,CAUZ;AAKD,eAAO,MAAM,qBAAqB,EAAE,UAQnC,CAAC"}
|