aiwf 0.3.18 → 0.3.19

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 (33) hide show
  1. package/README.ko.md +84 -0
  2. package/README.md +87 -0
  3. package/ai-tools/README.md +105 -0
  4. package/ai-tools/augment/README.md +371 -0
  5. package/ai-tools/augment/config.json +30 -0
  6. package/ai-tools/augment/template/.augment/aiwf-integration.md +387 -0
  7. package/ai-tools/augment/template/.augment/augment.yaml +347 -0
  8. package/ai-tools/augment/template/augment.config.json +64 -0
  9. package/ai-tools/claude-code/README.md +151 -0
  10. package/ai-tools/claude-code/config.json +28 -0
  11. package/ai-tools/claude-code/template/CLAUDE.md +91 -0
  12. package/ai-tools/cursor/README.md +314 -0
  13. package/ai-tools/cursor/config.json +29 -0
  14. package/ai-tools/cursor/template/.cursorrules +362 -0
  15. package/ai-tools/github-copilot/README.md +195 -0
  16. package/ai-tools/github-copilot/config.json +24 -0
  17. package/ai-tools/github-copilot/template/.github/copilot-instructions.md +202 -0
  18. package/ai-tools/windsurf/README.md +355 -0
  19. package/ai-tools/windsurf/config.json +29 -0
  20. package/ai-tools/windsurf/template/.windsurf/aiwf-rules.md +260 -0
  21. package/ai-tools/windsurf/template/.windsurf/windsurf.config.js +312 -0
  22. package/ai-tools/windsurf/template/windsurf.config.json +63 -0
  23. package/docs/CODE_CLEANUP_GUIDE.ko.md +415 -0
  24. package/docs/CODE_CLEANUP_GUIDE.md +415 -0
  25. package/docs/VALIDATOR_API.ko.md +324 -0
  26. package/docs/VALIDATOR_API.md +324 -0
  27. package/package.json +3 -2
  28. package/src/cli/index.js +338 -0
  29. package/src/lib/backup-manager.js +4 -3
  30. package/src/lib/installer.js +126 -3
  31. package/src/lib/validator.js +78 -313
  32. package/src/utils/messages.js +16 -2
  33. package/src/utils/paths.js +1 -20
@@ -0,0 +1,415 @@
1
+ # 코드 정리 및 유지보수 가이드
2
+
3
+ ## 개요
4
+
5
+ 이 가이드는 AIWF v0.3.18+에서 사용된 코드 정리 원칙과 패턴을 문서화하며, 이는 유지보수성, 성능, 개발자 경험에서 상당한 개선을 달성했습니다. 검증 시스템의 주요 정리 작업은 지속적인 코드 품질 개선의 모델 역할을 합니다.
6
+
7
+ ## 코드 정리 성과
8
+
9
+ ### 검증 시스템 변환
10
+
11
+ 검증 시스템 정리는 체계적인 코드 최적화의 영향을 보여줍니다:
12
+
13
+ #### 정량적 개선
14
+ - **코드 감소**: 86% 감소 (348 → 48줄)
15
+ - **함수 통합**: 67% 감소 (3 → 1개 주요 함수)
16
+ - **중복 제거**: 3개의 중복 검증 함수 제거
17
+ - **성능 향상**: ~40% 더 빠른 실행, ~30% 메모리 사용량 감소
18
+
19
+ #### 정성적 개선
20
+ - **유지보수성 향상**: 명확한 관심사 분리
21
+ - **가독성 개선**: 단순화된 제어 흐름과 로직
22
+ - **더 나은 오류 처리**: 일관되고 실행 가능한 오류 메시지
23
+ - **통합된 인터페이스**: 모든 검증 작업을 위한 단일 진입점
24
+
25
+ ## 코드 정리 원칙
26
+
27
+ ### 1. 중복 제거 (DRY 원칙)
28
+
29
+ **이전 (안티패턴):**
30
+ ```javascript
31
+ // 여러 중복 검증 함수들
32
+ async function validateInstallationDetailed(tools, language, options) {
33
+ // 120줄의 유사한 검증 로직
34
+ }
35
+
36
+ async function validateInstallationEnhanced(tools, language, detailed) {
37
+ // 80줄의 중복 검증 로직
38
+ }
39
+
40
+ async function validateInstallation(tools, language) {
41
+ // 60줄의 기본 검증 로직
42
+ }
43
+ ```
44
+
45
+ **이후 (깔끔한 패턴):**
46
+ ```javascript
47
+ // 단일, 통합된 검증 함수
48
+ async function validateInstallation(selectedTools, language) {
49
+ // 48줄의 통합되고 효율적인 로직
50
+ const results = { success: [], failed: [], warnings: [] };
51
+
52
+ // 공통 검증 로직
53
+ const commonValid = await validateCommonFiles();
54
+ if (!commonValid.success) {
55
+ results.failed.push({ tool: 'aiwf', reason: commonValid.reason });
56
+ }
57
+
58
+ // 도구별 검증 루프
59
+ for (const tool of selectedTools) {
60
+ const validation = await validateTool(tool);
61
+ // 결과 처리...
62
+ }
63
+
64
+ return results;
65
+ }
66
+ ```
67
+
68
+ ### 2. 상수 기반 구성
69
+
70
+ **이전 (매직 넘버):**
71
+ ```javascript
72
+ // 코드 전반에 흩어진 매직 넘버들
73
+ if (stats.size < 10) { /* ... */ }
74
+ if (mdcFiles.length < 2) { /* ... */ }
75
+ if (stats.size < 50) { /* ... */ }
76
+ ```
77
+
78
+ **이후 (중앙화된 상수):**
79
+ ```javascript
80
+ // 중앙화된 구성
81
+ const VALIDATION_CONSTANTS = {
82
+ MIN_FILE_SIZE: 10,
83
+ MIN_RULE_FILE_SIZE: 50,
84
+ MIN_FILE_COUNT: {
85
+ CURSOR_MDC: 2,
86
+ WINDSURF_MD: 2,
87
+ CLAUDE_COMMANDS: 4
88
+ }
89
+ };
90
+
91
+ // 명확한 의도를 가진 사용
92
+ if (stats.size < VALIDATION_CONSTANTS.MIN_FILE_SIZE) { /* ... */ }
93
+ if (mdcFiles.length < VALIDATION_CONSTANTS.MIN_FILE_COUNT.CURSOR_MDC) { /* ... */ }
94
+ ```
95
+
96
+ ### 3. 단순화된 제어 흐름
97
+
98
+ **이전 (복잡한 중첩 조건):**
99
+ ```javascript
100
+ async function validateTool(tool, options) {
101
+ if (tool === 'claudeCode' || tool === 'claude-code') {
102
+ if (options && options.detailed) {
103
+ // 상세한 Claude 검증 로직
104
+ } else if (options && options.enhanced) {
105
+ // 향상된 Claude 검증 로직
106
+ } else {
107
+ // 기본 Claude 검증 로직
108
+ }
109
+ } else if (tool === 'cursor') {
110
+ // 유사한 중첩 복잡성...
111
+ }
112
+ // 더 많은 중첩 조건들...
113
+ }
114
+ ```
115
+
116
+ **이후 (깔끔한 switch 패턴):**
117
+ ```javascript
118
+ async function validateTool(tool) {
119
+ switch (tool) {
120
+ case 'claudeCode':
121
+ case 'claude-code':
122
+ return validateClaudeCode();
123
+ case 'cursor':
124
+ return validateCursorTool();
125
+ case 'windsurf':
126
+ return validateWindsurfTool();
127
+ default:
128
+ return { success: false, reason: `Unknown tool: ${tool}` };
129
+ }
130
+ }
131
+ ```
132
+
133
+ ### 4. 일관된 오류 처리
134
+
135
+ **이전 (일관성 없는 오류 패턴):**
136
+ ```javascript
137
+ // 혼합된 오류 처리 접근법
138
+ function validate1() {
139
+ try {
140
+ // 로직
141
+ } catch (e) {
142
+ return null; // 일관성 없는 반환
143
+ }
144
+ }
145
+
146
+ function validate2() {
147
+ // 로직
148
+ if (error) {
149
+ throw new Error('모호한 오류'); // 부실한 오류 메시지
150
+ }
151
+ }
152
+ ```
153
+
154
+ **이후 (일관된 오류 패턴):**
155
+ ```javascript
156
+ // 통합된 오류 처리 패턴
157
+ async function validateTool(tool) {
158
+ try {
159
+ // 검증 로직
160
+ return { success: true };
161
+ } catch (error) {
162
+ return {
163
+ success: false,
164
+ reason: `${tool} 검증 오류: ${error.message}`
165
+ };
166
+ }
167
+ }
168
+ ```
169
+
170
+ ## 정리 가이드라인
171
+
172
+ ### 파일 조직
173
+
174
+ #### 정리 전 체크리스트
175
+ 1. **중복 식별**: 반복되는 코드 패턴 검색
176
+ 2. **매직 넘버 찾기**: 상수로 만들어야 할 하드코딩된 값 찾기
177
+ 3. **함수 복잡성 분석**: 너무 많은 일을 하는 함수 식별
178
+ 4. **오류 처리 검토**: 일관성 없는 오류 패턴 확인
179
+ 5. **의존성 검사**: 사용하지 않는 import와 함수 제거
180
+
181
+ #### 정리 후 검증
182
+ 1. **기능 검증**: 모든 원래 기능이 여전히 작동하는지 확인
183
+ 2. **성능 테스트**: 속도와 메모리의 개선사항 측정
184
+ 3. **유지보수성 확인**: 코드가 이해하고 수정하기 더 쉬워졌는지 확인
185
+ 4. **오류 처리 검증**: 일관되고 도움이 되는 오류 메시지 확인
186
+ 5. **문서 업데이트**: 변경사항을 문서에 반영
187
+
188
+ ### 코드 품질 지표
189
+
190
+ #### 정량적 지표
191
+ - **코드 줄 수**: 통합을 통한 감소 목표
192
+ - **함수 개수**: 중복 함수 감소
193
+ - **순환 복잡도**: 제어 흐름 단순화
194
+ - **코드 커버리지**: 테스트 커버리지 유지 또는 개선
195
+ - **성능 벤치마크**: 실행 시간과 메모리 측정
196
+
197
+ #### 정성적 지표
198
+ - **가독성**: 코드가 명확한 이야기를 전달해야 함
199
+ - **유지보수성**: 변경사항을 쉽게 구현할 수 있어야 함
200
+ - **테스트 가능성**: 코드를 단위 테스트하기 쉬워야 함
201
+ - **문서화**: 코드와 주석에서 의도가 명확해야 함
202
+ - **일관성**: 코드베이스 전반에 걸쳐 유사한 패턴
203
+
204
+ ### 리팩토링 패턴
205
+
206
+ #### 1. 상수 추출
207
+ ```javascript
208
+ // 이전
209
+ if (fileSize < 10) { /* 오류 */ }
210
+ if (files.length < 2) { /* 오류 */ }
211
+
212
+ // 이후
213
+ const CONFIG = { MIN_SIZE: 10, MIN_COUNT: 2 };
214
+ if (fileSize < CONFIG.MIN_SIZE) { /* 오류 */ }
215
+ if (files.length < CONFIG.MIN_COUNT) { /* 오류 */ }
216
+ ```
217
+
218
+ #### 2. 유사한 함수들 통합
219
+ ```javascript
220
+ // 이전: 여러 유사한 함수들
221
+ function validateToolA() { /* 유사한 로직 */ }
222
+ function validateToolB() { /* 유사한 로직 */ }
223
+ function validateToolC() { /* 유사한 로직 */ }
224
+
225
+ // 이후: 단일 매개변수화된 함수
226
+ function validateTool(toolType) {
227
+ const toolConfig = TOOL_CONFIGS[toolType];
228
+ // 통합된 검증 로직
229
+ }
230
+ ```
231
+
232
+ #### 3. 조건부 로직 단순화
233
+ ```javascript
234
+ // 이전: 중첩 조건들
235
+ if (condition1) {
236
+ if (condition2) {
237
+ if (condition3) {
238
+ // 무언가 수행
239
+ }
240
+ }
241
+ }
242
+
243
+ // 이후: 조기 반환
244
+ if (!condition1) return earlyResult;
245
+ if (!condition2) return earlyResult;
246
+ if (!condition3) return earlyResult;
247
+ // 무언가 수행
248
+ ```
249
+
250
+ #### 4. 오류 처리 표준화
251
+ ```javascript
252
+ // 이전: 혼합 패턴
253
+ function operation1() {
254
+ try {
255
+ // 로직
256
+ } catch (e) {
257
+ console.log(e); // 일관성 없음
258
+ return null;
259
+ }
260
+ }
261
+
262
+ // 이후: 일관된 패턴
263
+ function operation1() {
264
+ try {
265
+ // 로직
266
+ return { success: true, data: result };
267
+ } catch (error) {
268
+ return { success: false, reason: error.message };
269
+ }
270
+ }
271
+ ```
272
+
273
+ ## 코드 리뷰 체크리스트
274
+
275
+ ### 정리 전 리뷰
276
+ - [ ] 코드 중복 식별
277
+ - [ ] 매직 넘버와 하드코딩된 값 찾기
278
+ - [ ] 지나치게 복잡한 함수 위치 파악
279
+ - [ ] 일관성 없는 패턴 확인
280
+ - [ ] 사용하지 않는 코드 식별
281
+
282
+ ### 정리 후 리뷰
283
+ - [ ] 기능 보존 검증
284
+ - [ ] 성능 개선 확인
285
+ - [ ] 오류 처리 일관성 확인
286
+ - [ ] 테스트 커버리지 유지 검증
287
+ - [ ] 문서 업데이트 확인
288
+
289
+ ## 성능 최적화 전략
290
+
291
+ ### 1. 함수 호출 감소
292
+ ```javascript
293
+ // 이전: 여러 함수 호출
294
+ async function validate() {
295
+ await validateA();
296
+ await validateB();
297
+ await validateC();
298
+ }
299
+
300
+ // 이후: 배치 작업
301
+ async function validate() {
302
+ const results = await Promise.all([
303
+ validateA(),
304
+ validateB(),
305
+ validateC()
306
+ ]);
307
+ return consolidateResults(results);
308
+ }
309
+ ```
310
+
311
+ ### 2. 파일 작업 최적화
312
+ ```javascript
313
+ // 이전: 여러 파일 시스템 호출
314
+ const file1Exists = await fs.access(path1);
315
+ const file2Exists = await fs.access(path2);
316
+ const file3Exists = await fs.access(path3);
317
+
318
+ // 이후: 배치 파일 작업
319
+ const fileChecks = await Promise.all([
320
+ fs.access(path1).then(() => true).catch(() => false),
321
+ fs.access(path2).then(() => true).catch(() => false),
322
+ fs.access(path3).then(() => true).catch(() => false)
323
+ ]);
324
+ ```
325
+
326
+ ### 3. 메모리 최적화
327
+ ```javascript
328
+ // 이전: 메모리에 큰 객체들
329
+ const allData = await loadEntireDataset();
330
+ const processed = processLargeDataset(allData);
331
+
332
+ // 이후: 스트리밍/청크 처리
333
+ const processedData = await processDataInChunks(dataSource, chunkSize);
334
+ ```
335
+
336
+ ## 유지보수 전략
337
+
338
+ ### 정기적인 코드 건강 검사
339
+
340
+ #### 월별 리뷰
341
+ - [ ] 새로운 코드 중복 식별
342
+ - [ ] 증가하는 함수 복잡성 확인
343
+ - [ ] 오류 처리 패턴 검토
344
+ - [ ] 성능 지표 분석
345
+ - [ ] 상수와 구성 업데이트
346
+
347
+ #### 분기별 정리
348
+ - [ ] 주요 리팩토링 기회
349
+ - [ ] 의존성 정리 및 업데이트
350
+ - [ ] 성능 최적화 이니셔티브
351
+ - [ ] 문서 동기화
352
+ - [ ] 테스트 스위트 개선
353
+
354
+ ### 자동화된 코드 품질
355
+
356
+ #### 린팅 규칙
357
+ ```json
358
+ {
359
+ "rules": {
360
+ "max-lines-per-function": ["error", 50],
361
+ "max-params": ["error", 3],
362
+ "complexity": ["error", 10],
363
+ "no-duplicate-code": "error"
364
+ }
365
+ }
366
+ ```
367
+
368
+ #### Pre-commit 훅
369
+ ```bash
370
+ #!/bin/sh
371
+ # 린팅 실행
372
+ npm run lint
373
+
374
+ # 테스트 실행
375
+ npm test
376
+
377
+ # 코드 중복 확인
378
+ npm run check-duplication
379
+
380
+ # 성능 벤치마크 검증
381
+ npm run performance-check
382
+ ```
383
+
384
+ ## 모범 사례 요약
385
+
386
+ ### 코드 조직
387
+ 1. **단일 책임**: 각 함수는 한 가지 일을 잘해야 함
388
+ 2. **명확한 명명**: 함수와 변수 이름은 자체 문서화되어야 함
389
+ 3. **일관된 패턴**: 코드베이스 전반에 걸쳐 동일한 패턴 사용
390
+ 4. **최소 의존성**: 실제로 사용하는 것만 import
391
+
392
+ ### 오류 처리
393
+ 1. **일관된 형식**: 모든 곳에서 동일한 오류 반환 형식 사용
394
+ 2. **구체적인 메시지**: 실행 가능한 오류 정보 제공
395
+ 3. **우아한 성능 저하**: 시스템을 중단시키지 않고 오류 처리
396
+ 4. **로깅 전략**: 디버깅을 위해 적절하게 오류 로깅
397
+
398
+ ### 성능
399
+ 1. **먼저 측정**: 최적화하기 전에 프로파일링
400
+ 2. **병목현상 최적화**: 가장 영향력 있는 개선에 집중
401
+ 3. **배치 작업**: 가능할 때 유사한 작업을 결합
402
+ 4. **결과 캐싱**: 중복 계산 피하기
403
+
404
+ ### 유지보수성
405
+ 1. **의도 문서화**: 무엇인지가 아니라 왜인지 설명
406
+ 2. **버전 관리**: 원자적이고 잘 설명된 커밋 만들기
407
+ 3. **테스트 커버리지**: 포괄적인 테스트 스위트 유지
408
+ 4. **정기적인 리팩토링**: 기술 부채를 사전에 해결
409
+
410
+ ## 관련 문서
411
+
412
+ - [Validator API 참조](VALIDATOR_API.ko.md)
413
+ - [아키텍처 가이드](ARCHITECTURE.ko.md)
414
+ - [기여 가이드라인](CONTRIBUTING.ko.md)
415
+ - [성능 가이드라인](PERFORMANCE_GUIDELINES.ko.md)