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.
- package/README.ko.md +84 -0
- package/README.md +87 -0
- package/ai-tools/README.md +105 -0
- package/ai-tools/augment/README.md +371 -0
- package/ai-tools/augment/config.json +30 -0
- package/ai-tools/augment/template/.augment/aiwf-integration.md +387 -0
- package/ai-tools/augment/template/.augment/augment.yaml +347 -0
- package/ai-tools/augment/template/augment.config.json +64 -0
- package/ai-tools/claude-code/README.md +151 -0
- package/ai-tools/claude-code/config.json +28 -0
- package/ai-tools/claude-code/template/CLAUDE.md +91 -0
- package/ai-tools/cursor/README.md +314 -0
- package/ai-tools/cursor/config.json +29 -0
- package/ai-tools/cursor/template/.cursorrules +362 -0
- package/ai-tools/github-copilot/README.md +195 -0
- package/ai-tools/github-copilot/config.json +24 -0
- package/ai-tools/github-copilot/template/.github/copilot-instructions.md +202 -0
- package/ai-tools/windsurf/README.md +355 -0
- package/ai-tools/windsurf/config.json +29 -0
- package/ai-tools/windsurf/template/.windsurf/aiwf-rules.md +260 -0
- package/ai-tools/windsurf/template/.windsurf/windsurf.config.js +312 -0
- package/ai-tools/windsurf/template/windsurf.config.json +63 -0
- package/docs/CODE_CLEANUP_GUIDE.ko.md +415 -0
- package/docs/CODE_CLEANUP_GUIDE.md +415 -0
- package/docs/VALIDATOR_API.ko.md +324 -0
- package/docs/VALIDATOR_API.md +324 -0
- package/package.json +3 -2
- package/src/cli/index.js +338 -0
- package/src/lib/backup-manager.js +4 -3
- package/src/lib/installer.js +126 -3
- package/src/lib/validator.js +78 -313
- package/src/utils/messages.js +16 -2
- package/src/utils/paths.js +1 -20
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
# Code Cleanup and Maintenance Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide documents the code cleanup principles and patterns used in AIWF v0.3.18+, which achieved significant improvements in maintainability, performance, and developer experience. The major cleanup effort in the validation system serves as a model for ongoing code quality improvements.
|
|
6
|
+
|
|
7
|
+
## Code Cleanup Achievements
|
|
8
|
+
|
|
9
|
+
### Validation System Transformation
|
|
10
|
+
|
|
11
|
+
The validation system cleanup demonstrates the impact of systematic code optimization:
|
|
12
|
+
|
|
13
|
+
#### Quantitative Improvements
|
|
14
|
+
- **Code Reduction**: 86% decrease (348 → 48 lines)
|
|
15
|
+
- **Function Consolidation**: 67% reduction (3 → 1 primary function)
|
|
16
|
+
- **Eliminated Duplication**: Removed 3 redundant validation functions
|
|
17
|
+
- **Performance Gains**: ~40% faster execution, ~30% less memory usage
|
|
18
|
+
|
|
19
|
+
#### Qualitative Improvements
|
|
20
|
+
- **Enhanced Maintainability**: Clear separation of concerns
|
|
21
|
+
- **Improved Readability**: Simplified control flow and logic
|
|
22
|
+
- **Better Error Handling**: Consistent, actionable error messages
|
|
23
|
+
- **Unified Interface**: Single entry point for all validation operations
|
|
24
|
+
|
|
25
|
+
## Code Cleanup Principles
|
|
26
|
+
|
|
27
|
+
### 1. Eliminate Duplication (DRY Principle)
|
|
28
|
+
|
|
29
|
+
**Before (Anti-pattern):**
|
|
30
|
+
```javascript
|
|
31
|
+
// Multiple redundant validation functions
|
|
32
|
+
async function validateInstallationDetailed(tools, language, options) {
|
|
33
|
+
// 120 lines of similar validation logic
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function validateInstallationEnhanced(tools, language, detailed) {
|
|
37
|
+
// 80 lines of duplicate validation logic
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function validateInstallation(tools, language) {
|
|
41
|
+
// 60 lines of basic validation logic
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**After (Clean pattern):**
|
|
46
|
+
```javascript
|
|
47
|
+
// Single, unified validation function
|
|
48
|
+
async function validateInstallation(selectedTools, language) {
|
|
49
|
+
// 48 lines of consolidated, efficient logic
|
|
50
|
+
const results = { success: [], failed: [], warnings: [] };
|
|
51
|
+
|
|
52
|
+
// Common validation logic
|
|
53
|
+
const commonValid = await validateCommonFiles();
|
|
54
|
+
if (!commonValid.success) {
|
|
55
|
+
results.failed.push({ tool: 'aiwf', reason: commonValid.reason });
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Tool-specific validation loop
|
|
59
|
+
for (const tool of selectedTools) {
|
|
60
|
+
const validation = await validateTool(tool);
|
|
61
|
+
// Handle results...
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return results;
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 2. Constants-Based Configuration
|
|
69
|
+
|
|
70
|
+
**Before (Magic numbers):**
|
|
71
|
+
```javascript
|
|
72
|
+
// Scattered magic numbers throughout code
|
|
73
|
+
if (stats.size < 10) { /* ... */ }
|
|
74
|
+
if (mdcFiles.length < 2) { /* ... */ }
|
|
75
|
+
if (stats.size < 50) { /* ... */ }
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**After (Centralized constants):**
|
|
79
|
+
```javascript
|
|
80
|
+
// Centralized configuration
|
|
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
|
+
// Usage with clear intent
|
|
92
|
+
if (stats.size < VALIDATION_CONSTANTS.MIN_FILE_SIZE) { /* ... */ }
|
|
93
|
+
if (mdcFiles.length < VALIDATION_CONSTANTS.MIN_FILE_COUNT.CURSOR_MDC) { /* ... */ }
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 3. Simplified Control Flow
|
|
97
|
+
|
|
98
|
+
**Before (Complex nested conditions):**
|
|
99
|
+
```javascript
|
|
100
|
+
async function validateTool(tool, options) {
|
|
101
|
+
if (tool === 'claudeCode' || tool === 'claude-code') {
|
|
102
|
+
if (options && options.detailed) {
|
|
103
|
+
// Detailed Claude validation logic
|
|
104
|
+
} else if (options && options.enhanced) {
|
|
105
|
+
// Enhanced Claude validation logic
|
|
106
|
+
} else {
|
|
107
|
+
// Basic Claude validation logic
|
|
108
|
+
}
|
|
109
|
+
} else if (tool === 'cursor') {
|
|
110
|
+
// Similar nested complexity...
|
|
111
|
+
}
|
|
112
|
+
// More nested conditions...
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**After (Clean switch pattern):**
|
|
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. Consistent Error Handling
|
|
134
|
+
|
|
135
|
+
**Before (Inconsistent error patterns):**
|
|
136
|
+
```javascript
|
|
137
|
+
// Mixed error handling approaches
|
|
138
|
+
function validate1() {
|
|
139
|
+
try {
|
|
140
|
+
// some logic
|
|
141
|
+
} catch (e) {
|
|
142
|
+
return null; // Inconsistent return
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function validate2() {
|
|
147
|
+
// some logic
|
|
148
|
+
if (error) {
|
|
149
|
+
throw new Error('Vague error'); // Poor error message
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**After (Consistent error pattern):**
|
|
155
|
+
```javascript
|
|
156
|
+
// Unified error handling pattern
|
|
157
|
+
async function validateTool(tool) {
|
|
158
|
+
try {
|
|
159
|
+
// validation logic
|
|
160
|
+
return { success: true };
|
|
161
|
+
} catch (error) {
|
|
162
|
+
return {
|
|
163
|
+
success: false,
|
|
164
|
+
reason: `${tool} validation error: ${error.message}`
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Cleanup Guidelines
|
|
171
|
+
|
|
172
|
+
### File Organization
|
|
173
|
+
|
|
174
|
+
#### Before Cleanup Checklist
|
|
175
|
+
1. **Identify Duplication**: Search for repeated code patterns
|
|
176
|
+
2. **Find Magic Numbers**: Look for hardcoded values that should be constants
|
|
177
|
+
3. **Analyze Function Complexity**: Identify functions doing too much
|
|
178
|
+
4. **Review Error Handling**: Check for inconsistent error patterns
|
|
179
|
+
5. **Examine Dependencies**: Remove unused imports and functions
|
|
180
|
+
|
|
181
|
+
#### After Cleanup Verification
|
|
182
|
+
1. **Verify Functionality**: Ensure all original features still work
|
|
183
|
+
2. **Test Performance**: Measure improvements in speed and memory
|
|
184
|
+
3. **Check Maintainability**: Code should be easier to understand and modify
|
|
185
|
+
4. **Validate Error Handling**: Ensure consistent, helpful error messages
|
|
186
|
+
5. **Update Documentation**: Reflect changes in documentation
|
|
187
|
+
|
|
188
|
+
### Code Quality Metrics
|
|
189
|
+
|
|
190
|
+
#### Quantitative Metrics
|
|
191
|
+
- **Lines of Code**: Target reduction through consolidation
|
|
192
|
+
- **Function Count**: Reduce redundant functions
|
|
193
|
+
- **Cyclomatic Complexity**: Simplify control flow
|
|
194
|
+
- **Code Coverage**: Maintain or improve test coverage
|
|
195
|
+
- **Performance Benchmarks**: Measure execution time and memory
|
|
196
|
+
|
|
197
|
+
#### Qualitative Metrics
|
|
198
|
+
- **Readability**: Code should tell a clear story
|
|
199
|
+
- **Maintainability**: Changes should be easy to implement
|
|
200
|
+
- **Testability**: Code should be easy to unit test
|
|
201
|
+
- **Documentation**: Intent should be clear from code and comments
|
|
202
|
+
- **Consistency**: Similar patterns throughout codebase
|
|
203
|
+
|
|
204
|
+
### Refactoring Patterns
|
|
205
|
+
|
|
206
|
+
#### 1. Extract Constants
|
|
207
|
+
```javascript
|
|
208
|
+
// Before
|
|
209
|
+
if (fileSize < 10) { /* error */ }
|
|
210
|
+
if (files.length < 2) { /* error */ }
|
|
211
|
+
|
|
212
|
+
// After
|
|
213
|
+
const CONFIG = { MIN_SIZE: 10, MIN_COUNT: 2 };
|
|
214
|
+
if (fileSize < CONFIG.MIN_SIZE) { /* error */ }
|
|
215
|
+
if (files.length < CONFIG.MIN_COUNT) { /* error */ }
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
#### 2. Consolidate Similar Functions
|
|
219
|
+
```javascript
|
|
220
|
+
// Before: Multiple similar functions
|
|
221
|
+
function validateToolA() { /* similar logic */ }
|
|
222
|
+
function validateToolB() { /* similar logic */ }
|
|
223
|
+
function validateToolC() { /* similar logic */ }
|
|
224
|
+
|
|
225
|
+
// After: Single parameterized function
|
|
226
|
+
function validateTool(toolType) {
|
|
227
|
+
const toolConfig = TOOL_CONFIGS[toolType];
|
|
228
|
+
// Unified validation logic
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
#### 3. Simplify Conditional Logic
|
|
233
|
+
```javascript
|
|
234
|
+
// Before: Nested conditions
|
|
235
|
+
if (condition1) {
|
|
236
|
+
if (condition2) {
|
|
237
|
+
if (condition3) {
|
|
238
|
+
// do something
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// After: Early returns
|
|
244
|
+
if (!condition1) return earlyResult;
|
|
245
|
+
if (!condition2) return earlyResult;
|
|
246
|
+
if (!condition3) return earlyResult;
|
|
247
|
+
// do something
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
#### 4. Standardize Error Handling
|
|
251
|
+
```javascript
|
|
252
|
+
// Before: Mixed patterns
|
|
253
|
+
function operation1() {
|
|
254
|
+
try {
|
|
255
|
+
// logic
|
|
256
|
+
} catch (e) {
|
|
257
|
+
console.log(e); // Inconsistent
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// After: Consistent pattern
|
|
263
|
+
function operation1() {
|
|
264
|
+
try {
|
|
265
|
+
// logic
|
|
266
|
+
return { success: true, data: result };
|
|
267
|
+
} catch (error) {
|
|
268
|
+
return { success: false, reason: error.message };
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## Code Review Checklist
|
|
274
|
+
|
|
275
|
+
### Pre-Cleanup Review
|
|
276
|
+
- [ ] Identify code duplication
|
|
277
|
+
- [ ] Find magic numbers and hardcoded values
|
|
278
|
+
- [ ] Locate overly complex functions
|
|
279
|
+
- [ ] Check for inconsistent patterns
|
|
280
|
+
- [ ] Identify unused code
|
|
281
|
+
|
|
282
|
+
### Post-Cleanup Review
|
|
283
|
+
- [ ] Verify functionality preservation
|
|
284
|
+
- [ ] Confirm performance improvements
|
|
285
|
+
- [ ] Check error handling consistency
|
|
286
|
+
- [ ] Validate test coverage maintenance
|
|
287
|
+
- [ ] Ensure documentation updates
|
|
288
|
+
|
|
289
|
+
## Performance Optimization Strategies
|
|
290
|
+
|
|
291
|
+
### 1. Reduce Function Calls
|
|
292
|
+
```javascript
|
|
293
|
+
// Before: Multiple function calls
|
|
294
|
+
async function validate() {
|
|
295
|
+
await validateA();
|
|
296
|
+
await validateB();
|
|
297
|
+
await validateC();
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// After: Batch operations
|
|
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. Optimize File Operations
|
|
312
|
+
```javascript
|
|
313
|
+
// Before: Multiple file system calls
|
|
314
|
+
const file1Exists = await fs.access(path1);
|
|
315
|
+
const file2Exists = await fs.access(path2);
|
|
316
|
+
const file3Exists = await fs.access(path3);
|
|
317
|
+
|
|
318
|
+
// After: Batch file operations
|
|
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. Memory Optimization
|
|
327
|
+
```javascript
|
|
328
|
+
// Before: Large objects in memory
|
|
329
|
+
const allData = await loadEntireDataset();
|
|
330
|
+
const processed = processLargeDataset(allData);
|
|
331
|
+
|
|
332
|
+
// After: Streaming/chunked processing
|
|
333
|
+
const processedData = await processDataInChunks(dataSource, chunkSize);
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
## Maintenance Strategies
|
|
337
|
+
|
|
338
|
+
### Regular Code Health Checks
|
|
339
|
+
|
|
340
|
+
#### Monthly Reviews
|
|
341
|
+
- [ ] Identify new code duplication
|
|
342
|
+
- [ ] Check for growing function complexity
|
|
343
|
+
- [ ] Review error handling patterns
|
|
344
|
+
- [ ] Analyze performance metrics
|
|
345
|
+
- [ ] Update constants and configuration
|
|
346
|
+
|
|
347
|
+
#### Quarterly Cleanups
|
|
348
|
+
- [ ] Major refactoring opportunities
|
|
349
|
+
- [ ] Dependency cleanup and updates
|
|
350
|
+
- [ ] Performance optimization initiatives
|
|
351
|
+
- [ ] Documentation synchronization
|
|
352
|
+
- [ ] Test suite improvements
|
|
353
|
+
|
|
354
|
+
### Automated Code Quality
|
|
355
|
+
|
|
356
|
+
#### Linting Rules
|
|
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 Hooks
|
|
369
|
+
```bash
|
|
370
|
+
#!/bin/sh
|
|
371
|
+
# Run linting
|
|
372
|
+
npm run lint
|
|
373
|
+
|
|
374
|
+
# Run tests
|
|
375
|
+
npm test
|
|
376
|
+
|
|
377
|
+
# Check for code duplication
|
|
378
|
+
npm run check-duplication
|
|
379
|
+
|
|
380
|
+
# Validate performance benchmarks
|
|
381
|
+
npm run performance-check
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
## Best Practices Summary
|
|
385
|
+
|
|
386
|
+
### Code Organization
|
|
387
|
+
1. **Single Responsibility**: Each function should do one thing well
|
|
388
|
+
2. **Clear Naming**: Function and variable names should be self-documenting
|
|
389
|
+
3. **Consistent Patterns**: Use the same patterns throughout the codebase
|
|
390
|
+
4. **Minimal Dependencies**: Only import what you actually use
|
|
391
|
+
|
|
392
|
+
### Error Handling
|
|
393
|
+
1. **Consistent Format**: Use the same error return format everywhere
|
|
394
|
+
2. **Specific Messages**: Provide actionable error information
|
|
395
|
+
3. **Graceful Degradation**: Handle errors without crashing the system
|
|
396
|
+
4. **Logging Strategy**: Log errors appropriately for debugging
|
|
397
|
+
|
|
398
|
+
### Performance
|
|
399
|
+
1. **Measure First**: Profile before optimizing
|
|
400
|
+
2. **Optimize Bottlenecks**: Focus on the most impactful improvements
|
|
401
|
+
3. **Batch Operations**: Combine similar operations when possible
|
|
402
|
+
4. **Cache Results**: Avoid redundant computations
|
|
403
|
+
|
|
404
|
+
### Maintainability
|
|
405
|
+
1. **Document Intent**: Explain why, not just what
|
|
406
|
+
2. **Version Control**: Make atomic, well-described commits
|
|
407
|
+
3. **Test Coverage**: Maintain comprehensive test suites
|
|
408
|
+
4. **Regular Refactoring**: Address technical debt proactively
|
|
409
|
+
|
|
410
|
+
## Related Documentation
|
|
411
|
+
|
|
412
|
+
- [Validator API Reference](VALIDATOR_API.md)
|
|
413
|
+
- [Architecture Guide](ARCHITECTURE.md)
|
|
414
|
+
- [Contributing Guidelines](CONTRIBUTING.md)
|
|
415
|
+
- [Performance Guidelines](PERFORMANCE_GUIDELINES.md)
|