@su-record/vibe 2.0.0 β†’ 2.0.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 (65) hide show
  1. package/.claude/agents/explorer.md +48 -48
  2. package/.claude/agents/implementer.md +53 -53
  3. package/.claude/agents/searcher.md +54 -54
  4. package/.claude/agents/simplifier.md +119 -119
  5. package/.claude/agents/tester.md +49 -49
  6. package/.claude/commands/vibe.analyze.md +239 -239
  7. package/.claude/commands/vibe.continue.md +88 -88
  8. package/.claude/commands/vibe.diagram.md +178 -178
  9. package/.claude/commands/vibe.reason.md +306 -306
  10. package/.claude/commands/vibe.run.md +760 -760
  11. package/.claude/commands/vibe.spec.md +339 -339
  12. package/.claude/commands/vibe.tool.md +153 -153
  13. package/.claude/commands/vibe.ui.md +137 -137
  14. package/.claude/commands/vibe.verify.md +238 -238
  15. package/.claude/settings.json +152 -152
  16. package/.claude/settings.local.json +4 -57
  17. package/.vibe/config.json +9 -0
  18. package/.vibe/constitution.md +184 -184
  19. package/.vibe/rules/core/communication-guide.md +104 -104
  20. package/.vibe/rules/core/development-philosophy.md +52 -52
  21. package/.vibe/rules/core/quick-start.md +120 -120
  22. package/.vibe/rules/quality/bdd-contract-testing.md +388 -388
  23. package/.vibe/rules/quality/checklist.md +276 -276
  24. package/.vibe/rules/quality/testing-strategy.md +437 -437
  25. package/.vibe/rules/standards/anti-patterns.md +369 -369
  26. package/.vibe/rules/standards/code-structure.md +291 -291
  27. package/.vibe/rules/standards/complexity-metrics.md +312 -312
  28. package/.vibe/rules/standards/naming-conventions.md +198 -198
  29. package/.vibe/rules/tools/mcp-hi-ai-guide.md +665 -665
  30. package/.vibe/rules/tools/mcp-workflow.md +51 -51
  31. package/.vibe/setup.sh +31 -31
  32. package/CLAUDE.md +122 -122
  33. package/LICENSE +21 -21
  34. package/README.md +568 -568
  35. package/dist/cli/index.d.ts.map +1 -1
  36. package/dist/cli/index.js +391 -406
  37. package/dist/cli/index.js.map +1 -1
  38. package/dist/lib/MemoryManager.js +92 -92
  39. package/dist/lib/PythonParser.js +108 -108
  40. package/dist/lib/gemini-mcp.js +15 -15
  41. package/dist/lib/gemini-oauth.js +35 -35
  42. package/dist/lib/gpt-mcp.js +17 -17
  43. package/dist/lib/gpt-oauth.js +44 -44
  44. package/dist/tools/analytics/getUsageAnalytics.js +12 -12
  45. package/dist/tools/memory/createMemoryTimeline.js +10 -10
  46. package/dist/tools/memory/getMemoryGraph.js +12 -12
  47. package/dist/tools/memory/getSessionContext.js +9 -9
  48. package/dist/tools/memory/linkMemories.js +14 -14
  49. package/dist/tools/memory/listMemories.js +4 -4
  50. package/dist/tools/memory/recallMemory.js +4 -4
  51. package/dist/tools/memory/saveMemory.js +4 -4
  52. package/dist/tools/memory/searchMemoriesAdvanced.js +22 -22
  53. package/dist/tools/planning/generatePrd.js +46 -46
  54. package/dist/tools/prompt/enhancePromptGemini.js +160 -160
  55. package/dist/tools/reasoning/applyReasoningFramework.js +56 -56
  56. package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
  57. package/package.json +67 -67
  58. package/templates/constitution-template.md +184 -184
  59. package/templates/contract-backend-template.md +517 -517
  60. package/templates/contract-frontend-template.md +594 -594
  61. package/templates/feature-template.md +96 -96
  62. package/templates/hooks-template.json +103 -103
  63. package/templates/spec-template.md +199 -199
  64. package/dist/lib/vibe-mcp.d.ts.map +0 -1
  65. package/dist/lib/vibe-mcp.js.map +0 -1
@@ -3,15 +3,15 @@
3
3
  import { MemoryManager } from '../../lib/MemoryManager.js';
4
4
  export const getSessionContextDefinition = {
5
5
  name: 'get_session_context',
6
- description: `πŸš€ [μƒˆ λŒ€ν™”/μ„Έμ…˜ μ‹œμž‘ μ‹œ μžλ™ μ‹€ν–‰ ꢌμž₯] 이전 μ„Έμ…˜μ˜ λ©”λͺ¨λ¦¬, 지식 κ·Έλž˜ν”„, 졜근 μž‘μ—… 내역을 ν•œ λ²ˆμ— μ‘°νšŒν•©λ‹ˆλ‹€.
7
-
8
- 이 λ„κ΅¬λŠ” μƒˆλ‘œμš΄ λŒ€ν™”λ₯Ό μ‹œμž‘ν•  λ•Œ κ°€μž₯ λ¨Όμ € μ‹€ν–‰ν•˜λ©΄ μ’‹μŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈμ˜ μ»¨ν…μŠ€νŠΈλ₯Ό λΉ λ₯΄κ²Œ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
9
-
10
- ν‚€μ›Œλ“œ: μ„Έμ…˜ μ‹œμž‘, μ»¨ν…μŠ€νŠΈ, 이전 μž‘μ—…, session start, context, previous work, what did we do
11
-
12
- μ‚¬μš© μ˜ˆμ‹œ:
13
- - "이전에 무슨 μž‘μ—… ν–ˆμ—ˆμ§€?"
14
- - "ν”„λ‘œμ νŠΈ μ»¨ν…μŠ€νŠΈ μ•Œλ €μ€˜"
6
+ description: `πŸš€ [μƒˆ λŒ€ν™”/μ„Έμ…˜ μ‹œμž‘ μ‹œ μžλ™ μ‹€ν–‰ ꢌμž₯] 이전 μ„Έμ…˜μ˜ λ©”λͺ¨λ¦¬, 지식 κ·Έλž˜ν”„, 졜근 μž‘μ—… 내역을 ν•œ λ²ˆμ— μ‘°νšŒν•©λ‹ˆλ‹€.
7
+
8
+ 이 λ„κ΅¬λŠ” μƒˆλ‘œμš΄ λŒ€ν™”λ₯Ό μ‹œμž‘ν•  λ•Œ κ°€μž₯ λ¨Όμ € μ‹€ν–‰ν•˜λ©΄ μ’‹μŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈμ˜ μ»¨ν…μŠ€νŠΈλ₯Ό λΉ λ₯΄κ²Œ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
9
+
10
+ ν‚€μ›Œλ“œ: μ„Έμ…˜ μ‹œμž‘, μ»¨ν…μŠ€νŠΈ, 이전 μž‘μ—…, session start, context, previous work, what did we do
11
+
12
+ μ‚¬μš© μ˜ˆμ‹œ:
13
+ - "이전에 무슨 μž‘μ—… ν–ˆμ—ˆμ§€?"
14
+ - "ν”„λ‘œμ νŠΈ μ»¨ν…μŠ€νŠΈ μ•Œλ €μ€˜"
15
15
  - "μ„Έμ…˜ μ»¨ν…μŠ€νŠΈ 쑰회"`,
16
16
  inputSchema: {
17
17
  type: 'object',
@@ -2,12 +2,12 @@
2
2
  import { MemoryManager } from '../../lib/MemoryManager.js';
3
3
  export const linkMemoriesDefinition = {
4
4
  name: 'link_memories',
5
- description: `λ©”λͺ¨λ¦¬ κ°„ 관계λ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€ (지식 κ·Έλž˜ν”„).
6
-
7
- ν‚€μ›Œλ“œ: μ—°κ²°ν•΄, 관계 μ„€μ •, 링크, connect memories, link, relate
8
-
9
- μ‚¬μš© μ˜ˆμ‹œ:
10
- - "project-architecture와 design-patternsλ₯Ό μ—°κ²°ν•΄"
5
+ description: `λ©”λͺ¨λ¦¬ κ°„ 관계λ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€ (지식 κ·Έλž˜ν”„).
6
+
7
+ ν‚€μ›Œλ“œ: μ—°κ²°ν•΄, 관계 μ„€μ •, 링크, connect memories, link, relate
8
+
9
+ μ‚¬μš© μ˜ˆμ‹œ:
10
+ - "project-architecture와 design-patternsλ₯Ό μ—°κ²°ν•΄"
11
11
  - "이 두 λ©”λͺ¨λ¦¬λ₯Ό related_to둜 링크해"`,
12
12
  inputSchema: {
13
13
  type: 'object',
@@ -88,14 +88,14 @@ export async function linkMemories(args) {
88
88
  if (bidirectional) {
89
89
  memoryManager.linkMemories(targetKey, sourceKey, relationType, strength);
90
90
  }
91
- const result = `βœ“ λ©”λͺ¨λ¦¬ 관계가 μ—°κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€
92
-
93
- **μ†ŒμŠ€**: ${sourceKey}
94
- **νƒ€κ²Ÿ**: ${targetKey}
95
- **관계 μœ ν˜•**: ${relationType}
96
- **강도**: ${strength}
97
- **μ–‘λ°©ν–₯**: ${bidirectional ? '예' : 'μ•„λ‹ˆμ˜€'}
98
-
91
+ const result = `βœ“ λ©”λͺ¨λ¦¬ 관계가 μ—°κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€
92
+
93
+ **μ†ŒμŠ€**: ${sourceKey}
94
+ **νƒ€κ²Ÿ**: ${targetKey}
95
+ **관계 μœ ν˜•**: ${relationType}
96
+ **강도**: ${strength}
97
+ **μ–‘λ°©ν–₯**: ${bidirectional ? '예' : 'μ•„λ‹ˆμ˜€'}
98
+
99
99
  이제 get_memory_graph둜 관계λ₯Ό μ‹œκ°ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.`;
100
100
  return {
101
101
  content: [{
@@ -2,10 +2,10 @@
2
2
  import { MemoryManager } from '../../lib/MemoryManager.js';
3
3
  export const listMemoriesDefinition = {
4
4
  name: 'list_memories',
5
- description: `μ €μž₯된 λ©”λͺ¨λ¦¬ λͺ©λ‘μ„ μ‘°νšŒν•©λ‹ˆλ‹€. μΉ΄ν…Œκ³ λ¦¬λ³„ 필터링 κ°€λŠ₯.
6
-
7
- ν‚€μ›Œλ“œ: 뭐 μžˆμ—ˆμ§€, μ €μž₯된 κ±°, λͺ©λ‘, what did I save, list memories, show saved
8
-
5
+ description: `μ €μž₯된 λ©”λͺ¨λ¦¬ λͺ©λ‘μ„ μ‘°νšŒν•©λ‹ˆλ‹€. μΉ΄ν…Œκ³ λ¦¬λ³„ 필터링 κ°€λŠ₯.
6
+
7
+ ν‚€μ›Œλ“œ: 뭐 μžˆμ—ˆμ§€, μ €μž₯된 κ±°, λͺ©λ‘, what did I save, list memories, show saved
8
+
9
9
  πŸ’‘ μ„Έμ…˜ μ‹œμž‘ μ‹œ 전체 μ»¨ν…μŠ€νŠΈκ°€ ν•„μš”ν•˜λ©΄ get_session_contextλ₯Ό μ‚¬μš©ν•˜μ„Έμš”.`,
10
10
  inputSchema: {
11
11
  type: 'object',
@@ -2,10 +2,10 @@
2
2
  import { MemoryManager } from '../../lib/MemoryManager.js';
3
3
  export const recallMemoryDefinition = {
4
4
  name: 'recall_memory',
5
- description: `νŠΉμ • λ©”λͺ¨λ¦¬λ₯Ό ν‚€λ‘œ μ‘°νšŒν•©λ‹ˆλ‹€.
6
-
7
- ν‚€μ›Œλ“œ: λ– μ˜¬λ €, recall, κΈ°μ–΅λ‚˜, remember what, what was, remind
8
-
5
+ description: `νŠΉμ • λ©”λͺ¨λ¦¬λ₯Ό ν‚€λ‘œ μ‘°νšŒν•©λ‹ˆλ‹€.
6
+
7
+ ν‚€μ›Œλ“œ: λ– μ˜¬λ €, recall, κΈ°μ–΅λ‚˜, remember what, what was, remind
8
+
9
9
  πŸ’‘ 전체 μ»¨ν…μŠ€νŠΈκ°€ ν•„μš”ν•˜λ©΄ get_session_contextλ₯Ό λ¨Όμ € μ‚¬μš©ν•˜μ„Έμš”.`,
10
10
  inputSchema: {
11
11
  type: 'object',
@@ -2,10 +2,10 @@
2
2
  import { MemoryManager } from '../../lib/MemoryManager.js';
3
3
  export const saveMemoryDefinition = {
4
4
  name: 'save_memory',
5
- description: `μ€‘μš”ν•œ 정보λ₯Ό μž₯κΈ° λ©”λͺ¨λ¦¬μ— μ €μž₯ν•©λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ 결정사항, μ•„ν‚€ν…μ²˜, μ„€μ • 등을 κΈ°λ‘ν•˜μ„Έμš”.
6
-
7
- ν‚€μ›Œλ“œ: κΈ°μ–΅ν•΄, remember, μ €μž₯ν•΄, save, memorize, keep
8
-
5
+ description: `μ€‘μš”ν•œ 정보λ₯Ό μž₯κΈ° λ©”λͺ¨λ¦¬μ— μ €μž₯ν•©λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ 결정사항, μ•„ν‚€ν…μ²˜, μ„€μ • 등을 κΈ°λ‘ν•˜μ„Έμš”.
6
+
7
+ ν‚€μ›Œλ“œ: κΈ°μ–΅ν•΄, remember, μ €μž₯ν•΄, save, memorize, keep
8
+
9
9
  πŸ’‘ μ €μž₯ ν›„ link_memories둜 κ΄€λ ¨ λ©”λͺ¨λ¦¬λ₯Ό μ—°κ²°ν•˜λ©΄ 지식 κ·Έλž˜ν”„κ°€ κ΅¬μΆ•λ©λ‹ˆλ‹€.`,
10
10
  inputSchema: {
11
11
  type: 'object',
@@ -2,19 +2,19 @@
2
2
  import { MemoryManager } from '../../lib/MemoryManager.js';
3
3
  export const searchMemoriesAdvancedDefinition = {
4
4
  name: 'search_memories_advanced',
5
- description: `κ³ κΈ‰ λ©€ν‹° μ „λž΅ λ©”λͺ¨λ¦¬ 검색을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
6
-
7
- ν‚€μ›Œλ“œ: κ³ κΈ‰ 검색, μ°Ύμ•„, 슀마트 검색, advanced search, find memories
8
-
9
- **검색 μ „λž΅:**
10
- - keyword: 전톡적 ν‚€μ›Œλ“œ 검색
11
- - graph_traversal: κ·Έλž˜ν”„ 기반 κ΄€λ ¨ λ©”λͺ¨λ¦¬ 탐색
12
- - temporal: μ‹œκ°„μˆœ μ •λ ¬
13
- - priority: μš°μ„ μˆœμœ„ 기반
14
- - context_aware: 볡합 μ „λž΅ (ν‚€μ›Œλ“œ + μš°μ„ μˆœμœ„ + μ΅œκ·Όμ„±)
15
-
16
- μ‚¬μš© μ˜ˆμ‹œ:
17
- - "authentication κ΄€λ ¨ λ©”λͺ¨λ¦¬ κ³ κΈ‰ 검색"
5
+ description: `κ³ κΈ‰ λ©€ν‹° μ „λž΅ λ©”λͺ¨λ¦¬ 검색을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
6
+
7
+ ν‚€μ›Œλ“œ: κ³ κΈ‰ 검색, μ°Ύμ•„, 슀마트 검색, advanced search, find memories
8
+
9
+ **검색 μ „λž΅:**
10
+ - keyword: 전톡적 ν‚€μ›Œλ“œ 검색
11
+ - graph_traversal: κ·Έλž˜ν”„ 기반 κ΄€λ ¨ λ©”λͺ¨λ¦¬ 탐색
12
+ - temporal: μ‹œκ°„μˆœ μ •λ ¬
13
+ - priority: μš°μ„ μˆœμœ„ 기반
14
+ - context_aware: 볡합 μ „λž΅ (ν‚€μ›Œλ“œ + μš°μ„ μˆœμœ„ + μ΅œκ·Όμ„±)
15
+
16
+ μ‚¬μš© μ˜ˆμ‹œ:
17
+ - "authentication κ΄€λ ¨ λ©”λͺ¨λ¦¬ κ³ κΈ‰ 검색"
18
18
  - "κ·Έλž˜ν”„ νƒμƒ‰μœΌλ‘œ project-architecture κ΄€λ ¨ λ©”λͺ¨λ¦¬ μ°ΎκΈ°"`,
19
19
  inputSchema: {
20
20
  type: 'object',
@@ -79,15 +79,15 @@ export async function searchMemoriesAdvanced(args) {
79
79
  return {
80
80
  content: [{
81
81
  type: 'text',
82
- text: `βœ— "${query}"에 λŒ€ν•œ 검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€.
83
-
84
- **μ‚¬μš©λœ μ „λž΅**: ${strategy}
85
- ${category ? `**μΉ΄ν…Œκ³ λ¦¬ ν•„ν„°**: ${category}` : ''}
86
-
87
- λ‹€λ₯Έ 검색 μ „λž΅μ„ μ‹œλ„ν•΄λ³΄μ„Έμš”:
88
- - keyword: κΈ°λ³Έ ν‚€μ›Œλ“œ λ§€μΉ­
89
- - temporal: μ΅œμ‹  λ©”λͺ¨λ¦¬ μš°μ„ 
90
- - priority: μ€‘μš” λ©”λͺ¨λ¦¬ μš°μ„ 
82
+ text: `βœ— "${query}"에 λŒ€ν•œ 검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€.
83
+
84
+ **μ‚¬μš©λœ μ „λž΅**: ${strategy}
85
+ ${category ? `**μΉ΄ν…Œκ³ λ¦¬ ν•„ν„°**: ${category}` : ''}
86
+
87
+ λ‹€λ₯Έ 검색 μ „λž΅μ„ μ‹œλ„ν•΄λ³΄μ„Έμš”:
88
+ - keyword: κΈ°λ³Έ ν‚€μ›Œλ“œ λ§€μΉ­
89
+ - temporal: μ΅œμ‹  λ©”λͺ¨λ¦¬ μš°μ„ 
90
+ - priority: μ€‘μš” λ©”λͺ¨λ¦¬ μš°μ„ 
91
91
  - context_aware: μ’…ν•© 점수`
92
92
  }]
93
93
  };
@@ -107,52 +107,52 @@ export async function generatePrd(args) {
107
107
  ],
108
108
  status: 'success'
109
109
  };
110
- const formattedPrd = `# ${prd.document.title}
111
-
112
- **Version:** ${prd.document.version}
113
- **Date:** ${prd.document.date}
114
-
115
- ## ${prd.document.sections.executiveSummary.title}
116
- ${prd.document.sections.executiveSummary.content}
117
-
118
- ## ${prd.document.sections.productOverview.title}
119
- **Vision:** ${prd.document.sections.productOverview.vision}
120
- **Objectives:** ${prd.document.sections.productOverview.objectives}
121
- **Target Users:** ${prd.document.sections.productOverview.targetUsers}
122
-
123
- **Success Metrics:**
124
- ${prd.document.sections.productOverview.successMetrics.map(metric => `- ${metric}`).join('\n')}
125
-
126
- ## ${prd.document.sections.functionalRequirements.title}
127
- ${prd.document.sections.functionalRequirements.description}
128
-
129
- **Core Features:**
130
- ${prd.document.sections.functionalRequirements.coreFeatures.map(feature => `- ${feature}`).join('\n')}
131
-
132
- **User Flows:**
133
- ${prd.document.sections.functionalRequirements.userFlows.map(flow => `- ${flow}`).join('\n')}
134
-
135
- ## ${prd.document.sections.nonFunctionalRequirements.title}
136
- - **Performance:** ${prd.document.sections.nonFunctionalRequirements.performance}
137
- - **Security:** ${prd.document.sections.nonFunctionalRequirements.security}
138
- - **Scalability:** ${prd.document.sections.nonFunctionalRequirements.scalability}
139
- - **Usability:** ${prd.document.sections.nonFunctionalRequirements.usability}
140
- - **Compatibility:** ${prd.document.sections.nonFunctionalRequirements.compatibility}
141
-
142
- ## ${prd.document.sections.constraints.title}
143
- - **Technical:** ${prd.document.sections.constraints.technical}
144
- - **Timeline:** ${prd.document.sections.constraints.timeline}
145
- - **Budget:** ${prd.document.sections.constraints.budget}
146
- - **Resources:** ${prd.document.sections.constraints.resources}
147
-
148
- ## ${prd.document.sections.implementationPlan.title}
149
- **Development Phases:**
150
- ${prd.document.sections.implementationPlan.phases.map(phase => `- ${phase}`).join('\n')}
151
-
152
- **Risk Mitigation:**
153
- ${prd.document.sections.implementationPlan.riskMitigation.map(risk => `- ${risk}`).join('\n')}
154
-
155
- ## Recommendations
110
+ const formattedPrd = `# ${prd.document.title}
111
+
112
+ **Version:** ${prd.document.version}
113
+ **Date:** ${prd.document.date}
114
+
115
+ ## ${prd.document.sections.executiveSummary.title}
116
+ ${prd.document.sections.executiveSummary.content}
117
+
118
+ ## ${prd.document.sections.productOverview.title}
119
+ **Vision:** ${prd.document.sections.productOverview.vision}
120
+ **Objectives:** ${prd.document.sections.productOverview.objectives}
121
+ **Target Users:** ${prd.document.sections.productOverview.targetUsers}
122
+
123
+ **Success Metrics:**
124
+ ${prd.document.sections.productOverview.successMetrics.map(metric => `- ${metric}`).join('\n')}
125
+
126
+ ## ${prd.document.sections.functionalRequirements.title}
127
+ ${prd.document.sections.functionalRequirements.description}
128
+
129
+ **Core Features:**
130
+ ${prd.document.sections.functionalRequirements.coreFeatures.map(feature => `- ${feature}`).join('\n')}
131
+
132
+ **User Flows:**
133
+ ${prd.document.sections.functionalRequirements.userFlows.map(flow => `- ${flow}`).join('\n')}
134
+
135
+ ## ${prd.document.sections.nonFunctionalRequirements.title}
136
+ - **Performance:** ${prd.document.sections.nonFunctionalRequirements.performance}
137
+ - **Security:** ${prd.document.sections.nonFunctionalRequirements.security}
138
+ - **Scalability:** ${prd.document.sections.nonFunctionalRequirements.scalability}
139
+ - **Usability:** ${prd.document.sections.nonFunctionalRequirements.usability}
140
+ - **Compatibility:** ${prd.document.sections.nonFunctionalRequirements.compatibility}
141
+
142
+ ## ${prd.document.sections.constraints.title}
143
+ - **Technical:** ${prd.document.sections.constraints.technical}
144
+ - **Timeline:** ${prd.document.sections.constraints.timeline}
145
+ - **Budget:** ${prd.document.sections.constraints.budget}
146
+ - **Resources:** ${prd.document.sections.constraints.resources}
147
+
148
+ ## ${prd.document.sections.implementationPlan.title}
149
+ **Development Phases:**
150
+ ${prd.document.sections.implementationPlan.phases.map(phase => `- ${phase}`).join('\n')}
151
+
152
+ **Risk Mitigation:**
153
+ ${prd.document.sections.implementationPlan.riskMitigation.map(risk => `- ${risk}`).join('\n')}
154
+
155
+ ## Recommendations
156
156
  ${prd.recommendations.map(rec => `- ${rec}`).join('\n')}`;
157
157
  return {
158
158
  content: [{ type: 'text', text: formattedPrd }]
@@ -99,134 +99,134 @@ export async function enhancePromptGemini(args) {
99
99
  // Helper methods
100
100
  function addFewShotExamples(prompt, agent_role) {
101
101
  const examples = {
102
- 'Specification Agent': `
103
- **μ˜ˆμ‹œ 1: ν‘Έμ‹œ μ•Œλ¦Ό μ„€μ •**
104
- μž…λ ₯: "λŒ“κΈ€, μ’‹μ•„μš”, νŒ”λ‘œμš° μ•Œλ¦Όμ„ 켜고 끌 수 있게 ν•΄μ£Όμ„Έμš”"
105
- 좜λ ₯:
106
- - μ•Œλ¦Ό μœ ν˜•: 6개 (λŒ“κΈ€, μ’‹μ•„μš”, νŒ”λ‘œμš°, 곡지, 이벀트, λ§ˆμΌ€νŒ…)
107
- - μ„€μ • 방식: ON/OFF ν† κΈ€
108
- - λ””μžμΈ μ°Έκ³ : iOS Settings > Notifications
109
- - 기술 μŠ€νƒ: FCM (κΈ°μ‘΄ μ‚¬μš© 쀑)
110
-
111
- **μ˜ˆμ‹œ 2: μ‚¬μš©μž ν”„λ‘œν•„ νŽΈμ§‘**
112
- μž…λ ₯: "ν”„λ‘œν•„ μ‚¬μ§„μ΄λž‘ μžκΈ°μ†Œκ°œλ₯Ό λ°”κΏ€ 수 있게 ν•΄μ£Όμ„Έμš”"
113
- 좜λ ₯:
114
- - νŽΈμ§‘ ν•­λͺ©: ν”„λ‘œν•„ 사진, μžκΈ°μ†Œκ°œ, ν‘œμ‹œ 이름
115
- - 검증: 이미지 크기 < 5MB, μžκΈ°μ†Œκ°œ < 500자
116
- - UI νŒ¨ν„΄: 인라인 νŽΈμ§‘ (λͺ¨λ‹¬ μ•„λ‹˜)
102
+ 'Specification Agent': `
103
+ **μ˜ˆμ‹œ 1: ν‘Έμ‹œ μ•Œλ¦Ό μ„€μ •**
104
+ μž…λ ₯: "λŒ“κΈ€, μ’‹μ•„μš”, νŒ”λ‘œμš° μ•Œλ¦Όμ„ 켜고 끌 수 있게 ν•΄μ£Όμ„Έμš”"
105
+ 좜λ ₯:
106
+ - μ•Œλ¦Ό μœ ν˜•: 6개 (λŒ“κΈ€, μ’‹μ•„μš”, νŒ”λ‘œμš°, 곡지, 이벀트, λ§ˆμΌ€νŒ…)
107
+ - μ„€μ • 방식: ON/OFF ν† κΈ€
108
+ - λ””μžμΈ μ°Έκ³ : iOS Settings > Notifications
109
+ - 기술 μŠ€νƒ: FCM (κΈ°μ‘΄ μ‚¬μš© 쀑)
110
+
111
+ **μ˜ˆμ‹œ 2: μ‚¬μš©μž ν”„λ‘œν•„ νŽΈμ§‘**
112
+ μž…λ ₯: "ν”„λ‘œν•„ μ‚¬μ§„μ΄λž‘ μžκΈ°μ†Œκ°œλ₯Ό λ°”κΏ€ 수 있게 ν•΄μ£Όμ„Έμš”"
113
+ 좜λ ₯:
114
+ - νŽΈμ§‘ ν•­λͺ©: ν”„λ‘œν•„ 사진, μžκΈ°μ†Œκ°œ, ν‘œμ‹œ 이름
115
+ - 검증: 이미지 크기 < 5MB, μžκΈ°μ†Œκ°œ < 500자
116
+ - UI νŒ¨ν„΄: 인라인 νŽΈμ§‘ (λͺ¨λ‹¬ μ•„λ‹˜)
117
117
  - μ €μž₯ 방식: μžλ™ μ €μž₯ (debounce 500ms)`,
118
- 'Planning Agent': `
119
- **μ˜ˆμ‹œ 1: API μ—”λ“œν¬μΈνŠΈ μΆ”κ°€**
120
- μž…λ ₯: "μ‚¬μš©μž νŒ”λ‘œμš°/μ–ΈνŒ”λ‘œμš° κΈ°λŠ₯"
121
- 좜λ ₯:
122
- - Phase 1: Backend (8μ‹œκ°„)
123
- - DB μŠ€ν‚€λ§ˆ (follows ν…Œμ΄λΈ”)
124
- - API μ—”λ“œν¬μΈνŠΈ (POST /follows, DELETE /follows/:id)
125
- - λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 (쀑볡 λ°©μ§€, 자기 νŒ”λ‘œμš° κΈˆμ§€)
126
- - Phase 2: Frontend (6μ‹œκ°„)
127
- - νŒ”λ‘œμš° λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈ
128
- - νŒ”λ‘œμ›Œ/νŒ”λ‘œμž‰ λͺ©λ‘
129
- - λΉ„μš© 영ν–₯: +0원 (κΈ°μ‘΄ 인프라 ν™œμš©)
130
-
131
- **μ˜ˆμ‹œ 2: μ‹€μ‹œκ°„ μ•Œλ¦Ό**
132
- μž…λ ₯: "λŒ“κΈ€ 달리면 μ‹€μ‹œκ°„μœΌλ‘œ μ•Œλ¦Ό"
133
- 좜λ ₯:
134
- - Phase 1: WebSocket μ„œλ²„ ꡬ좕 (12μ‹œκ°„)
135
- - Phase 2: ν΄λΌμ΄μ–ΈνŠΈ ꡬ독 둜직 (8μ‹œκ°„)
136
- - Phase 3: μ•Œλ¦Ό UI (6μ‹œκ°„)
118
+ 'Planning Agent': `
119
+ **μ˜ˆμ‹œ 1: API μ—”λ“œν¬μΈνŠΈ μΆ”κ°€**
120
+ μž…λ ₯: "μ‚¬μš©μž νŒ”λ‘œμš°/μ–ΈνŒ”λ‘œμš° κΈ°λŠ₯"
121
+ 좜λ ₯:
122
+ - Phase 1: Backend (8μ‹œκ°„)
123
+ - DB μŠ€ν‚€λ§ˆ (follows ν…Œμ΄λΈ”)
124
+ - API μ—”λ“œν¬μΈνŠΈ (POST /follows, DELETE /follows/:id)
125
+ - λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 (쀑볡 λ°©μ§€, 자기 νŒ”λ‘œμš° κΈˆμ§€)
126
+ - Phase 2: Frontend (6μ‹œκ°„)
127
+ - νŒ”λ‘œμš° λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈ
128
+ - νŒ”λ‘œμ›Œ/νŒ”λ‘œμž‰ λͺ©λ‘
129
+ - λΉ„μš© 영ν–₯: +0원 (κΈ°μ‘΄ 인프라 ν™œμš©)
130
+
131
+ **μ˜ˆμ‹œ 2: μ‹€μ‹œκ°„ μ•Œλ¦Ό**
132
+ μž…λ ₯: "λŒ“κΈ€ 달리면 μ‹€μ‹œκ°„μœΌλ‘œ μ•Œλ¦Ό"
133
+ 좜λ ₯:
134
+ - Phase 1: WebSocket μ„œλ²„ ꡬ좕 (12μ‹œκ°„)
135
+ - Phase 2: ν΄λΌμ΄μ–ΈνŠΈ ꡬ독 둜직 (8μ‹œκ°„)
136
+ - Phase 3: μ•Œλ¦Ό UI (6μ‹œκ°„)
137
137
  - λΉ„μš© 영ν–₯: +$20/μ›” (Redis Pub/Sub)`
138
138
  };
139
- return examples[agent_role] || `
140
- **Few-Shot μ˜ˆμ‹œλ₯Ό μž‘μ—… μœ ν˜•μ— 맞게 μΆ”κ°€**:
141
- - μ˜ˆμ‹œ 1: [ꡬ체적인 μž…λ ₯] β†’ [λͺ…ν™•ν•œ 좜λ ₯]
142
- - μ˜ˆμ‹œ 2: [λ‹€λ₯Έ ν˜•νƒœμ˜ μž…λ ₯] β†’ [μΌκ΄€λœ ν˜•μ‹μ˜ 좜λ ₯]
143
- - μ˜ˆμ‹œ 3: [μ—£μ§€ μΌ€μ΄μŠ€] β†’ [처리 방법]
144
-
145
- **μ§€μΉ¨**:
146
- - 2-3개 μ˜ˆμ‹œ (과적합 λ°©μ§€)
147
- - λ‹€μ–‘ν•œ μ‹œλ‚˜λ¦¬μ˜€ 포함
139
+ return examples[agent_role] || `
140
+ **Few-Shot μ˜ˆμ‹œλ₯Ό μž‘μ—… μœ ν˜•μ— 맞게 μΆ”κ°€**:
141
+ - μ˜ˆμ‹œ 1: [ꡬ체적인 μž…λ ₯] β†’ [λͺ…ν™•ν•œ 좜λ ₯]
142
+ - μ˜ˆμ‹œ 2: [λ‹€λ₯Έ ν˜•νƒœμ˜ μž…λ ₯] β†’ [μΌκ΄€λœ ν˜•μ‹μ˜ 좜λ ₯]
143
+ - μ˜ˆμ‹œ 3: [μ—£μ§€ μΌ€μ΄μŠ€] β†’ [처리 방법]
144
+
145
+ **μ§€μΉ¨**:
146
+ - 2-3개 μ˜ˆμ‹œ (과적합 λ°©μ§€)
147
+ - λ‹€μ–‘ν•œ μ‹œλ‚˜λ¦¬μ˜€ 포함
148
148
  - μΌκ΄€λœ 좜λ ₯ ν˜•μ‹ μœ μ§€`;
149
149
  }
150
150
  function specifyOutputFormat(prompt, agent_role) {
151
151
  const formats = {
152
- 'Specification Agent': `
153
- **좜λ ₯ ν˜•μ‹ (λ§ˆν¬λ‹€μš΄ + YAML frontmatter)**:
154
-
155
- \`\`\`markdown
156
- ---
157
- title: [κΈ°λŠ₯ 이름]
158
- priority: [HIGH/MEDIUM/LOW]
159
- created: [λ‚ μ§œ]
160
- ---
161
-
162
- # SPEC: [κΈ°λŠ₯ 이름]
163
-
164
- ## REQ-001: [μš”κ΅¬μ‚¬ν•­ 제λͺ©]
165
- **WHEN** [쑰건]
166
- **THEN** [κ²°κ³Ό]
167
-
168
- ### Acceptance Criteria
169
- - [ ] [κΈ°μ€€ 1]
170
- - [ ] [κΈ°μ€€ 2]
171
- \`\`\`
172
-
152
+ 'Specification Agent': `
153
+ **좜λ ₯ ν˜•μ‹ (λ§ˆν¬λ‹€μš΄ + YAML frontmatter)**:
154
+
155
+ \`\`\`markdown
156
+ ---
157
+ title: [κΈ°λŠ₯ 이름]
158
+ priority: [HIGH/MEDIUM/LOW]
159
+ created: [λ‚ μ§œ]
160
+ ---
161
+
162
+ # SPEC: [κΈ°λŠ₯ 이름]
163
+
164
+ ## REQ-001: [μš”κ΅¬μ‚¬ν•­ 제λͺ©]
165
+ **WHEN** [쑰건]
166
+ **THEN** [κ²°κ³Ό]
167
+
168
+ ### Acceptance Criteria
169
+ - [ ] [κΈ°μ€€ 1]
170
+ - [ ] [κΈ°μ€€ 2]
171
+ \`\`\`
172
+
173
173
  **응닡 접두사**: "# SPEC: "둜 μ‹œμž‘ν•˜μ—¬ λͺ¨λΈμ΄ μ˜¬λ°”λ₯Έ ν˜•μ‹μœΌλ‘œ μ™„μ„±ν•˜λ„λ‘ μœ λ„`,
174
- 'Planning Agent': `
175
- **좜λ ₯ ν˜•μ‹ (κ΅¬μ‘°ν™”λœ λ§ˆν¬λ‹€μš΄)**:
176
-
177
- \`\`\`markdown
178
- # PLAN: [κΈ°λŠ₯ 이름]
179
-
180
- ## Architecture
181
- - Backend: [기술 μŠ€νƒ]
182
- - Frontend: [기술 μŠ€νƒ]
183
- - Database: [μŠ€ν‚€λ§ˆ 변경사항]
184
-
185
- ## Timeline
186
- | Phase | Tasks | Duration |
187
- |-------|-------|----------|
188
- | 1 | ... | 8h |
189
-
190
- ## Cost Analysis
191
- - Infrastructure: +$X/μ›”
192
- - Third-party: +$Y/μ›”
193
- - Total: +$Z/μ›”
194
- \`\`\`
195
-
174
+ 'Planning Agent': `
175
+ **좜λ ₯ ν˜•μ‹ (κ΅¬μ‘°ν™”λœ λ§ˆν¬λ‹€μš΄)**:
176
+
177
+ \`\`\`markdown
178
+ # PLAN: [κΈ°λŠ₯ 이름]
179
+
180
+ ## Architecture
181
+ - Backend: [기술 μŠ€νƒ]
182
+ - Frontend: [기술 μŠ€νƒ]
183
+ - Database: [μŠ€ν‚€λ§ˆ 변경사항]
184
+
185
+ ## Timeline
186
+ | Phase | Tasks | Duration |
187
+ |-------|-------|----------|
188
+ | 1 | ... | 8h |
189
+
190
+ ## Cost Analysis
191
+ - Infrastructure: +$X/μ›”
192
+ - Third-party: +$Y/μ›”
193
+ - Total: +$Z/μ›”
194
+ \`\`\`
195
+
196
196
  **응닡 접두사**: "# PLAN: "둜 μ‹œμž‘`
197
197
  };
198
- return formats[agent_role] || `
199
- **좜λ ₯ ν˜•μ‹ λͺ…μ‹œ**:
200
- - λ§ˆν¬λ‹€μš΄ ν—€λ”λ‘œ μ„Ήμ…˜ ꡬ뢄 (##, ###)
201
- - ν…Œμ΄λΈ”, 뢈릿 포인트, μ²΄ν¬λ°•μŠ€ ν™œμš©
202
- - XML νƒœκ·Έλ‘œ 의미 κ΅¬μ„±μš”μ†Œ λ ˆμ΄λΈ”λ§ (선택)
203
- 예: <analysis>...</analysis>, <recommendation>...</recommendation>
204
- - 응닡 μ ‘λ‘μ‚¬λ‘œ μ™„μ„± μœ λ„
198
+ return formats[agent_role] || `
199
+ **좜λ ₯ ν˜•μ‹ λͺ…μ‹œ**:
200
+ - λ§ˆν¬λ‹€μš΄ ν—€λ”λ‘œ μ„Ήμ…˜ ꡬ뢄 (##, ###)
201
+ - ν…Œμ΄λΈ”, 뢈릿 포인트, μ²΄ν¬λ°•μŠ€ ν™œμš©
202
+ - XML νƒœκ·Έλ‘œ 의미 κ΅¬μ„±μš”μ†Œ λ ˆμ΄λΈ”λ§ (선택)
203
+ 예: <analysis>...</analysis>, <recommendation>...</recommendation>
204
+ - 응닡 μ ‘λ‘μ‚¬λ‘œ μ™„μ„± μœ λ„
205
205
  예: "뢄석 κ²°κ³Ό: "둜 μ‹œμž‘ν•˜λ©΄ λͺ¨λΈμ΄ 뢄석 λ‚΄μš©μœΌλ‘œ μ™„μ„±`;
206
206
  }
207
207
  function optimizeContextPlacement(prompt) {
208
- return `
209
- **μ»¨ν…μŠ€νŠΈ 배치 μ΅œμ ν™” (Gemini 3 ꢌμž₯)**:
210
-
211
- 1. **κΈ΄ μ»¨ν…μŠ€νŠΈλ₯Ό μ•žμ— 배치**:
212
- \`\`\`
213
- [기술 μŠ€νƒ 정보 (CLAUDE.md λ‚΄μš©)]
214
- [κΈ°μ‘΄ μ½”λ“œλ² μ΄μŠ€ ꡬ쑰]
215
- [κ΄€λ ¨ SPEC/PLAN λ¬Έμ„œ]
216
-
217
- --- 이후 ꡬ체적 μš”μ²­ ---
218
-
219
- [μ‚¬μš©μžμ˜ ꡬ체적 μ§ˆλ¬Έμ΄λ‚˜ μž‘μ—…]
220
- \`\`\`
221
-
222
- 2. **μ»¨ν…μŠ€νŠΈ ꡬ쑰화**:
223
- - μΉ΄ν…Œκ³ λ¦¬λ³„λ‘œ κ·Έλ£Ήν™” (기술 μŠ€νƒ, μ•„ν‚€ν…μ²˜, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직)
224
- - μ€‘μš”ν•œ μ œμ•½ 쑰건은 λ°˜λ³΅ν•΄μ„œ κ°•μ‘°
225
- - μ°Έμ‘° κ°€λŠ₯ν•˜λ„λ‘ λͺ…ν™•ν•œ λ ˆμ΄λΈ”λ§
226
-
227
- 3. **λͺ…μ‹œμ  μ§€μ‹œμ‚¬ν•­ 배치**:
228
- - μ»¨ν…μŠ€νŠΈ λ‹€μŒμ— ꡬ체적 μž‘μ—… μ§€μ‹œ
229
- - 단계별 μ§€μΉ¨ (1, 2, 3...)
208
+ return `
209
+ **μ»¨ν…μŠ€νŠΈ 배치 μ΅œμ ν™” (Gemini 3 ꢌμž₯)**:
210
+
211
+ 1. **κΈ΄ μ»¨ν…μŠ€νŠΈλ₯Ό μ•žμ— 배치**:
212
+ \`\`\`
213
+ [기술 μŠ€νƒ 정보 (CLAUDE.md λ‚΄μš©)]
214
+ [κΈ°μ‘΄ μ½”λ“œλ² μ΄μŠ€ ꡬ쑰]
215
+ [κ΄€λ ¨ SPEC/PLAN λ¬Έμ„œ]
216
+
217
+ --- 이후 ꡬ체적 μš”μ²­ ---
218
+
219
+ [μ‚¬μš©μžμ˜ ꡬ체적 μ§ˆλ¬Έμ΄λ‚˜ μž‘μ—…]
220
+ \`\`\`
221
+
222
+ 2. **μ»¨ν…μŠ€νŠΈ ꡬ쑰화**:
223
+ - μΉ΄ν…Œκ³ λ¦¬λ³„λ‘œ κ·Έλ£Ήν™” (기술 μŠ€νƒ, μ•„ν‚€ν…μ²˜, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직)
224
+ - μ€‘μš”ν•œ μ œμ•½ 쑰건은 λ°˜λ³΅ν•΄μ„œ κ°•μ‘°
225
+ - μ°Έμ‘° κ°€λŠ₯ν•˜λ„λ‘ λͺ…ν™•ν•œ λ ˆμ΄λΈ”λ§
226
+
227
+ 3. **λͺ…μ‹œμ  μ§€μ‹œμ‚¬ν•­ 배치**:
228
+ - μ»¨ν…μŠ€νŠΈ λ‹€μŒμ— ꡬ체적 μž‘μ—… μ§€μ‹œ
229
+ - 단계별 μ§€μΉ¨ (1, 2, 3...)
230
230
  - 좜λ ₯ ν˜•μ‹ μ˜ˆμ‹œ`;
231
231
  }
232
232
  function decomposePrompt(prompt, agent_role) {
@@ -234,32 +234,32 @@ function decomposePrompt(prompt, agent_role) {
234
234
  if (!isComplex) {
235
235
  return '**ν”„λ‘¬ν”„νŠΈ λΆ„ν•΄ λΆˆν•„μš”**: λ‹¨μˆœν•œ μž‘μ—…μ΄λ―€λ‘œ 단일 ν”„λ‘¬ν”„νŠΈλ‘œ μΆ©λΆ„ν•©λ‹ˆλ‹€.';
236
236
  }
237
- return `
238
- **ν”„λ‘¬ν”„νŠΈ λΆ„ν•΄ (순차적 체인)**:
239
-
240
- **Step 1: 정보 μˆ˜μ§‘**
241
- \`\`\`
242
- ν”„λ‘¬ν”„νŠΈ: "${prompt.slice(0, 100)}..."에 λŒ€ν•œ ν•„μˆ˜ 정보λ₯Ό μ‹λ³„ν•˜μ„Έμš”.
243
- 좜λ ₯: ν•„μš”ν•œ 기술 μŠ€νƒ, μ œμ•½ 쑰건, μ„ ν–‰ μž‘μ—… λͺ©λ‘
244
- \`\`\`
245
-
246
- **Step 2: 뢄석 및 κ³„νš**
247
- \`\`\`
248
- ν”„λ‘¬ν”„νŠΈ: Step 1의 정보λ₯Ό λ°”νƒ•μœΌλ‘œ κ΅¬ν˜„ κ³„νšμ„ μž‘μ„±ν•˜μ„Έμš”.
249
- μž…λ ₯: [Step 1의 좜λ ₯]
250
- 좜λ ₯: Phase별 μž‘μ—…, νƒ€μž„λΌμΈ, 리슀크
251
- \`\`\`
252
-
253
- **Step 3: μ„ΈλΆ€ μž‘μ—… 생성**
254
- \`\`\`
255
- ν”„λ‘¬ν”„νŠΈ: Step 2의 κ³„νšμ„ μ‹€ν–‰ κ°€λŠ₯ν•œ μž‘μ—…μœΌλ‘œ λΆ„ν•΄ν•˜μ„Έμš”.
256
- μž…λ ₯: [Step 2의 좜λ ₯]
257
- 좜λ ₯: Task λͺ©λ‘ (μ˜μ‘΄μ„± 포함)
258
- \`\`\`
259
-
260
- **μž₯점**:
261
- - 각 λ‹¨κ³„μ˜ 좜λ ₯ ν’ˆμ§ˆ ν–₯상
262
- - 쀑간 검증 κ°€λŠ₯
237
+ return `
238
+ **ν”„λ‘¬ν”„νŠΈ λΆ„ν•΄ (순차적 체인)**:
239
+
240
+ **Step 1: 정보 μˆ˜μ§‘**
241
+ \`\`\`
242
+ ν”„λ‘¬ν”„νŠΈ: "${prompt.slice(0, 100)}..."에 λŒ€ν•œ ν•„μˆ˜ 정보λ₯Ό μ‹λ³„ν•˜μ„Έμš”.
243
+ 좜λ ₯: ν•„μš”ν•œ 기술 μŠ€νƒ, μ œμ•½ 쑰건, μ„ ν–‰ μž‘μ—… λͺ©λ‘
244
+ \`\`\`
245
+
246
+ **Step 2: 뢄석 및 κ³„νš**
247
+ \`\`\`
248
+ ν”„λ‘¬ν”„νŠΈ: Step 1의 정보λ₯Ό λ°”νƒ•μœΌλ‘œ κ΅¬ν˜„ κ³„νšμ„ μž‘μ„±ν•˜μ„Έμš”.
249
+ μž…λ ₯: [Step 1의 좜λ ₯]
250
+ 좜λ ₯: Phase별 μž‘μ—…, νƒ€μž„λΌμΈ, 리슀크
251
+ \`\`\`
252
+
253
+ **Step 3: μ„ΈλΆ€ μž‘μ—… 생성**
254
+ \`\`\`
255
+ ν”„λ‘¬ν”„νŠΈ: Step 2의 κ³„νšμ„ μ‹€ν–‰ κ°€λŠ₯ν•œ μž‘μ—…μœΌλ‘œ λΆ„ν•΄ν•˜μ„Έμš”.
256
+ μž…λ ₯: [Step 2의 좜λ ₯]
257
+ 좜λ ₯: Task λͺ©λ‘ (μ˜μ‘΄μ„± 포함)
258
+ \`\`\`
259
+
260
+ **μž₯점**:
261
+ - 각 λ‹¨κ³„μ˜ 좜λ ₯ ν’ˆμ§ˆ ν–₯상
262
+ - 쀑간 검증 κ°€λŠ₯
263
263
  - μ—λŸ¬ λ°œμƒ μ‹œ νŠΉμ • λ‹¨κ³„λ§Œ μž¬μ‹€ν–‰`;
264
264
  }
265
265
  function suggestParameters(prompt, agent_role) {
@@ -277,24 +277,24 @@ function suggestParameters(prompt, agent_role) {
277
277
  topP = 0.8;
278
278
  topK = 20;
279
279
  }
280
- return `
281
- **ꢌμž₯ λ§€κ°œλ³€μˆ˜** (μž‘μ—… νŠΉμ„± 기반):
282
-
283
- - **Temperature**: ${temperature}
284
- ${temperature > 0.7 ? '창의적 μž‘μ—…μ— 적합 (λ‹€μ–‘ν•œ μ˜΅μ…˜ 탐색)' : '결정적 μž‘μ—…μ— 적합 (μΌκ΄€λœ 좜λ ₯)'}
285
-
286
- - **Top-P**: ${topP}
287
- λˆ„μ  ν™•λ₯  ${topP * 100}%κΉŒμ§€μ˜ ν† ν°λ§Œ 선택
288
-
289
- - **Top-K**: ${topK}
290
- μƒμœ„ ${topK}개 ν† ν°λ§Œ κ³ λ €
291
-
292
- - **Max Output Tokens**: ${agent_role === 'Specification Agent' ? '4000 (상세 λ¬Έμ„œ)' : '2000 (일반)'}
293
-
294
- - **Stop Sequences**: ["---END---", "\`\`\`"] (선택)
295
-
296
- **주의**:
297
- - Gemini 3λŠ” temperature κΈ°λ³Έκ°’ 1.0 μœ μ§€ ꢌμž₯
280
+ return `
281
+ **ꢌμž₯ λ§€κ°œλ³€μˆ˜** (μž‘μ—… νŠΉμ„± 기반):
282
+
283
+ - **Temperature**: ${temperature}
284
+ ${temperature > 0.7 ? '창의적 μž‘μ—…μ— 적합 (λ‹€μ–‘ν•œ μ˜΅μ…˜ 탐색)' : '결정적 μž‘μ—…μ— 적합 (μΌκ΄€λœ 좜λ ₯)'}
285
+
286
+ - **Top-P**: ${topP}
287
+ λˆ„μ  ν™•λ₯  ${topP * 100}%κΉŒμ§€μ˜ ν† ν°λ§Œ 선택
288
+
289
+ - **Top-K**: ${topK}
290
+ μƒμœ„ ${topK}개 ν† ν°λ§Œ κ³ λ €
291
+
292
+ - **Max Output Tokens**: ${agent_role === 'Specification Agent' ? '4000 (상세 λ¬Έμ„œ)' : '2000 (일반)'}
293
+
294
+ - **Stop Sequences**: ["---END---", "\`\`\`"] (선택)
295
+
296
+ **주의**:
297
+ - Gemini 3λŠ” temperature κΈ°λ³Έκ°’ 1.0 μœ μ§€ ꢌμž₯
298
298
  - μ˜ˆμƒμΉ˜ λͺ»ν•œ λ™μž‘ λ°©μ§€λ₯Ό μœ„ν•΄ κΈ°λ³Έκ°’μ—μ„œ 크게 λ²—μ–΄λ‚˜μ§€ μ•ŠκΈ°`;
299
299
  }
300
300
  function combineEnhancements(prompt, enhancements) {
@@ -308,7 +308,7 @@ function combineEnhancements(prompt, enhancements) {
308
308
  return enhanced;
309
309
  }
310
310
  function generateSummary(enhancements) {
311
- return `${enhancements.length}개의 Gemini ν”„λ‘¬ν”„νŒ… μ „λž΅μ„ μ μš©ν•˜μ—¬ ν”„λ‘¬ν”„νŠΈ ν’ˆμ§ˆμ„ ν–₯μƒμ‹œμΌ°μŠ΅λ‹ˆλ‹€:
311
+ return `${enhancements.length}개의 Gemini ν”„λ‘¬ν”„νŒ… μ „λž΅μ„ μ μš©ν•˜μ—¬ ν”„λ‘¬ν”„νŠΈ ν’ˆμ§ˆμ„ ν–₯μƒμ‹œμΌ°μŠ΅λ‹ˆλ‹€:
312
312
  ${enhancements.map(e => `- ${e.strategy}: ${e.improvement}`).join('\n')}`;
313
313
  }
314
314
  function formatOutput(result) {