@su-record/vibe 2.6.13 → 2.6.15

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 (234) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +497 -497
  3. package/agents/architect-low.md +41 -41
  4. package/agents/architect-medium.md +59 -59
  5. package/agents/architect.md +80 -80
  6. package/agents/build-error-resolver.md +115 -115
  7. package/agents/compounder.md +261 -261
  8. package/agents/diagrammer.md +178 -178
  9. package/agents/e2e-tester.md +266 -266
  10. package/agents/explorer-low.md +42 -42
  11. package/agents/explorer-medium.md +59 -59
  12. package/agents/explorer.md +48 -48
  13. package/agents/implementer-low.md +43 -43
  14. package/agents/implementer-medium.md +52 -52
  15. package/agents/implementer.md +54 -54
  16. package/agents/refactor-cleaner.md +143 -143
  17. package/agents/research/best-practices-agent.md +199 -199
  18. package/agents/research/codebase-patterns-agent.md +157 -157
  19. package/agents/research/framework-docs-agent.md +188 -188
  20. package/agents/research/security-advisory-agent.md +213 -213
  21. package/agents/review/architecture-reviewer.md +107 -107
  22. package/agents/review/complexity-reviewer.md +116 -116
  23. package/agents/review/data-integrity-reviewer.md +88 -88
  24. package/agents/review/git-history-reviewer.md +103 -103
  25. package/agents/review/performance-reviewer.md +86 -86
  26. package/agents/review/python-reviewer.md +150 -150
  27. package/agents/review/rails-reviewer.md +139 -139
  28. package/agents/review/react-reviewer.md +144 -144
  29. package/agents/review/security-reviewer.md +80 -80
  30. package/agents/review/simplicity-reviewer.md +140 -140
  31. package/agents/review/test-coverage-reviewer.md +116 -116
  32. package/agents/review/typescript-reviewer.md +127 -127
  33. package/agents/searcher.md +54 -54
  34. package/agents/simplifier.md +120 -120
  35. package/agents/tester.md +49 -49
  36. package/agents/ui-previewer.md +268 -268
  37. package/commands/vibe.analyze.md +356 -356
  38. package/commands/vibe.reason.md +329 -329
  39. package/commands/vibe.review.md +412 -412
  40. package/commands/vibe.run.md +1266 -1266
  41. package/commands/vibe.spec.md +1054 -1054
  42. package/commands/vibe.spec.review.md +319 -319
  43. package/commands/vibe.trace.md +161 -161
  44. package/commands/vibe.utils.md +376 -376
  45. package/commands/vibe.verify.md +375 -375
  46. package/dist/cli/collaborator.js +52 -52
  47. package/dist/cli/detect.d.ts.map +1 -1
  48. package/dist/cli/detect.js +118 -44
  49. package/dist/cli/detect.js.map +1 -1
  50. package/dist/cli/hud.js +20 -20
  51. package/dist/cli/index.js +118 -118
  52. package/dist/cli/index.js.map +1 -1
  53. package/dist/cli/llm.js +144 -144
  54. package/dist/cli/mcp.d.ts +49 -0
  55. package/dist/cli/mcp.d.ts.map +1 -0
  56. package/dist/cli/mcp.js +169 -0
  57. package/dist/cli/mcp.js.map +1 -0
  58. package/dist/cli/postinstall.js +858 -858
  59. package/dist/cli/setup/ProjectSetup.d.ts +3 -0
  60. package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
  61. package/dist/cli/setup/ProjectSetup.js +28 -6
  62. package/dist/cli/setup/ProjectSetup.js.map +1 -1
  63. package/dist/lib/DeepInit.js +24 -24
  64. package/dist/lib/IterationTracker.js +11 -11
  65. package/dist/lib/PythonParser.js +108 -108
  66. package/dist/lib/ReviewRace.js +96 -96
  67. package/dist/lib/SkillFrontmatter.js +28 -28
  68. package/dist/lib/SkillQualityGate.js +9 -9
  69. package/dist/lib/SkillRepository.js +159 -159
  70. package/dist/lib/UltraQA.js +77 -77
  71. package/dist/lib/gemini-api.js +5 -5
  72. package/dist/lib/gemini-mcp.d.ts +10 -0
  73. package/dist/lib/gemini-mcp.d.ts.map +1 -0
  74. package/dist/lib/gemini-mcp.js +353 -0
  75. package/dist/lib/gemini-mcp.js.map +1 -0
  76. package/dist/lib/gpt-api.js +4 -4
  77. package/dist/lib/gpt-mcp.d.ts +10 -0
  78. package/dist/lib/gpt-mcp.d.ts.map +1 -0
  79. package/dist/lib/gpt-mcp.js +352 -0
  80. package/dist/lib/gpt-mcp.js.map +1 -0
  81. package/dist/lib/memory/KnowledgeGraph.js +4 -4
  82. package/dist/lib/memory/MemorySearch.js +20 -20
  83. package/dist/lib/memory/MemoryStorage.js +64 -64
  84. package/dist/orchestrator/AgentManager.js +12 -12
  85. package/dist/orchestrator/MultiLlmResearch.js +8 -8
  86. package/dist/orchestrator/SmartRouter.js +11 -11
  87. package/dist/orchestrator/parallelResearch.js +24 -24
  88. package/dist/tools/analytics/getUsageAnalytics.d.ts +10 -0
  89. package/dist/tools/analytics/getUsageAnalytics.d.ts.map +1 -0
  90. package/dist/tools/analytics/getUsageAnalytics.js +246 -0
  91. package/dist/tools/analytics/getUsageAnalytics.js.map +1 -0
  92. package/dist/tools/analytics/index.d.ts +5 -0
  93. package/dist/tools/analytics/index.d.ts.map +1 -0
  94. package/dist/tools/analytics/index.js +5 -0
  95. package/dist/tools/analytics/index.js.map +1 -0
  96. package/dist/tools/convention/analyzeComplexity.test.js +115 -115
  97. package/dist/tools/convention/getCodingGuide.d.ts +7 -0
  98. package/dist/tools/convention/getCodingGuide.d.ts.map +1 -0
  99. package/dist/tools/convention/getCodingGuide.js +69 -0
  100. package/dist/tools/convention/getCodingGuide.js.map +1 -0
  101. package/dist/tools/convention/validateCodeQuality.test.js +104 -104
  102. package/dist/tools/planning/analyzeRequirements.d.ts +9 -0
  103. package/dist/tools/planning/analyzeRequirements.d.ts.map +1 -0
  104. package/dist/tools/planning/analyzeRequirements.js +171 -0
  105. package/dist/tools/planning/analyzeRequirements.js.map +1 -0
  106. package/dist/tools/planning/createUserStories.d.ts +9 -0
  107. package/dist/tools/planning/createUserStories.d.ts.map +1 -0
  108. package/dist/tools/planning/createUserStories.js +124 -0
  109. package/dist/tools/planning/createUserStories.js.map +1 -0
  110. package/dist/tools/planning/featureRoadmap.d.ts +10 -0
  111. package/dist/tools/planning/featureRoadmap.d.ts.map +1 -0
  112. package/dist/tools/planning/featureRoadmap.js +207 -0
  113. package/dist/tools/planning/featureRoadmap.js.map +1 -0
  114. package/dist/tools/planning/generatePrd.d.ts +11 -0
  115. package/dist/tools/planning/generatePrd.d.ts.map +1 -0
  116. package/dist/tools/planning/generatePrd.js +161 -0
  117. package/dist/tools/planning/generatePrd.js.map +1 -0
  118. package/dist/tools/planning/index.d.ts +8 -0
  119. package/dist/tools/planning/index.d.ts.map +1 -0
  120. package/dist/tools/planning/index.js +8 -0
  121. package/dist/tools/planning/index.js.map +1 -0
  122. package/dist/tools/prompt/analyzePrompt.d.ts +7 -0
  123. package/dist/tools/prompt/analyzePrompt.d.ts.map +1 -0
  124. package/dist/tools/prompt/analyzePrompt.js +150 -0
  125. package/dist/tools/prompt/analyzePrompt.js.map +1 -0
  126. package/dist/tools/prompt/enhancePrompt.d.ts +8 -0
  127. package/dist/tools/prompt/enhancePrompt.d.ts.map +1 -0
  128. package/dist/tools/prompt/enhancePrompt.js +110 -0
  129. package/dist/tools/prompt/enhancePrompt.js.map +1 -0
  130. package/dist/tools/prompt/enhancePromptGemini.d.ts +8 -0
  131. package/dist/tools/prompt/enhancePromptGemini.d.ts.map +1 -0
  132. package/dist/tools/prompt/enhancePromptGemini.js +332 -0
  133. package/dist/tools/prompt/enhancePromptGemini.js.map +1 -0
  134. package/dist/tools/prompt/index.d.ts +7 -0
  135. package/dist/tools/prompt/index.d.ts.map +1 -0
  136. package/dist/tools/prompt/index.js +7 -0
  137. package/dist/tools/prompt/index.js.map +1 -0
  138. package/dist/tools/reasoning/applyReasoningFramework.d.ts +8 -0
  139. package/dist/tools/reasoning/applyReasoningFramework.d.ts.map +1 -0
  140. package/dist/tools/reasoning/applyReasoningFramework.js +266 -0
  141. package/dist/tools/reasoning/applyReasoningFramework.js.map +1 -0
  142. package/dist/tools/reasoning/index.d.ts +5 -0
  143. package/dist/tools/reasoning/index.d.ts.map +1 -0
  144. package/dist/tools/reasoning/index.js +5 -0
  145. package/dist/tools/reasoning/index.js.map +1 -0
  146. package/dist/tools/spec/prdParser.test.js +171 -171
  147. package/dist/tools/spec/specGenerator.js +169 -169
  148. package/dist/tools/spec/traceabilityMatrix.js +64 -64
  149. package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
  150. package/dist/tools/thinking/analyzeProblem.d.ts +7 -0
  151. package/dist/tools/thinking/analyzeProblem.d.ts.map +1 -0
  152. package/dist/tools/thinking/analyzeProblem.js +55 -0
  153. package/dist/tools/thinking/analyzeProblem.js.map +1 -0
  154. package/dist/tools/thinking/breakDownProblem.d.ts +8 -0
  155. package/dist/tools/thinking/breakDownProblem.d.ts.map +1 -0
  156. package/dist/tools/thinking/breakDownProblem.js +145 -0
  157. package/dist/tools/thinking/breakDownProblem.js.map +1 -0
  158. package/dist/tools/thinking/createThinkingChain.d.ts +7 -0
  159. package/dist/tools/thinking/createThinkingChain.d.ts.map +1 -0
  160. package/dist/tools/thinking/createThinkingChain.js +44 -0
  161. package/dist/tools/thinking/createThinkingChain.js.map +1 -0
  162. package/dist/tools/thinking/formatAsPlan.d.ts +9 -0
  163. package/dist/tools/thinking/formatAsPlan.d.ts.map +1 -0
  164. package/dist/tools/thinking/formatAsPlan.js +78 -0
  165. package/dist/tools/thinking/formatAsPlan.js.map +1 -0
  166. package/dist/tools/thinking/index.d.ts +10 -0
  167. package/dist/tools/thinking/index.d.ts.map +1 -0
  168. package/dist/tools/thinking/index.js +10 -0
  169. package/dist/tools/thinking/index.js.map +1 -0
  170. package/dist/tools/thinking/stepByStepAnalysis.d.ts +8 -0
  171. package/dist/tools/thinking/stepByStepAnalysis.d.ts.map +1 -0
  172. package/dist/tools/thinking/stepByStepAnalysis.js +63 -0
  173. package/dist/tools/thinking/stepByStepAnalysis.js.map +1 -0
  174. package/dist/tools/thinking/thinkAloudProcess.d.ts +8 -0
  175. package/dist/tools/thinking/thinkAloudProcess.d.ts.map +1 -0
  176. package/dist/tools/thinking/thinkAloudProcess.js +80 -0
  177. package/dist/tools/thinking/thinkAloudProcess.js.map +1 -0
  178. package/hooks/hooks.json +222 -222
  179. package/hooks/scripts/code-check.js +22 -22
  180. package/hooks/scripts/code-review.js +22 -22
  181. package/hooks/scripts/complexity.js +22 -22
  182. package/hooks/scripts/compound.js +23 -23
  183. package/hooks/scripts/context-save.js +33 -33
  184. package/hooks/scripts/gemini-ui-gen.js +281 -281
  185. package/hooks/scripts/generate-brand-assets.js +474 -474
  186. package/hooks/scripts/hud-multiline.js +262 -262
  187. package/hooks/scripts/hud-status.js +291 -291
  188. package/hooks/scripts/keyword-detector.js +214 -214
  189. package/hooks/scripts/llm-orchestrate.js +171 -171
  190. package/hooks/scripts/post-edit.js +97 -97
  191. package/hooks/scripts/post-tool-verify.js +210 -210
  192. package/hooks/scripts/pre-tool-guard.js +125 -125
  193. package/hooks/scripts/recall.js +22 -22
  194. package/hooks/scripts/session-start.js +30 -30
  195. package/hooks/scripts/skill-injector.js +191 -191
  196. package/hooks/scripts/utils.js +97 -97
  197. package/languages/csharp-unity.md +515 -515
  198. package/languages/gdscript-godot.md +470 -470
  199. package/languages/ruby-rails.md +489 -489
  200. package/languages/typescript-angular.md +433 -433
  201. package/languages/typescript-astro.md +416 -416
  202. package/languages/typescript-electron.md +406 -406
  203. package/languages/typescript-nestjs.md +524 -524
  204. package/languages/typescript-svelte.md +407 -407
  205. package/languages/typescript-tauri.md +365 -365
  206. package/package.json +84 -84
  207. package/skills/brand-assets.md +141 -141
  208. package/skills/commerce-patterns.md +361 -361
  209. package/skills/context7-usage.md +102 -102
  210. package/skills/e2e-commerce.md +304 -304
  211. package/skills/frontend-design.md +92 -92
  212. package/skills/git-worktree.md +181 -181
  213. package/skills/parallel-research.md +77 -77
  214. package/skills/priority-todos.md +239 -239
  215. package/skills/seo-checklist.md +244 -244
  216. package/skills/tool-fallback.md +190 -190
  217. package/skills/vibe-capabilities.md +161 -161
  218. package/vibe/constitution.md +227 -227
  219. package/vibe/rules/core/communication-guide.md +98 -98
  220. package/vibe/rules/core/development-philosophy.md +52 -52
  221. package/vibe/rules/core/quick-start.md +102 -102
  222. package/vibe/rules/quality/bdd-contract-testing.md +393 -393
  223. package/vibe/rules/quality/checklist.md +276 -276
  224. package/vibe/rules/quality/testing-strategy.md +440 -440
  225. package/vibe/rules/standards/anti-patterns.md +541 -541
  226. package/vibe/rules/standards/code-structure.md +291 -291
  227. package/vibe/rules/standards/complexity-metrics.md +313 -313
  228. package/vibe/rules/standards/naming-conventions.md +198 -198
  229. package/vibe/setup.sh +31 -31
  230. package/vibe/templates/constitution-template.md +252 -252
  231. package/vibe/templates/contract-backend-template.md +526 -526
  232. package/vibe/templates/contract-frontend-template.md +599 -599
  233. package/vibe/templates/feature-template.md +96 -96
  234. package/vibe/templates/spec-template.md +221 -221
@@ -72,45 +72,45 @@ function generateSplitSpec(prd, featureName, phases, options) {
72
72
  function buildSpecContent(prd, featureName, phases, options) {
73
73
  const { techStack = [], relatedCodePaths = [], designReference, additionalConstraints = [], additionalOutputs = [] } = options;
74
74
  const now = new Date().toISOString();
75
- let content = `---
76
- status: pending
77
- currentPhase: 0
78
- totalPhases: ${phases.length}
79
- createdAt: ${now}
80
- lastUpdated: ${now}
81
- ---
82
-
83
- # SPEC: ${featureName}
84
-
85
- ## Persona
86
- <role>
87
- Senior developer implementing ${featureName}.
88
- - Follow existing code patterns and conventions
89
- - Write testable, maintainable code
90
- - Consider security and performance implications
91
- </role>
92
-
93
- ## Context
94
- <context>
95
- ### Background
96
- ${prd.description || `Implementation of ${prd.title}`}
97
-
98
- ### Tech Stack
99
- ${techStack.length > 0 ? techStack.map(t => `- ${t}`).join('\n') : '- (To be determined based on project)'}
100
-
101
- ### Related Code
102
- ${relatedCodePaths.length > 0 ? relatedCodePaths.map(p => `- \`${p}\``).join('\n') : '- (Analyze existing codebase for patterns)'}
103
-
104
- ### Design Reference
105
- ${designReference || '- (None specified)'}
106
-
107
- ### Requirements Source
108
- - Parsed from PRD: ${prd.requirements.length} requirements
109
- - Format: ${prd.metadata.format}
110
- </context>
111
-
112
- ## Task
113
- <task>
75
+ let content = `---
76
+ status: pending
77
+ currentPhase: 0
78
+ totalPhases: ${phases.length}
79
+ createdAt: ${now}
80
+ lastUpdated: ${now}
81
+ ---
82
+
83
+ # SPEC: ${featureName}
84
+
85
+ ## Persona
86
+ <role>
87
+ Senior developer implementing ${featureName}.
88
+ - Follow existing code patterns and conventions
89
+ - Write testable, maintainable code
90
+ - Consider security and performance implications
91
+ </role>
92
+
93
+ ## Context
94
+ <context>
95
+ ### Background
96
+ ${prd.description || `Implementation of ${prd.title}`}
97
+
98
+ ### Tech Stack
99
+ ${techStack.length > 0 ? techStack.map(t => `- ${t}`).join('\n') : '- (To be determined based on project)'}
100
+
101
+ ### Related Code
102
+ ${relatedCodePaths.length > 0 ? relatedCodePaths.map(p => `- \`${p}\``).join('\n') : '- (Analyze existing codebase for patterns)'}
103
+
104
+ ### Design Reference
105
+ ${designReference || '- (None specified)'}
106
+
107
+ ### Requirements Source
108
+ - Parsed from PRD: ${prd.requirements.length} requirements
109
+ - Format: ${prd.metadata.format}
110
+ </context>
111
+
112
+ ## Task
113
+ <task>
114
114
  `;
115
115
  // Phase별 태스크 추가
116
116
  for (let i = 0; i < phases.length; i++) {
@@ -122,47 +122,47 @@ ${designReference || '- (None specified)'}
122
122
  }
123
123
  content += '\n';
124
124
  }
125
- content += `</task>
126
-
127
- ## Constraints
128
- <constraints>
129
- ### Must Follow
130
- - Follow existing code patterns (ES Module, async/await)
131
- - Maintain backward compatibility
132
- - TypeScript strict mode compliance
133
- - No \`any\` type → Use \`unknown\` + type guards
134
- - Functions ≤30 lines recommended, ≤50 lines max
135
- - Nesting ≤3 levels
136
-
137
- ### Error Handling
138
- - Proper try-catch with meaningful error messages
139
- - Loading state handling for async operations
140
- - User-friendly error messages
141
-
142
- ### Security
143
- - Input validation for all user inputs
144
- - Authentication/authorization checks where needed
145
- - No sensitive data in logs
146
- ${additionalConstraints.map(c => `\n- ${c}`).join('')}
147
- </constraints>
148
-
149
- ## Output Format
150
- <output_format>
151
- ### Files to Create
152
- ${generateFileList(phases, 'create')}
153
-
154
- ### Files to Modify
155
- ${generateFileList(phases, 'modify')}
156
-
157
- ### Verification Commands
158
- - \`npm run build\` (build success)
159
- - \`npm test\` (tests pass)
160
- - \`tsc --noEmit\` (type check)
161
- ${additionalOutputs.map(o => `- ${o}`).join('\n')}
162
- </output_format>
163
-
164
- ## Acceptance Criteria
165
- <acceptance>
125
+ content += `</task>
126
+
127
+ ## Constraints
128
+ <constraints>
129
+ ### Must Follow
130
+ - Follow existing code patterns (ES Module, async/await)
131
+ - Maintain backward compatibility
132
+ - TypeScript strict mode compliance
133
+ - No \`any\` type → Use \`unknown\` + type guards
134
+ - Functions ≤30 lines recommended, ≤50 lines max
135
+ - Nesting ≤3 levels
136
+
137
+ ### Error Handling
138
+ - Proper try-catch with meaningful error messages
139
+ - Loading state handling for async operations
140
+ - User-friendly error messages
141
+
142
+ ### Security
143
+ - Input validation for all user inputs
144
+ - Authentication/authorization checks where needed
145
+ - No sensitive data in logs
146
+ ${additionalConstraints.map(c => `\n- ${c}`).join('')}
147
+ </constraints>
148
+
149
+ ## Output Format
150
+ <output_format>
151
+ ### Files to Create
152
+ ${generateFileList(phases, 'create')}
153
+
154
+ ### Files to Modify
155
+ ${generateFileList(phases, 'modify')}
156
+
157
+ ### Verification Commands
158
+ - \`npm run build\` (build success)
159
+ - \`npm test\` (tests pass)
160
+ - \`tsc --noEmit\` (type check)
161
+ ${additionalOutputs.map(o => `- ${o}`).join('\n')}
162
+ </output_format>
163
+
164
+ ## Acceptance Criteria
165
+ <acceptance>
166
166
  `;
167
167
  // 요구사항별 AC 추가
168
168
  for (const req of prd.requirements) {
@@ -177,11 +177,11 @@ ${additionalOutputs.map(o => `- ${o}`).join('\n')}
177
177
  }
178
178
  content += '\n';
179
179
  }
180
- content += `### Build & Test
181
- - [ ] \`npm run build\` succeeds
182
- - [ ] All tests pass
183
- - [ ] No TypeScript errors
184
- </acceptance>
180
+ content += `### Build & Test
181
+ - [ ] \`npm run build\` succeeds
182
+ - [ ] All tests pass
183
+ - [ ] No TypeScript errors
184
+ </acceptance>
185
185
  `;
186
186
  return content;
187
187
  }
@@ -190,53 +190,53 @@ ${additionalOutputs.map(o => `- ${o}`).join('\n')}
190
190
  */
191
191
  function buildMasterSpecContent(prd, featureName, phases, options) {
192
192
  const now = new Date().toISOString();
193
- let content = `---
194
- status: pending
195
- currentPhase: 0
196
- totalPhases: ${phases.length}
197
- createdAt: ${now}
198
- lastUpdated: ${now}
199
- isMaster: true
200
- ---
201
-
202
- # SPEC: ${featureName} (Master)
203
-
204
- ## Overview
205
- - **Feature**: ${prd.title}
206
- - **Total Phases**: ${phases.length}
207
- - **Total Requirements**: ${prd.requirements.length}
208
- - **Format**: Split SPEC (large scope)
209
-
210
- ## Sub-SPECs
211
-
212
- | Order | SPEC File | Description | Status |
213
- |-------|-----------|-------------|--------|
193
+ let content = `---
194
+ status: pending
195
+ currentPhase: 0
196
+ totalPhases: ${phases.length}
197
+ createdAt: ${now}
198
+ lastUpdated: ${now}
199
+ isMaster: true
200
+ ---
201
+
202
+ # SPEC: ${featureName} (Master)
203
+
204
+ ## Overview
205
+ - **Feature**: ${prd.title}
206
+ - **Total Phases**: ${phases.length}
207
+ - **Total Requirements**: ${prd.requirements.length}
208
+ - **Format**: Split SPEC (large scope)
209
+
210
+ ## Sub-SPECs
211
+
212
+ | Order | SPEC File | Description | Status |
213
+ |-------|-----------|-------------|--------|
214
214
  `;
215
215
  for (let i = 0; i < phases.length; i++) {
216
216
  const phase = phases[i];
217
217
  const fileName = `phase-${i + 1}-${normalizeFileName(phase.name)}.md`;
218
218
  content += `| ${i + 1} | ${fileName} | ${phase.name} | ⬜ |\n`;
219
219
  }
220
- content += `
221
- ## Shared Context
222
-
223
- ### Tech Stack
224
- ${options.techStack?.map(t => `- ${t}`).join('\n') || '- (See project configuration)'}
225
-
226
- ### Constraints (Apply to All Phases)
227
- - Follow existing code patterns
228
- - TypeScript strict mode
229
- - No \`any\` type
230
- - Functions ≤50 lines max
231
- ${options.additionalConstraints?.map(c => `- ${c}`).join('\n') || ''}
232
-
233
- ## Execution Order
234
- \`\`\`
235
- ${phases.map((p, i) => `Phase ${i + 1}: ${p.name}`).join(' → ')}
236
- \`\`\`
237
-
238
- ## Dependencies
239
- ${generateDependencyList(phases)}
220
+ content += `
221
+ ## Shared Context
222
+
223
+ ### Tech Stack
224
+ ${options.techStack?.map(t => `- ${t}`).join('\n') || '- (See project configuration)'}
225
+
226
+ ### Constraints (Apply to All Phases)
227
+ - Follow existing code patterns
228
+ - TypeScript strict mode
229
+ - No \`any\` type
230
+ - Functions ≤50 lines max
231
+ ${options.additionalConstraints?.map(c => `- ${c}`).join('\n') || ''}
232
+
233
+ ## Execution Order
234
+ \`\`\`
235
+ ${phases.map((p, i) => `Phase ${i + 1}: ${p.name}`).join(' → ')}
236
+ \`\`\`
237
+
238
+ ## Dependencies
239
+ ${generateDependencyList(phases)}
240
240
  `;
241
241
  return content;
242
242
  }
@@ -245,54 +245,54 @@ ${generateDependencyList(phases)}
245
245
  */
246
246
  function buildPhaseSpecContent(prd, featureName, phase, phaseNumber, totalPhases, options) {
247
247
  const now = new Date().toISOString();
248
- let content = `---
249
- status: pending
250
- phase: ${phaseNumber}
251
- totalPhases: ${totalPhases}
252
- masterSpec: _index.md
253
- createdAt: ${now}
254
- lastUpdated: ${now}
255
- ---
256
-
257
- # SPEC: ${featureName} - Phase ${phaseNumber}: ${phase.name}
258
-
259
- ## Persona
260
- <role>
261
- Developer implementing Phase ${phaseNumber} of ${featureName}.
262
- - Focus on ${phase.name}
263
- - Follow project conventions
264
- - Write testable code
265
- </role>
266
-
267
- ## Context
268
- <context>
269
- ### Phase Goal
270
- ${getPhaseGoal(phase)}
271
-
272
- ### Requirements (${phase.requirements.length})
273
- ${phase.requirements.map(r => `- ${r.id}: ${truncateText(r.description, 50)}`).join('\n')}
274
-
275
- ### Dependencies
276
- ${phaseNumber > 1 ? `- Requires Phase ${phaseNumber - 1} completion` : '- No dependencies (first phase)'}
277
- </context>
278
-
279
- ## Task
280
- <task>
248
+ let content = `---
249
+ status: pending
250
+ phase: ${phaseNumber}
251
+ totalPhases: ${totalPhases}
252
+ masterSpec: _index.md
253
+ createdAt: ${now}
254
+ lastUpdated: ${now}
255
+ ---
256
+
257
+ # SPEC: ${featureName} - Phase ${phaseNumber}: ${phase.name}
258
+
259
+ ## Persona
260
+ <role>
261
+ Developer implementing Phase ${phaseNumber} of ${featureName}.
262
+ - Focus on ${phase.name}
263
+ - Follow project conventions
264
+ - Write testable code
265
+ </role>
266
+
267
+ ## Context
268
+ <context>
269
+ ### Phase Goal
270
+ ${getPhaseGoal(phase)}
271
+
272
+ ### Requirements (${phase.requirements.length})
273
+ ${phase.requirements.map(r => `- ${r.id}: ${truncateText(r.description, 50)}`).join('\n')}
274
+
275
+ ### Dependencies
276
+ ${phaseNumber > 1 ? `- Requires Phase ${phaseNumber - 1} completion` : '- No dependencies (first phase)'}
277
+ </context>
278
+
279
+ ## Task
280
+ <task>
281
281
  `;
282
282
  for (const task of phase.tasks) {
283
283
  content += `1. [ ] ${task}\n`;
284
284
  }
285
- content += `</task>
286
-
287
- ## Acceptance Criteria
288
- <acceptance>
285
+ content += `</task>
286
+
287
+ ## Acceptance Criteria
288
+ <acceptance>
289
289
  `;
290
290
  for (const req of phase.requirements) {
291
291
  content += `- [ ] ${req.id}: ${truncateText(req.description, 60)}\n`;
292
292
  }
293
- content += `- [ ] Phase ${phaseNumber} build succeeds
294
- - [ ] Phase ${phaseNumber} tests pass
295
- </acceptance>
293
+ content += `- [ ] Phase ${phaseNumber} build succeeds
294
+ - [ ] Phase ${phaseNumber} tests pass
295
+ </acceptance>
296
296
  `;
297
297
  return content;
298
298
  }
@@ -385,11 +385,11 @@ function getPhaseGoal(phase) {
385
385
  function generateFileList(phases, type) {
386
386
  // 실제로는 요구사항을 분석해서 추론해야 하지만, 기본 템플릿 제공
387
387
  if (type === 'create') {
388
- return `- (To be determined based on implementation)
389
- - \`src/[feature]/index.ts\`
388
+ return `- (To be determined based on implementation)
389
+ - \`src/[feature]/index.ts\`
390
390
  - \`src/[feature]/[feature].test.ts\``;
391
391
  }
392
- return `- (Analyze existing codebase)
392
+ return `- (Analyze existing codebase)
393
393
  - Relevant existing files`;
394
394
  }
395
395
  /**
@@ -117,74 +117,74 @@ export function formatMatrixAsMarkdown(matrix) {
117
117
  * 매트릭스를 HTML로 출력
118
118
  */
119
119
  export function formatMatrixAsHtml(matrix) {
120
- let html = `<!DOCTYPE html>
121
- <html>
122
- <head>
123
- <title>RTM: ${matrix.featureName}</title>
124
- <style>
125
- body { font-family: -apple-system, BlinkMacSystemFont, sans-serif; margin: 2rem; }
126
- table { border-collapse: collapse; width: 100%; }
127
- th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
128
- th { background: #f5f5f5; }
129
- .full { background: #d4edda; }
130
- .partial { background: #fff3cd; }
131
- .none { background: #f8d7da; }
132
- .summary { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin: 1rem 0; }
133
- .summary-card { padding: 1rem; border-radius: 8px; background: #f5f5f5; }
134
- .coverage-bar { height: 20px; background: #e0e0e0; border-radius: 4px; overflow: hidden; }
135
- .coverage-fill { height: 100%; background: #4caf50; }
136
- </style>
137
- </head>
138
- <body>
139
- <h1>RTM: ${matrix.featureName}</h1>
140
- <p>Generated: ${matrix.generatedAt}</p>
141
-
142
- <div class="summary">
143
- <div class="summary-card">
144
- <strong>Requirements</strong><br>${matrix.summary.totalRequirements}
145
- </div>
146
- <div class="summary-card">
147
- <strong>Feature Coverage</strong><br>${matrix.summary.featureCovered}/${matrix.summary.totalRequirements}
148
- </div>
149
- <div class="summary-card">
150
- <strong>Test Coverage</strong><br>${matrix.summary.testCovered}/${matrix.summary.totalRequirements}
151
- </div>
152
- <div class="summary-card">
153
- <strong>Overall</strong><br>
154
- <div class="coverage-bar">
155
- <div class="coverage-fill" style="width: ${matrix.summary.coveragePercent}%"></div>
156
- </div>
157
- ${matrix.summary.coveragePercent}%
158
- </div>
159
- </div>
160
-
161
- <table>
162
- <thead>
163
- <tr>
164
- <th>Requirement</th>
165
- <th>Description</th>
166
- <th>SPEC</th>
167
- <th>Feature</th>
168
- <th>Test</th>
169
- <th>Coverage</th>
170
- </tr>
171
- </thead>
172
- <tbody>
120
+ let html = `<!DOCTYPE html>
121
+ <html>
122
+ <head>
123
+ <title>RTM: ${matrix.featureName}</title>
124
+ <style>
125
+ body { font-family: -apple-system, BlinkMacSystemFont, sans-serif; margin: 2rem; }
126
+ table { border-collapse: collapse; width: 100%; }
127
+ th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
128
+ th { background: #f5f5f5; }
129
+ .full { background: #d4edda; }
130
+ .partial { background: #fff3cd; }
131
+ .none { background: #f8d7da; }
132
+ .summary { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin: 1rem 0; }
133
+ .summary-card { padding: 1rem; border-radius: 8px; background: #f5f5f5; }
134
+ .coverage-bar { height: 20px; background: #e0e0e0; border-radius: 4px; overflow: hidden; }
135
+ .coverage-fill { height: 100%; background: #4caf50; }
136
+ </style>
137
+ </head>
138
+ <body>
139
+ <h1>RTM: ${matrix.featureName}</h1>
140
+ <p>Generated: ${matrix.generatedAt}</p>
141
+
142
+ <div class="summary">
143
+ <div class="summary-card">
144
+ <strong>Requirements</strong><br>${matrix.summary.totalRequirements}
145
+ </div>
146
+ <div class="summary-card">
147
+ <strong>Feature Coverage</strong><br>${matrix.summary.featureCovered}/${matrix.summary.totalRequirements}
148
+ </div>
149
+ <div class="summary-card">
150
+ <strong>Test Coverage</strong><br>${matrix.summary.testCovered}/${matrix.summary.totalRequirements}
151
+ </div>
152
+ <div class="summary-card">
153
+ <strong>Overall</strong><br>
154
+ <div class="coverage-bar">
155
+ <div class="coverage-fill" style="width: ${matrix.summary.coveragePercent}%"></div>
156
+ </div>
157
+ ${matrix.summary.coveragePercent}%
158
+ </div>
159
+ </div>
160
+
161
+ <table>
162
+ <thead>
163
+ <tr>
164
+ <th>Requirement</th>
165
+ <th>Description</th>
166
+ <th>SPEC</th>
167
+ <th>Feature</th>
168
+ <th>Test</th>
169
+ <th>Coverage</th>
170
+ </tr>
171
+ </thead>
172
+ <tbody>
173
173
  `;
174
174
  for (const item of matrix.items) {
175
- html += ` <tr class="${item.coverage}">
176
- <td>${item.requirementId}</td>
177
- <td>${escapeHtml(truncate(item.requirementDesc, 50))}</td>
178
- <td>${item.specSection ? '✅' : '❌'}</td>
179
- <td>${item.featureScenario ? '✅' : '❌'}</td>
180
- <td>${item.testName ? '✅' : '❌'}</td>
181
- <td>${getCoverageIcon(item.coverage)}</td>
182
- </tr>
175
+ html += ` <tr class="${item.coverage}">
176
+ <td>${item.requirementId}</td>
177
+ <td>${escapeHtml(truncate(item.requirementDesc, 50))}</td>
178
+ <td>${item.specSection ? '✅' : '❌'}</td>
179
+ <td>${item.featureScenario ? '✅' : '❌'}</td>
180
+ <td>${item.testName ? '✅' : '❌'}</td>
181
+ <td>${getCoverageIcon(item.coverage)}</td>
182
+ </tr>
183
183
  `;
184
184
  }
185
- html += ` </tbody>
186
- </table>
187
- </body>
185
+ html += ` </tbody>
186
+ </table>
187
+ </body>
188
188
  </html>`;
189
189
  return html;
190
190
  }
@@ -8,37 +8,37 @@ import { generateTraceabilityMatrix, formatMatrixAsMarkdown, formatMatrixAsHtml,
8
8
  vi.mock('fs', () => ({
9
9
  readFileSync: vi.fn((path) => {
10
10
  if (path.includes('test-feature.md')) {
11
- return `# SPEC: test-feature
12
-
13
- ## Task
14
-
15
- ### Phase 1: Setup
16
-
17
- 1. [ ] REQ-test-001: Setup authentication
18
- 2. [ ] REQ-test-002: Create login form
19
- 3. [ ] REQ-test-003: Implement validation
11
+ return `# SPEC: test-feature
12
+
13
+ ## Task
14
+
15
+ ### Phase 1: Setup
16
+
17
+ 1. [ ] REQ-test-001: Setup authentication
18
+ 2. [ ] REQ-test-002: Create login form
19
+ 3. [ ] REQ-test-003: Implement validation
20
20
  `;
21
21
  }
22
22
  if (path.includes('test-feature.feature')) {
23
- return `# Feature: test-feature
24
-
25
- ## Scenarios
26
-
27
- ### Scenario 1: User can login
28
- \`\`\`gherkin
29
- Given user is on login page
30
- When user enters valid credentials
31
- Then user is logged in
32
- \`\`\`
33
- **Verification**: REQ-test-001
34
-
35
- ### Scenario 2: Validation errors
36
- \`\`\`gherkin
37
- Given user is on login page
38
- When user enters invalid email
39
- Then error message is shown
40
- \`\`\`
41
- **Verification**: REQ-test-003
23
+ return `# Feature: test-feature
24
+
25
+ ## Scenarios
26
+
27
+ ### Scenario 1: User can login
28
+ \`\`\`gherkin
29
+ Given user is on login page
30
+ When user enters valid credentials
31
+ Then user is logged in
32
+ \`\`\`
33
+ **Verification**: REQ-test-001
34
+
35
+ ### Scenario 2: Validation errors
36
+ \`\`\`gherkin
37
+ Given user is on login page
38
+ When user enters invalid email
39
+ Then error message is shown
40
+ \`\`\`
41
+ **Verification**: REQ-test-003
42
42
  `;
43
43
  }
44
44
  throw new Error(`File not found: ${path}`);
@@ -0,0 +1,7 @@
1
+ import { ToolResult, ToolDefinition } from '../../types/tool.js';
2
+ export declare const analyzeProblemDefinition: ToolDefinition;
3
+ export declare function analyzeProblem(args: {
4
+ problem: string;
5
+ domain?: string;
6
+ }): Promise<ToolResult>;
7
+ //# sourceMappingURL=analyzeProblem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeProblem.d.ts","sourceRoot":"","sources":["../../../src/tools/thinking/analyzeProblem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEjE,eAAO,MAAM,wBAAwB,EAAE,cAmBtC,CAAC;AAEF,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAkCpG"}
@@ -0,0 +1,55 @@
1
+ // Sequential thinking tool - completely independent
2
+ export const analyzeProblemDefinition = {
3
+ name: 'analyze_problem',
4
+ description: '문제 분석|어떻게 접근|분석해줘|analyze this|how to approach|break this down - Break down complex problem into structured steps',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ problem: { type: 'string', description: 'Problem to analyze' },
9
+ domain: { type: 'string', description: 'Problem domain' }
10
+ },
11
+ required: ['problem']
12
+ },
13
+ annotations: {
14
+ title: 'Analyze Problem',
15
+ audience: ['user', 'assistant'],
16
+ readOnlyHint: true,
17
+ destructiveHint: false,
18
+ idempotentHint: true,
19
+ openWorldHint: false
20
+ }
21
+ };
22
+ export async function analyzeProblem(args) {
23
+ const { problem, domain = 'general' } = args;
24
+ const problemAnalysis = {
25
+ action: 'analyze_problem',
26
+ problem,
27
+ domain,
28
+ analysis: {
29
+ breakdown: [
30
+ 'Define the problem clearly',
31
+ 'Identify key constraints and requirements',
32
+ 'Break down into smaller sub-problems',
33
+ 'Determine solution approach',
34
+ 'Plan implementation steps'
35
+ ],
36
+ considerations: [
37
+ 'What are the inputs and expected outputs?',
38
+ 'Are there any edge cases to consider?',
39
+ 'What are the performance requirements?',
40
+ 'How will this integrate with existing systems?'
41
+ ],
42
+ nextSteps: [
43
+ 'Research existing solutions',
44
+ 'Create detailed implementation plan',
45
+ 'Identify potential risks and mitigation strategies',
46
+ 'Define success criteria'
47
+ ]
48
+ },
49
+ status: 'success'
50
+ };
51
+ return {
52
+ content: [{ type: 'text', text: `Problem: ${problem}\nDomain: ${domain}\n\nBreakdown:\n${problemAnalysis.analysis.breakdown.map((b, i) => `${i + 1}. ${b}`).join('\n')}\n\nConsiderations:\n${problemAnalysis.analysis.considerations.map(c => `- ${c}`).join('\n')}\n\nNext Steps:\n${problemAnalysis.analysis.nextSteps.map(n => `- ${n}`).join('\n')}` }]
53
+ };
54
+ }
55
+ //# sourceMappingURL=analyzeProblem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeProblem.js","sourceRoot":"","sources":["../../../src/tools/thinking/analyzeProblem.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAIpD,MAAM,CAAC,MAAM,wBAAwB,GAAmB;IACtD,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,mHAAmH;IAChI,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;YAC9D,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;SAC1D;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,WAAW,EAAE;QACX,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;QAC/B,YAAY,EAAE,IAAI;QAClB,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,KAAK;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAA0C;IAC7E,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC;IAE7C,MAAM,eAAe,GAAG;QACtB,MAAM,EAAE,iBAAiB;QACzB,OAAO;QACP,MAAM;QACN,QAAQ,EAAE;YACR,SAAS,EAAE;gBACT,4BAA4B;gBAC5B,2CAA2C;gBAC3C,sCAAsC;gBACtC,6BAA6B;gBAC7B,2BAA2B;aAC5B;YACD,cAAc,EAAE;gBACd,2CAA2C;gBAC3C,uCAAuC;gBACvC,wCAAwC;gBACxC,gDAAgD;aACjD;YACD,SAAS,EAAE;gBACT,6BAA6B;gBAC7B,qCAAqC;gBACrC,oDAAoD;gBACpD,yBAAyB;aAC1B;SACF;QACD,MAAM,EAAE,SAAS;KAClB,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,OAAO,aAAa,MAAM,mBAAmB,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,eAAe,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;KAC3V,CAAC;AACJ,CAAC"}