@su-record/vibe 2.6.17 → 2.6.18

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 (238) hide show
  1. package/CLAUDE.md +681 -681
  2. package/LICENSE +21 -21
  3. package/README.md +235 -239
  4. package/agents/architect-low.md +41 -41
  5. package/agents/architect-medium.md +59 -59
  6. package/agents/architect.md +80 -80
  7. package/agents/build-error-resolver.md +115 -115
  8. package/agents/compounder.md +261 -261
  9. package/agents/diagrammer.md +178 -178
  10. package/agents/e2e-tester.md +266 -266
  11. package/agents/explorer-low.md +42 -42
  12. package/agents/explorer-medium.md +59 -59
  13. package/agents/explorer.md +48 -48
  14. package/agents/implementer-low.md +43 -43
  15. package/agents/implementer-medium.md +52 -52
  16. package/agents/implementer.md +54 -54
  17. package/agents/refactor-cleaner.md +143 -143
  18. package/agents/research/best-practices-agent.md +199 -199
  19. package/agents/research/codebase-patterns-agent.md +157 -157
  20. package/agents/research/framework-docs-agent.md +188 -188
  21. package/agents/research/security-advisory-agent.md +213 -213
  22. package/agents/review/architecture-reviewer.md +107 -107
  23. package/agents/review/complexity-reviewer.md +116 -116
  24. package/agents/review/data-integrity-reviewer.md +88 -88
  25. package/agents/review/git-history-reviewer.md +103 -103
  26. package/agents/review/performance-reviewer.md +86 -86
  27. package/agents/review/python-reviewer.md +150 -150
  28. package/agents/review/rails-reviewer.md +139 -139
  29. package/agents/review/react-reviewer.md +144 -144
  30. package/agents/review/security-reviewer.md +80 -80
  31. package/agents/review/simplicity-reviewer.md +140 -140
  32. package/agents/review/test-coverage-reviewer.md +116 -116
  33. package/agents/review/typescript-reviewer.md +127 -127
  34. package/agents/searcher.md +54 -54
  35. package/agents/simplifier.md +120 -120
  36. package/agents/tester.md +49 -49
  37. package/agents/ui-previewer.md +268 -268
  38. package/commands/vibe.analyze.md +356 -356
  39. package/commands/vibe.reason.md +329 -329
  40. package/commands/vibe.review.md +412 -412
  41. package/commands/vibe.run.md +1266 -1266
  42. package/commands/vibe.spec.md +1054 -1054
  43. package/commands/vibe.spec.review.md +319 -319
  44. package/commands/vibe.trace.md +161 -161
  45. package/commands/vibe.utils.md +376 -376
  46. package/commands/vibe.verify.md +375 -375
  47. package/dist/cli/collaborator.js +52 -52
  48. package/dist/cli/detect.js +32 -32
  49. package/dist/cli/hud.js +20 -20
  50. package/dist/cli/index.d.ts.map +1 -1
  51. package/dist/cli/index.js +120 -118
  52. package/dist/cli/index.js.map +1 -1
  53. package/dist/cli/llm.js +144 -144
  54. package/dist/cli/postinstall.d.ts +1 -0
  55. package/dist/cli/postinstall.d.ts.map +1 -1
  56. package/dist/cli/postinstall.js +859 -859
  57. package/dist/cli/postinstall.js.map +1 -1
  58. package/dist/cli/setup/ProjectSetup.d.ts +2 -2
  59. package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
  60. package/dist/cli/setup/ProjectSetup.js +51 -17
  61. package/dist/cli/setup/ProjectSetup.js.map +1 -1
  62. package/dist/lib/DeepInit.js +24 -24
  63. package/dist/lib/IterationTracker.js +11 -11
  64. package/dist/lib/PythonParser.js +108 -108
  65. package/dist/lib/ReviewRace.js +96 -96
  66. package/dist/lib/SkillFrontmatter.js +28 -28
  67. package/dist/lib/SkillQualityGate.js +9 -9
  68. package/dist/lib/SkillRepository.js +159 -159
  69. package/dist/lib/UltraQA.js +77 -77
  70. package/dist/lib/gemini-api.js +5 -5
  71. package/dist/lib/gpt-api.js +4 -4
  72. package/dist/lib/memory/KnowledgeGraph.js +4 -4
  73. package/dist/lib/memory/MemorySearch.js +20 -20
  74. package/dist/lib/memory/MemoryStorage.js +64 -64
  75. package/dist/orchestrator/AgentManager.js +12 -12
  76. package/dist/orchestrator/MultiLlmResearch.js +8 -8
  77. package/dist/orchestrator/SmartRouter.js +11 -11
  78. package/dist/orchestrator/SwarmOrchestrator.test.js +16 -16
  79. package/dist/orchestrator/parallelResearch.js +24 -24
  80. package/dist/tools/convention/analyzeComplexity.test.js +115 -115
  81. package/dist/tools/convention/validateCodeQuality.test.js +104 -104
  82. package/dist/tools/spec/prdParser.test.js +171 -171
  83. package/dist/tools/spec/specGenerator.js +169 -169
  84. package/dist/tools/spec/traceabilityMatrix.js +64 -64
  85. package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
  86. package/hooks/hooks.json +222 -222
  87. package/hooks/scripts/code-check.js +22 -22
  88. package/hooks/scripts/code-review.js +22 -22
  89. package/hooks/scripts/complexity.js +22 -22
  90. package/hooks/scripts/compound.js +23 -23
  91. package/hooks/scripts/context-save.js +33 -33
  92. package/hooks/scripts/gemini-ui-gen.js +281 -281
  93. package/hooks/scripts/generate-brand-assets.js +474 -474
  94. package/hooks/scripts/hud-multiline.js +262 -262
  95. package/hooks/scripts/hud-status.js +291 -291
  96. package/hooks/scripts/keyword-detector.js +214 -214
  97. package/hooks/scripts/llm-orchestrate.js +171 -171
  98. package/hooks/scripts/post-edit.js +97 -97
  99. package/hooks/scripts/post-tool-verify.js +210 -210
  100. package/hooks/scripts/pre-tool-guard.js +125 -125
  101. package/hooks/scripts/recall.js +22 -22
  102. package/hooks/scripts/session-start.js +30 -30
  103. package/hooks/scripts/skill-injector.js +191 -191
  104. package/hooks/scripts/utils.js +97 -97
  105. package/languages/csharp-unity.md +515 -515
  106. package/languages/gdscript-godot.md +470 -470
  107. package/languages/ruby-rails.md +489 -489
  108. package/languages/typescript-angular.md +433 -433
  109. package/languages/typescript-astro.md +416 -416
  110. package/languages/typescript-electron.md +406 -406
  111. package/languages/typescript-nestjs.md +524 -524
  112. package/languages/typescript-svelte.md +407 -407
  113. package/languages/typescript-tauri.md +365 -365
  114. package/package.json +84 -84
  115. package/skills/brand-assets.md +141 -141
  116. package/skills/commerce-patterns.md +361 -361
  117. package/skills/context7-usage.md +102 -102
  118. package/skills/e2e-commerce.md +304 -304
  119. package/skills/frontend-design.md +92 -92
  120. package/skills/git-worktree.md +181 -181
  121. package/skills/parallel-research.md +77 -77
  122. package/skills/priority-todos.md +239 -239
  123. package/skills/seo-checklist.md +244 -244
  124. package/skills/tool-fallback.md +190 -190
  125. package/skills/vibe-capabilities.md +161 -161
  126. package/vibe/constitution.md +227 -227
  127. package/vibe/rules/core/communication-guide.md +98 -98
  128. package/vibe/rules/core/development-philosophy.md +52 -52
  129. package/vibe/rules/core/quick-start.md +102 -102
  130. package/vibe/rules/quality/bdd-contract-testing.md +393 -393
  131. package/vibe/rules/quality/checklist.md +276 -276
  132. package/vibe/rules/quality/testing-strategy.md +440 -440
  133. package/vibe/rules/standards/anti-patterns.md +541 -541
  134. package/vibe/rules/standards/code-structure.md +291 -291
  135. package/vibe/rules/standards/complexity-metrics.md +313 -313
  136. package/vibe/rules/standards/naming-conventions.md +198 -198
  137. package/vibe/setup.sh +31 -31
  138. package/vibe/templates/constitution-template.md +252 -252
  139. package/vibe/templates/contract-backend-template.md +526 -526
  140. package/vibe/templates/contract-frontend-template.md +599 -599
  141. package/vibe/templates/feature-template.md +96 -96
  142. package/vibe/templates/spec-template.md +221 -221
  143. package/dist/cli/mcp.d.ts +0 -49
  144. package/dist/cli/mcp.d.ts.map +0 -1
  145. package/dist/cli/mcp.js +0 -169
  146. package/dist/cli/mcp.js.map +0 -1
  147. package/dist/lib/gemini-mcp.d.ts +0 -10
  148. package/dist/lib/gemini-mcp.d.ts.map +0 -1
  149. package/dist/lib/gemini-mcp.js +0 -353
  150. package/dist/lib/gemini-mcp.js.map +0 -1
  151. package/dist/lib/gpt-mcp.d.ts +0 -10
  152. package/dist/lib/gpt-mcp.d.ts.map +0 -1
  153. package/dist/lib/gpt-mcp.js +0 -352
  154. package/dist/lib/gpt-mcp.js.map +0 -1
  155. package/dist/tools/analytics/getUsageAnalytics.d.ts +0 -10
  156. package/dist/tools/analytics/getUsageAnalytics.d.ts.map +0 -1
  157. package/dist/tools/analytics/getUsageAnalytics.js +0 -246
  158. package/dist/tools/analytics/getUsageAnalytics.js.map +0 -1
  159. package/dist/tools/analytics/index.d.ts +0 -5
  160. package/dist/tools/analytics/index.d.ts.map +0 -1
  161. package/dist/tools/analytics/index.js +0 -5
  162. package/dist/tools/analytics/index.js.map +0 -1
  163. package/dist/tools/convention/getCodingGuide.d.ts +0 -7
  164. package/dist/tools/convention/getCodingGuide.d.ts.map +0 -1
  165. package/dist/tools/convention/getCodingGuide.js +0 -69
  166. package/dist/tools/convention/getCodingGuide.js.map +0 -1
  167. package/dist/tools/planning/analyzeRequirements.d.ts +0 -9
  168. package/dist/tools/planning/analyzeRequirements.d.ts.map +0 -1
  169. package/dist/tools/planning/analyzeRequirements.js +0 -171
  170. package/dist/tools/planning/analyzeRequirements.js.map +0 -1
  171. package/dist/tools/planning/createUserStories.d.ts +0 -9
  172. package/dist/tools/planning/createUserStories.d.ts.map +0 -1
  173. package/dist/tools/planning/createUserStories.js +0 -124
  174. package/dist/tools/planning/createUserStories.js.map +0 -1
  175. package/dist/tools/planning/featureRoadmap.d.ts +0 -10
  176. package/dist/tools/planning/featureRoadmap.d.ts.map +0 -1
  177. package/dist/tools/planning/featureRoadmap.js +0 -207
  178. package/dist/tools/planning/featureRoadmap.js.map +0 -1
  179. package/dist/tools/planning/generatePrd.d.ts +0 -11
  180. package/dist/tools/planning/generatePrd.d.ts.map +0 -1
  181. package/dist/tools/planning/generatePrd.js +0 -161
  182. package/dist/tools/planning/generatePrd.js.map +0 -1
  183. package/dist/tools/planning/index.d.ts +0 -8
  184. package/dist/tools/planning/index.d.ts.map +0 -1
  185. package/dist/tools/planning/index.js +0 -8
  186. package/dist/tools/planning/index.js.map +0 -1
  187. package/dist/tools/prompt/analyzePrompt.d.ts +0 -7
  188. package/dist/tools/prompt/analyzePrompt.d.ts.map +0 -1
  189. package/dist/tools/prompt/analyzePrompt.js +0 -150
  190. package/dist/tools/prompt/analyzePrompt.js.map +0 -1
  191. package/dist/tools/prompt/enhancePrompt.d.ts +0 -8
  192. package/dist/tools/prompt/enhancePrompt.d.ts.map +0 -1
  193. package/dist/tools/prompt/enhancePrompt.js +0 -110
  194. package/dist/tools/prompt/enhancePrompt.js.map +0 -1
  195. package/dist/tools/prompt/enhancePromptGemini.d.ts +0 -8
  196. package/dist/tools/prompt/enhancePromptGemini.d.ts.map +0 -1
  197. package/dist/tools/prompt/enhancePromptGemini.js +0 -332
  198. package/dist/tools/prompt/enhancePromptGemini.js.map +0 -1
  199. package/dist/tools/prompt/index.d.ts +0 -7
  200. package/dist/tools/prompt/index.d.ts.map +0 -1
  201. package/dist/tools/prompt/index.js +0 -7
  202. package/dist/tools/prompt/index.js.map +0 -1
  203. package/dist/tools/reasoning/applyReasoningFramework.d.ts +0 -8
  204. package/dist/tools/reasoning/applyReasoningFramework.d.ts.map +0 -1
  205. package/dist/tools/reasoning/applyReasoningFramework.js +0 -266
  206. package/dist/tools/reasoning/applyReasoningFramework.js.map +0 -1
  207. package/dist/tools/reasoning/index.d.ts +0 -5
  208. package/dist/tools/reasoning/index.d.ts.map +0 -1
  209. package/dist/tools/reasoning/index.js +0 -5
  210. package/dist/tools/reasoning/index.js.map +0 -1
  211. package/dist/tools/thinking/analyzeProblem.d.ts +0 -7
  212. package/dist/tools/thinking/analyzeProblem.d.ts.map +0 -1
  213. package/dist/tools/thinking/analyzeProblem.js +0 -55
  214. package/dist/tools/thinking/analyzeProblem.js.map +0 -1
  215. package/dist/tools/thinking/breakDownProblem.d.ts +0 -8
  216. package/dist/tools/thinking/breakDownProblem.d.ts.map +0 -1
  217. package/dist/tools/thinking/breakDownProblem.js +0 -145
  218. package/dist/tools/thinking/breakDownProblem.js.map +0 -1
  219. package/dist/tools/thinking/createThinkingChain.d.ts +0 -7
  220. package/dist/tools/thinking/createThinkingChain.d.ts.map +0 -1
  221. package/dist/tools/thinking/createThinkingChain.js +0 -44
  222. package/dist/tools/thinking/createThinkingChain.js.map +0 -1
  223. package/dist/tools/thinking/formatAsPlan.d.ts +0 -9
  224. package/dist/tools/thinking/formatAsPlan.d.ts.map +0 -1
  225. package/dist/tools/thinking/formatAsPlan.js +0 -78
  226. package/dist/tools/thinking/formatAsPlan.js.map +0 -1
  227. package/dist/tools/thinking/index.d.ts +0 -10
  228. package/dist/tools/thinking/index.d.ts.map +0 -1
  229. package/dist/tools/thinking/index.js +0 -10
  230. package/dist/tools/thinking/index.js.map +0 -1
  231. package/dist/tools/thinking/stepByStepAnalysis.d.ts +0 -8
  232. package/dist/tools/thinking/stepByStepAnalysis.d.ts.map +0 -1
  233. package/dist/tools/thinking/stepByStepAnalysis.js +0 -63
  234. package/dist/tools/thinking/stepByStepAnalysis.js.map +0 -1
  235. package/dist/tools/thinking/thinkAloudProcess.d.ts +0 -8
  236. package/dist/tools/thinking/thinkAloudProcess.d.ts.map +0 -1
  237. package/dist/tools/thinking/thinkAloudProcess.js +0 -80
  238. package/dist/tools/thinking/thinkAloudProcess.js.map +0 -1
@@ -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}`);