@su-record/vibe 2.5.21 → 2.6.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.
Files changed (81) hide show
  1. package/CLAUDE.md +154 -2
  2. package/README.md +132 -2
  3. package/commands/vibe.run.md +69 -44
  4. package/commands/vibe.spec.md +83 -0
  5. package/commands/vibe.trace.md +161 -0
  6. package/dist/cli/index.d.ts.map +1 -1
  7. package/dist/cli/index.js +5 -3
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/lib/IterationTracker.d.ts +3 -1
  10. package/dist/lib/IterationTracker.d.ts.map +1 -1
  11. package/dist/lib/IterationTracker.js +2 -1
  12. package/dist/lib/IterationTracker.js.map +1 -1
  13. package/dist/lib/constants.d.ts +14 -0
  14. package/dist/lib/constants.d.ts.map +1 -1
  15. package/dist/lib/constants.js +26 -0
  16. package/dist/lib/constants.js.map +1 -1
  17. package/dist/orchestrator/BackgroundManager.d.ts +109 -0
  18. package/dist/orchestrator/BackgroundManager.d.ts.map +1 -0
  19. package/dist/orchestrator/BackgroundManager.js +456 -0
  20. package/dist/orchestrator/BackgroundManager.js.map +1 -0
  21. package/dist/orchestrator/BackgroundManager.test.d.ts +6 -0
  22. package/dist/orchestrator/BackgroundManager.test.d.ts.map +1 -0
  23. package/dist/orchestrator/BackgroundManager.test.js +162 -0
  24. package/dist/orchestrator/BackgroundManager.test.js.map +1 -0
  25. package/dist/orchestrator/PhasePipeline.d.ts +106 -0
  26. package/dist/orchestrator/PhasePipeline.d.ts.map +1 -0
  27. package/dist/orchestrator/PhasePipeline.js +279 -0
  28. package/dist/orchestrator/PhasePipeline.js.map +1 -0
  29. package/dist/orchestrator/backgroundAgent.d.ts +2 -0
  30. package/dist/orchestrator/backgroundAgent.d.ts.map +1 -1
  31. package/dist/orchestrator/backgroundAgent.js +2 -0
  32. package/dist/orchestrator/backgroundAgent.js.map +1 -1
  33. package/dist/orchestrator/index.d.ts +4 -1
  34. package/dist/orchestrator/index.d.ts.map +1 -1
  35. package/dist/orchestrator/index.js +5 -1
  36. package/dist/orchestrator/index.js.map +1 -1
  37. package/dist/tools/index.d.ts +4 -0
  38. package/dist/tools/index.d.ts.map +1 -1
  39. package/dist/tools/index.js +14 -0
  40. package/dist/tools/index.js.map +1 -1
  41. package/dist/tools/interaction/askUser.d.ts +115 -0
  42. package/dist/tools/interaction/askUser.d.ts.map +1 -0
  43. package/dist/tools/interaction/askUser.js +504 -0
  44. package/dist/tools/interaction/askUser.js.map +1 -0
  45. package/dist/tools/interaction/index.d.ts +8 -0
  46. package/dist/tools/interaction/index.d.ts.map +1 -0
  47. package/dist/tools/interaction/index.js +17 -0
  48. package/dist/tools/interaction/index.js.map +1 -0
  49. package/dist/tools/spec/index.d.ts +14 -0
  50. package/dist/tools/spec/index.d.ts.map +1 -0
  51. package/dist/tools/spec/index.js +15 -0
  52. package/dist/tools/spec/index.js.map +1 -0
  53. package/dist/tools/spec/prdParser.d.ts +43 -0
  54. package/dist/tools/spec/prdParser.d.ts.map +1 -0
  55. package/dist/tools/spec/prdParser.js +291 -0
  56. package/dist/tools/spec/prdParser.js.map +1 -0
  57. package/dist/tools/spec/prdParser.test.d.ts +6 -0
  58. package/dist/tools/spec/prdParser.test.d.ts.map +1 -0
  59. package/dist/tools/spec/prdParser.test.js +332 -0
  60. package/dist/tools/spec/prdParser.test.js.map +1 -0
  61. package/dist/tools/spec/requirementId.d.ts +65 -0
  62. package/dist/tools/spec/requirementId.d.ts.map +1 -0
  63. package/dist/tools/spec/requirementId.js +161 -0
  64. package/dist/tools/spec/requirementId.js.map +1 -0
  65. package/dist/tools/spec/specGenerator.d.ts +39 -0
  66. package/dist/tools/spec/specGenerator.d.ts.map +1 -0
  67. package/dist/tools/spec/specGenerator.js +426 -0
  68. package/dist/tools/spec/specGenerator.js.map +1 -0
  69. package/dist/tools/spec/specVersioning.d.ts +77 -0
  70. package/dist/tools/spec/specVersioning.d.ts.map +1 -0
  71. package/dist/tools/spec/specVersioning.js +237 -0
  72. package/dist/tools/spec/specVersioning.js.map +1 -0
  73. package/dist/tools/spec/traceabilityMatrix.d.ts +55 -0
  74. package/dist/tools/spec/traceabilityMatrix.d.ts.map +1 -0
  75. package/dist/tools/spec/traceabilityMatrix.js +396 -0
  76. package/dist/tools/spec/traceabilityMatrix.js.map +1 -0
  77. package/dist/tools/spec/traceabilityMatrix.test.d.ts +6 -0
  78. package/dist/tools/spec/traceabilityMatrix.test.d.ts.map +1 -0
  79. package/dist/tools/spec/traceabilityMatrix.test.js +340 -0
  80. package/dist/tools/spec/traceabilityMatrix.test.js.map +1 -0
  81. package/package.json +2 -1
@@ -0,0 +1,115 @@
1
+ /**
2
+ * AskUserQuestion Tool - 구조화된 사용자 질문 도구
3
+ *
4
+ * Claude Code의 AskUserQuestionTool 개념을 vibe에 통합
5
+ * 필수 확인 항목에 대해 명시적인 질문-응답 플로우 제공
6
+ *
7
+ * @since v2.6.1
8
+ */
9
+ import type { ToolResult } from '../../types/tool.js';
10
+ export type QuestionType = 'single_select' | 'multi_select' | 'text' | 'confirm' | 'number';
11
+ export type QuestionCategory = 'authentication' | 'security' | 'data_model' | 'session' | 'performance' | 'integration' | 'scope' | 'custom';
12
+ export interface QuestionOption {
13
+ value: string;
14
+ label: string;
15
+ description?: string;
16
+ isDefault?: boolean;
17
+ }
18
+ export interface Question {
19
+ id: string;
20
+ category: QuestionCategory;
21
+ type: QuestionType;
22
+ question: string;
23
+ description?: string;
24
+ options?: QuestionOption[];
25
+ defaultValue?: string | string[] | number | boolean;
26
+ required: boolean;
27
+ validation?: {
28
+ min?: number;
29
+ max?: number;
30
+ pattern?: string;
31
+ customMessage?: string;
32
+ };
33
+ }
34
+ export interface QuestionResponse {
35
+ questionId: string;
36
+ value: string | string[] | number | boolean;
37
+ timestamp: string;
38
+ }
39
+ export interface AskUserInput {
40
+ questions: Question[];
41
+ context?: string;
42
+ featureName?: string;
43
+ allowSkip?: boolean;
44
+ }
45
+ export interface AskUserOutput {
46
+ formatted: string;
47
+ questions: Question[];
48
+ pendingCount: number;
49
+ requiredCount: number;
50
+ }
51
+ export declare const QUESTION_TEMPLATES: Record<string, Omit<Question, 'id'>>;
52
+ /**
53
+ * 질문 ID 생성
54
+ */
55
+ export declare function generateQuestionId(category: QuestionCategory, index: number): string;
56
+ /**
57
+ * 템플릿에서 질문 생성
58
+ */
59
+ export declare function createQuestionFromTemplate(templateKey: string, overrides?: Partial<Question>): Question | null;
60
+ /**
61
+ * 카테고리별 필수 질문 세트 생성
62
+ */
63
+ export declare function createRequiredQuestionSet(categories: QuestionCategory[]): Question[];
64
+ /**
65
+ * 질문을 마크다운 형식으로 포맷
66
+ */
67
+ export declare function formatQuestionAsMarkdown(question: Question): string;
68
+ /**
69
+ * 전체 질문 세트를 포맷
70
+ */
71
+ export declare function formatQuestionsForUser(input: AskUserInput): AskUserOutput;
72
+ /**
73
+ * 사용자 응답 파싱
74
+ */
75
+ export declare function parseUserResponse(question: Question, rawResponse: string): QuestionResponse | {
76
+ error: string;
77
+ };
78
+ export interface AskUserParams {
79
+ featureName: string;
80
+ categories?: QuestionCategory[];
81
+ customQuestions?: Question[];
82
+ context?: string;
83
+ }
84
+ /**
85
+ * askUser - 사용자에게 필수 확인 질문 생성
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const result = await askUser({
90
+ * featureName: 'login',
91
+ * categories: ['authentication', 'security', 'session'],
92
+ * });
93
+ * console.log(result.content[0].text);
94
+ * ```
95
+ */
96
+ export declare function askUser(params: AskUserParams): Promise<ToolResult>;
97
+ /**
98
+ * Quick helper for common scenarios
99
+ */
100
+ export declare const askUserQuick: {
101
+ /**
102
+ * 로그인 기능 관련 질문
103
+ */
104
+ login: (featureName?: string) => Promise<ToolResult>;
105
+ /**
106
+ * API 기능 관련 질문
107
+ */
108
+ api: (featureName: string) => Promise<ToolResult>;
109
+ /**
110
+ * 사용자 관리 기능 관련 질문
111
+ */
112
+ userManagement: (featureName?: string) => Promise<ToolResult>;
113
+ };
114
+ export default askUser;
115
+ //# sourceMappingURL=askUser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"askUser.d.ts","sourceRoot":"","sources":["../../../src/tools/interaction/askUser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,504 @@
1
+ /**
2
+ * AskUserQuestion Tool - 구조화된 사용자 질문 도구
3
+ *
4
+ * Claude Code의 AskUserQuestionTool 개념을 vibe에 통합
5
+ * 필수 확인 항목에 대해 명시적인 질문-응답 플로우 제공
6
+ *
7
+ * @since v2.6.1
8
+ */
9
+ // ============================================================================
10
+ // Predefined Question Templates
11
+ // ============================================================================
12
+ export const QUESTION_TEMPLATES = {
13
+ // Authentication
14
+ auth_method: {
15
+ category: 'authentication',
16
+ type: 'multi_select',
17
+ question: '어떤 인증 방식을 지원할까요?',
18
+ options: [
19
+ { value: 'email_password', label: '이메일/비밀번호', isDefault: true },
20
+ { value: 'social_google', label: 'Google 소셜 로그인' },
21
+ { value: 'social_apple', label: 'Apple 소셜 로그인' },
22
+ { value: 'social_github', label: 'GitHub 소셜 로그인' },
23
+ { value: 'passkey', label: 'Passkey (WebAuthn)' },
24
+ { value: 'magic_link', label: 'Magic Link (이메일)' },
25
+ { value: 'sms_otp', label: 'SMS OTP' },
26
+ ],
27
+ required: true,
28
+ },
29
+ mfa_required: {
30
+ category: 'authentication',
31
+ type: 'confirm',
32
+ question: '다중 인증(MFA)을 지원할까요?',
33
+ description: 'TOTP, SMS 등 2차 인증 수단',
34
+ defaultValue: false,
35
+ required: true,
36
+ },
37
+ // Session
38
+ session_duration: {
39
+ category: 'session',
40
+ type: 'single_select',
41
+ question: '세션 만료 시간을 선택하세요',
42
+ options: [
43
+ { value: '30m', label: '30분' },
44
+ { value: '1h', label: '1시간', isDefault: true },
45
+ { value: '24h', label: '24시간' },
46
+ { value: '7d', label: '7일' },
47
+ { value: '30d', label: '30일' },
48
+ { value: 'never', label: '만료 없음' },
49
+ ],
50
+ required: true,
51
+ },
52
+ concurrent_session: {
53
+ category: 'session',
54
+ type: 'single_select',
55
+ question: '동시 로그인을 허용할까요?',
56
+ options: [
57
+ { value: 'single', label: '단일 세션만 허용' },
58
+ { value: 'limited', label: '최대 3개 세션' },
59
+ { value: 'unlimited', label: '무제한', isDefault: true },
60
+ ],
61
+ required: true,
62
+ },
63
+ // Security
64
+ password_policy: {
65
+ category: 'security',
66
+ type: 'single_select',
67
+ question: '비밀번호 정책 수준을 선택하세요',
68
+ options: [
69
+ { value: 'basic', label: '기본 (8자 이상)' },
70
+ {
71
+ value: 'standard',
72
+ label: '표준 (8자+대소문자+숫자)',
73
+ isDefault: true,
74
+ },
75
+ { value: 'strong', label: '강력 (12자+대소문자+숫자+특수문자)' },
76
+ ],
77
+ required: true,
78
+ },
79
+ rate_limit: {
80
+ category: 'security',
81
+ type: 'single_select',
82
+ question: '로그인 시도 제한 정책을 선택하세요',
83
+ options: [
84
+ { value: 'none', label: '제한 없음' },
85
+ {
86
+ value: 'standard',
87
+ label: '5회 실패 시 5분 잠금',
88
+ isDefault: true,
89
+ },
90
+ { value: 'strict', label: '3회 실패 시 30분 잠금' },
91
+ ],
92
+ required: true,
93
+ },
94
+ // Data Model
95
+ user_profile_fields: {
96
+ category: 'data_model',
97
+ type: 'multi_select',
98
+ question: '사용자 프로필에 포함할 필드를 선택하세요',
99
+ options: [
100
+ { value: 'display_name', label: '표시 이름', isDefault: true },
101
+ { value: 'avatar', label: '프로필 이미지' },
102
+ { value: 'phone', label: '전화번호' },
103
+ { value: 'address', label: '주소' },
104
+ { value: 'birthdate', label: '생년월일' },
105
+ { value: 'bio', label: '자기소개' },
106
+ ],
107
+ required: false,
108
+ },
109
+ // Performance
110
+ response_time_target: {
111
+ category: 'performance',
112
+ type: 'single_select',
113
+ question: 'API 응답 시간 목표를 선택하세요',
114
+ options: [
115
+ { value: '100ms', label: '100ms 이하 (실시간)' },
116
+ { value: '500ms', label: '500ms 이하', isDefault: true },
117
+ { value: '1s', label: '1초 이하' },
118
+ { value: '3s', label: '3초 이하' },
119
+ ],
120
+ required: false,
121
+ },
122
+ // Integration
123
+ external_apis: {
124
+ category: 'integration',
125
+ type: 'multi_select',
126
+ question: '연동할 외부 서비스가 있나요?',
127
+ options: [
128
+ { value: 'none', label: '없음', isDefault: true },
129
+ { value: 'payment', label: '결제 (Stripe, Toss)' },
130
+ { value: 'email', label: '이메일 (SendGrid, SES)' },
131
+ { value: 'sms', label: 'SMS (Twilio, Aligo)' },
132
+ { value: 'push', label: '푸시 알림 (FCM, APNs)' },
133
+ { value: 'analytics', label: '분석 (GA, Mixpanel)' },
134
+ ],
135
+ required: false,
136
+ },
137
+ };
138
+ // ============================================================================
139
+ // Question Builder
140
+ // ============================================================================
141
+ /**
142
+ * 질문 ID 생성
143
+ */
144
+ export function generateQuestionId(category, index) {
145
+ return `Q-${category.toUpperCase()}-${String(index).padStart(3, '0')}`;
146
+ }
147
+ /**
148
+ * 템플릿에서 질문 생성
149
+ */
150
+ export function createQuestionFromTemplate(templateKey, overrides) {
151
+ const template = QUESTION_TEMPLATES[templateKey];
152
+ if (!template)
153
+ return null;
154
+ return {
155
+ id: generateQuestionId(template.category, Date.now() % 1000),
156
+ ...template,
157
+ ...overrides,
158
+ };
159
+ }
160
+ /**
161
+ * 카테고리별 필수 질문 세트 생성
162
+ */
163
+ export function createRequiredQuestionSet(categories) {
164
+ const questions = [];
165
+ const categoryTemplates = {
166
+ authentication: ['auth_method', 'mfa_required'],
167
+ security: ['password_policy', 'rate_limit'],
168
+ session: ['session_duration', 'concurrent_session'],
169
+ data_model: ['user_profile_fields'],
170
+ performance: ['response_time_target'],
171
+ integration: ['external_apis'],
172
+ scope: [],
173
+ custom: [],
174
+ };
175
+ for (const category of categories) {
176
+ const templates = categoryTemplates[category] || [];
177
+ for (const templateKey of templates) {
178
+ const question = createQuestionFromTemplate(templateKey);
179
+ if (question) {
180
+ questions.push(question);
181
+ }
182
+ }
183
+ }
184
+ return questions;
185
+ }
186
+ // ============================================================================
187
+ // Formatting
188
+ // ============================================================================
189
+ /**
190
+ * 질문을 마크다운 형식으로 포맷
191
+ */
192
+ export function formatQuestionAsMarkdown(question) {
193
+ const lines = [];
194
+ // Category & ID
195
+ const categoryEmoji = getCategoryEmoji(question.category);
196
+ lines.push(`### ${categoryEmoji} ${question.id}`);
197
+ lines.push('');
198
+ // Question
199
+ lines.push(`**${question.question}**`);
200
+ if (question.description) {
201
+ lines.push(`> ${question.description}`);
202
+ }
203
+ lines.push('');
204
+ // Options or input type
205
+ if (question.options && question.options.length > 0) {
206
+ const selectHint = question.type === 'multi_select' ? '(복수 선택 가능)' : '(하나만 선택)';
207
+ lines.push(selectHint);
208
+ lines.push('');
209
+ question.options.forEach((opt, idx) => {
210
+ const defaultMark = opt.isDefault ? ' ✓' : '';
211
+ const desc = opt.description ? ` - ${opt.description}` : '';
212
+ lines.push(`${idx + 1}. **${opt.label}**${defaultMark}${desc}`);
213
+ });
214
+ }
215
+ else if (question.type === 'confirm') {
216
+ lines.push('- Y: 예');
217
+ lines.push('- N: 아니오');
218
+ }
219
+ else if (question.type === 'text') {
220
+ lines.push('_자유롭게 입력하세요_');
221
+ }
222
+ else if (question.type === 'number') {
223
+ const validation = question.validation;
224
+ if (validation) {
225
+ const range = [];
226
+ if (validation.min !== undefined)
227
+ range.push(`최소: ${validation.min}`);
228
+ if (validation.max !== undefined)
229
+ range.push(`최대: ${validation.max}`);
230
+ if (range.length > 0)
231
+ lines.push(`_${range.join(', ')}_`);
232
+ }
233
+ }
234
+ lines.push('');
235
+ lines.push(question.required ? '**필수**' : '_선택_');
236
+ return lines.join('\n');
237
+ }
238
+ /**
239
+ * 카테고리별 이모지
240
+ */
241
+ function getCategoryEmoji(category) {
242
+ const emojis = {
243
+ authentication: '🔐',
244
+ security: '🛡️',
245
+ data_model: '📊',
246
+ session: '⏱️',
247
+ performance: '⚡',
248
+ integration: '🔗',
249
+ scope: '📋',
250
+ custom: '❓',
251
+ };
252
+ return emojis[category] || '❓';
253
+ }
254
+ /**
255
+ * 전체 질문 세트를 포맷
256
+ */
257
+ export function formatQuestionsForUser(input) {
258
+ const lines = [];
259
+ // Header
260
+ lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
261
+ lines.push('📋 요구사항 확인');
262
+ if (input.featureName) {
263
+ lines.push(`Feature: ${input.featureName}`);
264
+ }
265
+ lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
266
+ lines.push('');
267
+ if (input.context) {
268
+ lines.push(input.context);
269
+ lines.push('');
270
+ }
271
+ // Group by category
272
+ const grouped = new Map();
273
+ for (const q of input.questions) {
274
+ const list = grouped.get(q.category) || [];
275
+ list.push(q);
276
+ grouped.set(q.category, list);
277
+ }
278
+ // Format each category
279
+ for (const [category, questions] of grouped) {
280
+ const categoryName = getCategoryName(category);
281
+ lines.push(`## ${getCategoryEmoji(category)} ${categoryName}`);
282
+ lines.push('');
283
+ for (const q of questions) {
284
+ lines.push(formatQuestionAsMarkdown(q));
285
+ lines.push('');
286
+ }
287
+ }
288
+ // Summary
289
+ const requiredCount = input.questions.filter((q) => q.required).length;
290
+ lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
291
+ lines.push(`총 ${input.questions.length}개 질문 (필수: ${requiredCount}개)`);
292
+ if (input.allowSkip) {
293
+ lines.push('_선택 항목은 Enter로 건너뛸 수 있습니다_');
294
+ }
295
+ lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
296
+ return {
297
+ formatted: lines.join('\n'),
298
+ questions: input.questions,
299
+ pendingCount: input.questions.length,
300
+ requiredCount,
301
+ };
302
+ }
303
+ /**
304
+ * 카테고리 한글명
305
+ */
306
+ function getCategoryName(category) {
307
+ const names = {
308
+ authentication: '인증',
309
+ security: '보안',
310
+ data_model: '데이터 모델',
311
+ session: '세션',
312
+ performance: '성능',
313
+ integration: '외부 연동',
314
+ scope: '기능 범위',
315
+ custom: '기타',
316
+ };
317
+ return names[category] || '기타';
318
+ }
319
+ // ============================================================================
320
+ // Response Parsing
321
+ // ============================================================================
322
+ /**
323
+ * 사용자 응답 파싱
324
+ */
325
+ export function parseUserResponse(question, rawResponse) {
326
+ const response = rawResponse.trim();
327
+ if (!response && question.required) {
328
+ return { error: '필수 항목입니다. 응답을 입력해주세요.' };
329
+ }
330
+ if (!response && question.defaultValue !== undefined) {
331
+ return {
332
+ questionId: question.id,
333
+ value: question.defaultValue,
334
+ timestamp: new Date().toISOString(),
335
+ };
336
+ }
337
+ switch (question.type) {
338
+ case 'single_select': {
339
+ if (!question.options) {
340
+ return { error: '옵션이 정의되지 않았습니다.' };
341
+ }
342
+ const index = parseInt(response, 10) - 1;
343
+ if (isNaN(index) || index < 0 || index >= question.options.length) {
344
+ return {
345
+ error: `1-${question.options.length} 사이의 숫자를 입력하세요.`,
346
+ };
347
+ }
348
+ return {
349
+ questionId: question.id,
350
+ value: question.options[index].value,
351
+ timestamp: new Date().toISOString(),
352
+ };
353
+ }
354
+ case 'multi_select': {
355
+ if (!question.options) {
356
+ return { error: '옵션이 정의되지 않았습니다.' };
357
+ }
358
+ const indices = response.split(/[,\s]+/).map((s) => parseInt(s, 10) - 1);
359
+ const values = [];
360
+ for (const idx of indices) {
361
+ if (isNaN(idx) || idx < 0 || idx >= question.options.length) {
362
+ return {
363
+ error: `유효한 번호를 입력하세요 (1-${question.options.length})`,
364
+ };
365
+ }
366
+ values.push(question.options[idx].value);
367
+ }
368
+ return {
369
+ questionId: question.id,
370
+ value: values,
371
+ timestamp: new Date().toISOString(),
372
+ };
373
+ }
374
+ case 'confirm': {
375
+ const lower = response.toLowerCase();
376
+ if (['y', 'yes', '예', '네', 'true'].includes(lower)) {
377
+ return {
378
+ questionId: question.id,
379
+ value: true,
380
+ timestamp: new Date().toISOString(),
381
+ };
382
+ }
383
+ if (['n', 'no', '아니오', '아니요', 'false'].includes(lower)) {
384
+ return {
385
+ questionId: question.id,
386
+ value: false,
387
+ timestamp: new Date().toISOString(),
388
+ };
389
+ }
390
+ return { error: 'Y 또는 N을 입력하세요.' };
391
+ }
392
+ case 'number': {
393
+ const num = parseFloat(response);
394
+ if (isNaN(num)) {
395
+ return { error: '숫자를 입력하세요.' };
396
+ }
397
+ const validation = question.validation;
398
+ if (validation) {
399
+ if (validation.min !== undefined && num < validation.min) {
400
+ return { error: `최소값은 ${validation.min}입니다.` };
401
+ }
402
+ if (validation.max !== undefined && num > validation.max) {
403
+ return { error: `최대값은 ${validation.max}입니다.` };
404
+ }
405
+ }
406
+ return {
407
+ questionId: question.id,
408
+ value: num,
409
+ timestamp: new Date().toISOString(),
410
+ };
411
+ }
412
+ case 'text':
413
+ default:
414
+ if (question.validation?.pattern) {
415
+ const regex = new RegExp(question.validation.pattern);
416
+ if (!regex.test(response)) {
417
+ return {
418
+ error: question.validation.customMessage || '형식이 올바르지 않습니다.',
419
+ };
420
+ }
421
+ }
422
+ return {
423
+ questionId: question.id,
424
+ value: response,
425
+ timestamp: new Date().toISOString(),
426
+ };
427
+ }
428
+ }
429
+ /**
430
+ * askUser - 사용자에게 필수 확인 질문 생성
431
+ *
432
+ * @example
433
+ * ```typescript
434
+ * const result = await askUser({
435
+ * featureName: 'login',
436
+ * categories: ['authentication', 'security', 'session'],
437
+ * });
438
+ * console.log(result.content[0].text);
439
+ * ```
440
+ */
441
+ export async function askUser(params) {
442
+ const { featureName, categories = [], customQuestions = [], context } = params;
443
+ // Generate questions
444
+ const templateQuestions = createRequiredQuestionSet(categories);
445
+ const allQuestions = [...templateQuestions, ...customQuestions];
446
+ if (allQuestions.length === 0) {
447
+ return {
448
+ content: [
449
+ {
450
+ type: 'text',
451
+ text: '⚠️ 질문이 없습니다. categories 또는 customQuestions를 지정하세요.',
452
+ },
453
+ ],
454
+ };
455
+ }
456
+ // Format output
457
+ const output = formatQuestionsForUser({
458
+ questions: allQuestions,
459
+ featureName,
460
+ context,
461
+ allowSkip: true,
462
+ });
463
+ return {
464
+ content: [
465
+ {
466
+ type: 'text',
467
+ text: output.formatted,
468
+ },
469
+ ],
470
+ _meta: {
471
+ questions: output.questions,
472
+ pendingCount: output.pendingCount,
473
+ requiredCount: output.requiredCount,
474
+ },
475
+ };
476
+ }
477
+ /**
478
+ * Quick helper for common scenarios
479
+ */
480
+ export const askUserQuick = {
481
+ /**
482
+ * 로그인 기능 관련 질문
483
+ */
484
+ login: (featureName = 'login') => askUser({
485
+ featureName,
486
+ categories: ['authentication', 'security', 'session'],
487
+ }),
488
+ /**
489
+ * API 기능 관련 질문
490
+ */
491
+ api: (featureName) => askUser({
492
+ featureName,
493
+ categories: ['security', 'performance', 'integration'],
494
+ }),
495
+ /**
496
+ * 사용자 관리 기능 관련 질문
497
+ */
498
+ userManagement: (featureName = 'user-management') => askUser({
499
+ featureName,
500
+ categories: ['authentication', 'data_model', 'security'],
501
+ }),
502
+ };
503
+ export default askUser;
504
+ //# sourceMappingURL=askUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"askUser.js","sourceRoot":"","sources":["../../../src/tools/interaction/askUser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Interaction Tools - 사용자 상호작용 도구
3
+ *
4
+ * @since v2.6.1
5
+ */
6
+ export { askUser, askUserQuick, createQuestionFromTemplate, createRequiredQuestionSet, generateQuestionId, formatQuestionAsMarkdown, formatQuestionsForUser, parseUserResponse, QUESTION_TEMPLATES, } from './askUser.js';
7
+ export type { Question, QuestionCategory, QuestionOption, QuestionResponse, QuestionType, AskUserInput, AskUserOutput, AskUserParams, } from './askUser.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/interaction/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,OAAO,EACP,YAAY,EAEZ,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,EAElB,wBAAwB,EACxB,sBAAsB,EAEtB,iBAAiB,EAEjB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Interaction Tools - 사용자 상호작용 도구
3
+ *
4
+ * @since v2.6.1
5
+ */
6
+ export {
7
+ // Main function
8
+ askUser, askUserQuick,
9
+ // Question builders
10
+ createQuestionFromTemplate, createRequiredQuestionSet, generateQuestionId,
11
+ // Formatting
12
+ formatQuestionAsMarkdown, formatQuestionsForUser,
13
+ // Parsing
14
+ parseUserResponse,
15
+ // Templates
16
+ QUESTION_TEMPLATES, } from './askUser.js';
17
+ //# sourceMappingURL=index.js.map