@su-record/vibe 2.4.72 → 2.4.76

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 (164) hide show
  1. package/CLAUDE.md +216 -215
  2. package/README.md +4 -4
  3. package/agents/research/best-practices-agent.md +13 -13
  4. package/agents/research/codebase-patterns-agent.md +33 -33
  5. package/agents/research/framework-docs-agent.md +23 -23
  6. package/agents/research/security-advisory-agent.md +29 -29
  7. package/agents/review/architecture-reviewer.md +31 -31
  8. package/agents/review/complexity-reviewer.md +21 -21
  9. package/agents/review/data-integrity-reviewer.md +29 -29
  10. package/agents/review/git-history-reviewer.md +24 -24
  11. package/agents/review/performance-reviewer.md +29 -29
  12. package/agents/review/python-reviewer.md +53 -53
  13. package/agents/review/rails-reviewer.md +40 -40
  14. package/agents/review/react-reviewer.md +40 -40
  15. package/agents/review/security-reviewer.md +29 -29
  16. package/agents/review/simplicity-reviewer.md +24 -24
  17. package/agents/review/test-coverage-reviewer.md +31 -31
  18. package/agents/review/typescript-reviewer.md +41 -41
  19. package/commands/vibe.analyze.md +103 -7
  20. package/commands/vibe.reason.md +106 -0
  21. package/commands/vibe.review.md +123 -38
  22. package/commands/vibe.run.md +286 -223
  23. package/commands/vibe.spec.md +425 -186
  24. package/commands/vibe.utils.md +104 -3
  25. package/commands/vibe.verify.md +179 -86
  26. package/dist/cli/detect.js +40 -40
  27. package/dist/cli/detect.js.map +1 -1
  28. package/dist/cli/index.d.ts +1 -1
  29. package/dist/cli/index.js +1 -1
  30. package/dist/cli/llm.js +5 -5
  31. package/dist/cli/llm.js.map +1 -1
  32. package/dist/cli/setup.js +3 -3
  33. package/dist/cli/setup.js.map +1 -1
  34. package/dist/lib/ContextCompressor.js +1 -1
  35. package/dist/lib/ContextCompressor.js.map +1 -1
  36. package/dist/lib/MemoryManager.d.ts +13 -155
  37. package/dist/lib/MemoryManager.d.ts.map +1 -1
  38. package/dist/lib/MemoryManager.js +52 -617
  39. package/dist/lib/MemoryManager.js.map +1 -1
  40. package/dist/lib/gemini-api.js +12 -12
  41. package/dist/lib/gemini-api.js.map +1 -1
  42. package/dist/lib/gemini-oauth.js +22 -22
  43. package/dist/lib/gemini-oauth.js.map +1 -1
  44. package/dist/lib/gemini-storage.js +3 -3
  45. package/dist/lib/gemini-storage.js.map +1 -1
  46. package/dist/lib/gpt-api.js +11 -11
  47. package/dist/lib/gpt-api.js.map +1 -1
  48. package/dist/lib/gpt-oauth.js +28 -28
  49. package/dist/lib/gpt-oauth.js.map +1 -1
  50. package/dist/lib/gpt-storage.js +3 -3
  51. package/dist/lib/gpt-storage.js.map +1 -1
  52. package/dist/lib/memory/KnowledgeGraph.d.ts +34 -0
  53. package/dist/lib/memory/KnowledgeGraph.d.ts.map +1 -0
  54. package/dist/lib/memory/KnowledgeGraph.js +216 -0
  55. package/dist/lib/memory/KnowledgeGraph.js.map +1 -0
  56. package/dist/lib/memory/KnowledgeGraph.test.d.ts +2 -0
  57. package/dist/lib/memory/KnowledgeGraph.test.d.ts.map +1 -0
  58. package/dist/lib/memory/KnowledgeGraph.test.js +189 -0
  59. package/dist/lib/memory/KnowledgeGraph.test.js.map +1 -0
  60. package/dist/lib/memory/MemorySearch.d.ts +25 -0
  61. package/dist/lib/memory/MemorySearch.d.ts.map +1 -0
  62. package/dist/lib/memory/MemorySearch.js +85 -0
  63. package/dist/lib/memory/MemorySearch.js.map +1 -0
  64. package/dist/lib/memory/MemorySearch.test.d.ts +2 -0
  65. package/dist/lib/memory/MemorySearch.test.d.ts.map +1 -0
  66. package/dist/lib/memory/MemorySearch.test.js +149 -0
  67. package/dist/lib/memory/MemorySearch.test.js.map +1 -0
  68. package/dist/lib/memory/MemoryStorage.d.ts +77 -0
  69. package/dist/lib/memory/MemoryStorage.d.ts.map +1 -0
  70. package/dist/lib/memory/MemoryStorage.js +278 -0
  71. package/dist/lib/memory/MemoryStorage.js.map +1 -0
  72. package/dist/lib/memory/MemoryStorage.test.d.ts +2 -0
  73. package/dist/lib/memory/MemoryStorage.test.d.ts.map +1 -0
  74. package/dist/lib/memory/MemoryStorage.test.js +198 -0
  75. package/dist/lib/memory/MemoryStorage.test.js.map +1 -0
  76. package/dist/lib/memory/index.d.ts +4 -0
  77. package/dist/lib/memory/index.d.ts.map +1 -0
  78. package/dist/lib/memory/index.js +8 -0
  79. package/dist/lib/memory/index.js.map +1 -0
  80. package/dist/orchestrator/orchestrator.d.ts.map +1 -1
  81. package/dist/orchestrator/orchestrator.js +4 -6
  82. package/dist/orchestrator/orchestrator.js.map +1 -1
  83. package/dist/tools/convention/analyzeComplexity.d.ts +3 -1
  84. package/dist/tools/convention/analyzeComplexity.d.ts.map +1 -1
  85. package/dist/tools/convention/analyzeComplexity.js +102 -4
  86. package/dist/tools/convention/analyzeComplexity.js.map +1 -1
  87. package/dist/tools/convention/analyzeComplexity.test.d.ts +2 -0
  88. package/dist/tools/convention/analyzeComplexity.test.d.ts.map +1 -0
  89. package/dist/tools/convention/analyzeComplexity.test.js +207 -0
  90. package/dist/tools/convention/analyzeComplexity.test.js.map +1 -0
  91. package/dist/tools/convention/applyQualityRules.js +1 -1
  92. package/dist/tools/convention/applyQualityRules.js.map +1 -1
  93. package/dist/tools/convention/checkCouplingCohesion.js +2 -2
  94. package/dist/tools/convention/checkCouplingCohesion.js.map +1 -1
  95. package/dist/tools/convention/suggestImprovements.js +1 -1
  96. package/dist/tools/convention/suggestImprovements.js.map +1 -1
  97. package/dist/tools/convention/validateCodeQuality.d.ts +3 -1
  98. package/dist/tools/convention/validateCodeQuality.d.ts.map +1 -1
  99. package/dist/tools/convention/validateCodeQuality.js +145 -2
  100. package/dist/tools/convention/validateCodeQuality.js.map +1 -1
  101. package/dist/tools/convention/validateCodeQuality.test.d.ts +2 -0
  102. package/dist/tools/convention/validateCodeQuality.test.d.ts.map +1 -0
  103. package/dist/tools/convention/validateCodeQuality.test.js +230 -0
  104. package/dist/tools/convention/validateCodeQuality.test.js.map +1 -0
  105. package/dist/tools/memory/autoSaveContext.js +1 -1
  106. package/dist/tools/memory/autoSaveContext.js.map +1 -1
  107. package/dist/tools/memory/createMemoryTimeline.js +27 -27
  108. package/dist/tools/memory/createMemoryTimeline.js.map +1 -1
  109. package/dist/tools/memory/deleteMemory.js +1 -1
  110. package/dist/tools/memory/deleteMemory.js.map +1 -1
  111. package/dist/tools/memory/getMemoryGraph.js +24 -24
  112. package/dist/tools/memory/getMemoryGraph.js.map +1 -1
  113. package/dist/tools/memory/getSessionContext.js +36 -36
  114. package/dist/tools/memory/getSessionContext.js.map +1 -1
  115. package/dist/tools/memory/linkMemories.js +21 -21
  116. package/dist/tools/memory/linkMemories.js.map +1 -1
  117. package/dist/tools/memory/prioritizeMemory.js +1 -1
  118. package/dist/tools/memory/prioritizeMemory.js.map +1 -1
  119. package/dist/tools/memory/restoreSessionContext.js +1 -1
  120. package/dist/tools/memory/restoreSessionContext.js.map +1 -1
  121. package/dist/tools/memory/searchMemories.js +1 -1
  122. package/dist/tools/memory/searchMemories.js.map +1 -1
  123. package/dist/tools/memory/searchMemoriesAdvanced.js +42 -42
  124. package/dist/tools/memory/searchMemoriesAdvanced.js.map +1 -1
  125. package/dist/tools/memory/startSession.js +2 -2
  126. package/dist/tools/memory/startSession.js.map +1 -1
  127. package/dist/tools/memory/updateMemory.js +1 -1
  128. package/dist/tools/memory/updateMemory.js.map +1 -1
  129. package/dist/tools/semantic/analyzeDependencyGraph.js +38 -38
  130. package/dist/tools/semantic/analyzeDependencyGraph.js.map +1 -1
  131. package/dist/tools/semantic/findReferences.js +1 -1
  132. package/dist/tools/semantic/findReferences.js.map +1 -1
  133. package/dist/tools/semantic/findSymbol.js +1 -1
  134. package/dist/tools/semantic/findSymbol.js.map +1 -1
  135. package/dist/tools/time/getCurrentTime.js +1 -1
  136. package/dist/tools/time/getCurrentTime.js.map +1 -1
  137. package/dist/tools/ui/previewUiAscii.js +2 -2
  138. package/dist/tools/ui/previewUiAscii.js.map +1 -1
  139. package/hooks/hooks.json +11 -2
  140. package/hooks/scripts/llm-orchestrate.js +1 -1
  141. package/hooks/scripts/utils.js +31 -6
  142. package/languages/csharp-unity.md +82 -83
  143. package/languages/dart-flutter.md +89 -88
  144. package/languages/go.md +76 -75
  145. package/languages/java-spring.md +85 -84
  146. package/languages/kotlin-android.md +64 -63
  147. package/languages/python-django.md +83 -82
  148. package/languages/python-fastapi.md +82 -81
  149. package/languages/rust.md +75 -74
  150. package/languages/swift-ios.md +73 -72
  151. package/languages/typescript-electron.md +70 -71
  152. package/languages/typescript-nextjs.md +93 -92
  153. package/languages/typescript-node.md +64 -63
  154. package/languages/typescript-nuxt.md +113 -112
  155. package/languages/typescript-react-native.md +82 -81
  156. package/languages/typescript-react.md +76 -75
  157. package/languages/typescript-tauri.md +74 -75
  158. package/languages/typescript-vue.md +73 -72
  159. package/package.json +1 -1
  160. package/skills/git-worktree.md +25 -25
  161. package/skills/multi-llm-orchestration.md +4 -6
  162. package/skills/priority-todos.md +39 -39
  163. package/skills/vibe-capabilities.md +2 -2
  164. package/vibe/config.json +2 -2
package/languages/go.md CHANGED
@@ -1,58 +1,59 @@
1
- # 🐹 Go 품질 규칙
1
+ # Go Quality Rules
2
2
 
3
- ## 핵심 원칙 (core에서 상속)
3
+ ## Core Principles (inherited from core)
4
4
 
5
5
  ```markdown
6
- 단일 책임 (SRP)
7
- 중복 제거 (DRY)
8
- 재사용성
9
- ✅ 낮은 복잡도
10
- 함수 ≤ 30줄
11
- 중첩 3단계
12
- Cyclomatic complexity ≤ 10
6
+ # Core Principles (inherited from core)
7
+ Single Responsibility (SRP)
8
+ No Duplication (DRY)
9
+ Reusability
10
+ Low Complexity
11
+ Function <= 30 lines
12
+ Nesting <= 3 levels
13
+ Cyclomatic complexity <= 10
13
14
  ```
14
15
 
15
- ## Go 특화 규칙
16
+ ## Go Specific Rules
16
17
 
17
- ### 1. 에러 처리
18
+ ### 1. Error Handling
18
19
 
19
20
  ```go
20
- // 에러 무시
21
+ // Bad: Ignoring error
21
22
  data, _ := ioutil.ReadFile("config.json")
22
23
 
23
- // 에러 항상 처리
24
+ // Good: Always handle errors
24
25
  data, err := ioutil.ReadFile("config.json")
25
26
  if err != nil {
26
- return fmt.Errorf("설정 파일 읽기 실패: %w", err)
27
+ return fmt.Errorf("failed to read config file: %w", err)
27
28
  }
28
29
 
29
- // 커스텀 에러 타입
30
+ // Good: Custom error type
30
31
  type NotFoundError struct {
31
32
  Resource string
32
33
  ID string
33
34
  }
34
35
 
35
36
  func (e *NotFoundError) Error() string {
36
- return fmt.Sprintf("%s (ID: %s)를 찾을 수 없습니다", e.Resource, e.ID)
37
+ return fmt.Sprintf("%s not found (ID: %s)", e.Resource, e.ID)
37
38
  }
38
39
 
39
- // 사용
40
+ // Usage
40
41
  func GetUser(id string) (*User, error) {
41
42
  user, err := repo.FindByID(id)
42
43
  if err != nil {
43
- return nil, fmt.Errorf("사용자 조회 실패: %w", err)
44
+ return nil, fmt.Errorf("failed to get user: %w", err)
44
45
  }
45
46
  if user == nil {
46
- return nil, &NotFoundError{Resource: "사용자", ID: id}
47
+ return nil, &NotFoundError{Resource: "User", ID: id}
47
48
  }
48
49
  return user, nil
49
50
  }
50
51
  ```
51
52
 
52
- ### 2. 구조체와 인터페이스
53
+ ### 2. Structs and Interfaces
53
54
 
54
55
  ```go
55
- // 구조체 정의
56
+ // Good: Struct definition
56
57
  type User struct {
57
58
  ID string `json:"id"`
58
59
  Email string `json:"email"`
@@ -61,7 +62,7 @@ type User struct {
61
62
  UpdatedAt time.Time `json:"updated_at"`
62
63
  }
63
64
 
64
- // 생성자 함수
65
+ // Good: Constructor function
65
66
  func NewUser(email, name string) *User {
66
67
  now := time.Now()
67
68
  return &User{
@@ -73,7 +74,7 @@ func NewUser(email, name string) *User {
73
74
  }
74
75
  }
75
76
 
76
- // 작은 인터페이스 (Go 철학)
77
+ // Good: Small interfaces (Go philosophy)
77
78
  type Reader interface {
78
79
  Read(p []byte) (n int, err error)
79
80
  }
@@ -82,13 +83,13 @@ type Writer interface {
82
83
  Write(p []byte) (n int, err error)
83
84
  }
84
85
 
85
- // 인터페이스 조합
86
+ // Good: Interface composition
86
87
  type ReadWriter interface {
87
88
  Reader
88
89
  Writer
89
90
  }
90
91
 
91
- // Repository 인터페이스
92
+ // Good: Repository interface
92
93
  type UserRepository interface {
93
94
  FindByID(ctx context.Context, id string) (*User, error)
94
95
  FindByEmail(ctx context.Context, email string) (*User, error)
@@ -98,12 +99,12 @@ type UserRepository interface {
98
99
  }
99
100
  ```
100
101
 
101
- ### 3. Context 사용
102
+ ### 3. Context Usage
102
103
 
103
104
  ```go
104
- // Context 전파
105
+ // Good: Context propagation
105
106
  func (s *UserService) GetUser(ctx context.Context, id string) (*User, error) {
106
- // Context를 하위 함수에 전달
107
+ // Pass context to downstream functions
107
108
  user, err := s.repo.FindByID(ctx, id)
108
109
  if err != nil {
109
110
  return nil, err
@@ -111,7 +112,7 @@ func (s *UserService) GetUser(ctx context.Context, id string) (*User, error) {
111
112
  return user, nil
112
113
  }
113
114
 
114
- // Context 타임아웃
115
+ // Good: Context timeout
115
116
  func (h *Handler) HandleRequest(w http.ResponseWriter, r *http.Request) {
116
117
  ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)
117
118
  defer cancel()
@@ -119,7 +120,7 @@ func (h *Handler) HandleRequest(w http.ResponseWriter, r *http.Request) {
119
120
  result, err := h.service.Process(ctx)
120
121
  if err != nil {
121
122
  if errors.Is(err, context.DeadlineExceeded) {
122
- http.Error(w, "요청 시간 초과", http.StatusRequestTimeout)
123
+ http.Error(w, "Request timeout", http.StatusRequestTimeout)
123
124
  return
124
125
  }
125
126
  http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -130,10 +131,10 @@ func (h *Handler) HandleRequest(w http.ResponseWriter, r *http.Request) {
130
131
  }
131
132
  ```
132
133
 
133
- ### 4. HTTP 핸들러 (net/http, Gin, Echo)
134
+ ### 4. HTTP Handlers (net/http, Gin, Echo)
134
135
 
135
136
  ```go
136
- // net/http 핸들러
137
+ // Good: net/http handler
137
138
  func (h *UserHandler) GetUser(w http.ResponseWriter, r *http.Request) {
138
139
  id := chi.URLParam(r, "id")
139
140
 
@@ -144,7 +145,7 @@ func (h *UserHandler) GetUser(w http.ResponseWriter, r *http.Request) {
144
145
  http.Error(w, err.Error(), http.StatusNotFound)
145
146
  return
146
147
  }
147
- http.Error(w, "서버 오류", http.StatusInternalServerError)
148
+ http.Error(w, "Server error", http.StatusInternalServerError)
148
149
  return
149
150
  }
150
151
 
@@ -152,7 +153,7 @@ func (h *UserHandler) GetUser(w http.ResponseWriter, r *http.Request) {
152
153
  json.NewEncoder(w).Encode(user)
153
154
  }
154
155
 
155
- // Gin 핸들러
156
+ // Good: Gin handler
156
157
  func (h *UserHandler) GetUser(c *gin.Context) {
157
158
  id := c.Param("id")
158
159
 
@@ -163,14 +164,14 @@ func (h *UserHandler) GetUser(c *gin.Context) {
163
164
  c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
164
165
  return
165
166
  }
166
- c.JSON(http.StatusInternalServerError, gin.H{"error": "서버 오류"})
167
+ c.JSON(http.StatusInternalServerError, gin.H{"error": "Server error"})
167
168
  return
168
169
  }
169
170
 
170
171
  c.JSON(http.StatusOK, user)
171
172
  }
172
173
 
173
- // Echo 핸들러
174
+ // Good: Echo handler
174
175
  func (h *UserHandler) GetUser(c echo.Context) error {
175
176
  id := c.Param("id")
176
177
 
@@ -180,17 +181,17 @@ func (h *UserHandler) GetUser(c echo.Context) error {
180
181
  if errors.As(err, &notFound) {
181
182
  return c.JSON(http.StatusNotFound, map[string]string{"error": err.Error()})
182
183
  }
183
- return c.JSON(http.StatusInternalServerError, map[string]string{"error": "서버 오류"})
184
+ return c.JSON(http.StatusInternalServerError, map[string]string{"error": "Server error"})
184
185
  }
185
186
 
186
187
  return c.JSON(http.StatusOK, user)
187
188
  }
188
189
  ```
189
190
 
190
- ### 5. 의존성 주입
191
+ ### 5. Dependency Injection
191
192
 
192
193
  ```go
193
- // 구조체에 의존성 주입
194
+ // Good: Inject dependencies into struct
194
195
  type UserService struct {
195
196
  repo UserRepository
196
197
  cache CacheRepository
@@ -209,7 +210,7 @@ func NewUserService(
209
210
  }
210
211
  }
211
212
 
212
- // 옵션 패턴
213
+ // Good: Options pattern
213
214
  type ServerOption func(*Server)
214
215
 
215
216
  func WithPort(port int) ServerOption {
@@ -226,7 +227,7 @@ func WithTimeout(timeout time.Duration) ServerOption {
226
227
 
227
228
  func NewServer(opts ...ServerOption) *Server {
228
229
  s := &Server{
229
- port: 8080, // 기본값
230
+ port: 8080, // Default
230
231
  timeout: 30 * time.Second,
231
232
  }
232
233
  for _, opt := range opts {
@@ -235,17 +236,17 @@ func NewServer(opts ...ServerOption) *Server {
235
236
  return s
236
237
  }
237
238
 
238
- // 사용
239
+ // Usage
239
240
  server := NewServer(
240
241
  WithPort(3000),
241
242
  WithTimeout(60*time.Second),
242
243
  )
243
244
  ```
244
245
 
245
- ### 6. 동시성
246
+ ### 6. Concurrency
246
247
 
247
248
  ```go
248
- // Goroutine + Channel
249
+ // Good: Goroutine + Channel
249
250
  func ProcessItems(ctx context.Context, items []Item) ([]Result, error) {
250
251
  results := make(chan Result, len(items))
251
252
  errs := make(chan error, len(items))
@@ -264,7 +265,7 @@ func ProcessItems(ctx context.Context, items []Item) ([]Result, error) {
264
265
  }(item)
265
266
  }
266
267
 
267
- // 결과 수집
268
+ // Collect results
268
269
  go func() {
269
270
  wg.Wait()
270
271
  close(results)
@@ -276,7 +277,7 @@ func ProcessItems(ctx context.Context, items []Item) ([]Result, error) {
276
277
  finalResults = append(finalResults, result)
277
278
  }
278
279
 
279
- // 번째 에러 반환
280
+ // Return first error
280
281
  select {
281
282
  case err := <-errs:
282
283
  return nil, err
@@ -285,7 +286,7 @@ func ProcessItems(ctx context.Context, items []Item) ([]Result, error) {
285
286
  }
286
287
  }
287
288
 
288
- // errgroup 사용 (권장)
289
+ // Good: Using errgroup (recommended)
289
290
  import "golang.org/x/sync/errgroup"
290
291
 
291
292
  func ProcessItems(ctx context.Context, items []Item) ([]Result, error) {
@@ -293,7 +294,7 @@ func ProcessItems(ctx context.Context, items []Item) ([]Result, error) {
293
294
  results := make([]Result, len(items))
294
295
 
295
296
  for i, item := range items {
296
- i, item := i, item // 클로저 캡처
297
+ i, item := i, item // Closure capture
297
298
  g.Go(func() error {
298
299
  result, err := processItem(ctx, item)
299
300
  if err != nil {
@@ -311,19 +312,19 @@ func ProcessItems(ctx context.Context, items []Item) ([]Result, error) {
311
312
  }
312
313
  ```
313
314
 
314
- ### 7. 테스트
315
+ ### 7. Testing
315
316
 
316
317
  ```go
317
- // 테이블 기반 테스트
318
+ // Good: Table-driven tests
318
319
  func TestAdd(t *testing.T) {
319
320
  tests := []struct {
320
321
  name string
321
322
  a, b int
322
323
  expected int
323
324
  }{
324
- {"양수 덧셈", 2, 3, 5},
325
- {"음수 덧셈", -1, -2, -3},
326
- {"영과 덧셈", 0, 5, 5},
325
+ {"positive addition", 2, 3, 5},
326
+ {"negative addition", -1, -2, -3},
327
+ {"addition with zero", 0, 5, 5},
327
328
  }
328
329
 
329
330
  for _, tt := range tests {
@@ -336,7 +337,7 @@ func TestAdd(t *testing.T) {
336
337
  }
337
338
  }
338
339
 
339
- // Mock 사용 (testify)
340
+ // Good: Using mock (testify)
340
341
  type MockUserRepository struct {
341
342
  mock.Mock
342
343
  }
@@ -353,7 +354,7 @@ func TestUserService_GetUser(t *testing.T) {
353
354
  mockRepo := new(MockUserRepository)
354
355
  service := NewUserService(mockRepo, nil, slog.Default())
355
356
 
356
- expectedUser := &User{ID: "123", Name: "테스트"}
357
+ expectedUser := &User{ID: "123", Name: "Test"}
357
358
  mockRepo.On("FindByID", mock.Anything, "123").Return(expectedUser, nil)
358
359
 
359
360
  user, err := service.GetUser(context.Background(), "123")
@@ -364,33 +365,33 @@ func TestUserService_GetUser(t *testing.T) {
364
365
  }
365
366
  ```
366
367
 
367
- ## 파일 구조
368
+ ## File Structure
368
369
 
369
- ```
370
+ ```text
370
371
  project/
371
372
  ├── cmd/
372
373
  │ └── server/
373
- │ └── main.go # 엔트리포인트
374
+ │ └── main.go # Entry point
374
375
  ├── internal/
375
- │ ├── domain/ # 도메인 모델
376
- │ ├── handler/ # HTTP 핸들러
377
- │ ├── service/ # 비즈니스 로직
378
- │ ├── repository/ # 데이터 액세스
379
- │ └── middleware/ # 미들웨어
380
- ├── pkg/ # 외부 공개 패키지
381
- ├── config/ # 설정
382
- ├── migrations/ # DB 마이그레이션
376
+ │ ├── domain/ # Domain models
377
+ │ ├── handler/ # HTTP handlers
378
+ │ ├── service/ # Business logic
379
+ │ ├── repository/ # Data access
380
+ │ └── middleware/ # Middleware
381
+ ├── pkg/ # Public packages
382
+ ├── config/ # Configuration
383
+ ├── migrations/ # DB migrations
383
384
  ├── go.mod
384
385
  └── go.sum
385
386
  ```
386
387
 
387
- ## 체크리스트
388
+ ## Checklist
388
389
 
389
- - [ ] 에러 항상 처리 (_, err 금지)
390
- - [ ] fmt.Errorf("%w", err)로 에러 래핑
391
- - [ ] Context 번째 인자로 전달
392
- - [ ] 작은 인터페이스 정의
393
- - [ ] 생성자 함수 (NewXxx) 사용
394
- - [ ] 테이블 기반 테스트
395
- - [ ] gofmt, golint, go vet 통과
396
- - [ ] 동시성에서 race condition 주의
390
+ - [ ] Always handle errors (no _, err)
391
+ - [ ] Wrap errors with fmt.Errorf("%w", err)
392
+ - [ ] Pass Context as first argument
393
+ - [ ] Define small interfaces
394
+ - [ ] Use constructor functions (NewXxx)
395
+ - [ ] Table-driven tests
396
+ - [ ] Pass gofmt, golint, go vet
397
+ - [ ] Watch for race conditions in concurrency