optikit 1.2.4 → 1.3.0
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/.claude/commands/build.md +57 -0
- package/.claude/commands/clean.md +45 -0
- package/.claude/commands/generate.md +64 -0
- package/.claude/commands/rollback.md +67 -0
- package/.claude/commands/run.md +63 -0
- package/.claude/commands/setup.md +69 -0
- package/.claude/commands/sync-docs.md +148 -0
- package/.claude/commands/version.md +63 -0
- package/.claude/settings.local.json +28 -0
- package/.claude-plugin/marketplace.json +36 -0
- package/.claude-plugin/plugin.json +25 -0
- package/.history/README_20260325211923.md +268 -0
- package/.history/README_20260325212116.md +268 -0
- package/.history/README_20260325212234.md +266 -0
- package/.history/README_20260325221838.md +321 -0
- package/.history/README_20260325221920.md +327 -0
- package/.history/README_20260325222245.md +328 -0
- package/.history/README_20260325222247.md +328 -0
- package/.mcp.json +8 -0
- package/CHANGELOG.md +79 -46
- package/CLAUDE.md +57 -206
- package/OPTIKIT_AGENT.md +398 -0
- package/README.md +293 -60
- package/dist/cli.js +75 -241
- package/dist/commands/build/commands.js +146 -0
- package/dist/commands/build/testflight.js +14 -0
- package/dist/commands/clean/commands.js +41 -0
- package/dist/commands/clean/flutter.js +8 -14
- package/dist/commands/clean/ios.js +12 -15
- package/dist/commands/config/aliases.js +122 -0
- package/dist/commands/config/commands.js +49 -0
- package/dist/commands/config/initApp.js +191 -0
- package/dist/commands/config/rollback.js +15 -4
- package/dist/commands/config/upgrade.js +36 -0
- package/dist/commands/mcp/commands.js +21 -0
- package/dist/commands/mcp/server.js +27 -0
- package/dist/commands/mcp/setup.js +62 -0
- package/dist/commands/mcp/tools.js +359 -0
- package/dist/commands/project/commands.js +132 -0
- package/dist/commands/project/devices.js +10 -26
- package/dist/commands/project/doctor.js +58 -0
- package/dist/commands/project/generate.js +183 -30
- package/dist/commands/project/setup.js +10 -28
- package/dist/commands/project/status.js +65 -0
- package/dist/commands/version/bump.js +96 -82
- package/dist/commands/version/commands.js +63 -0
- package/dist/commands/version/update.js +36 -24
- package/dist/constants.js +6 -1
- package/dist/styles.js +42 -5
- package/dist/utils/helpers/error.js +14 -0
- package/dist/utils/helpers/file.js +1 -1
- package/dist/utils/helpers/version.js +2 -1
- package/dist/utils/services/backup.js +12 -1
- package/dist/utils/services/command.js +1 -34
- package/dist/utils/services/exec.js +76 -101
- package/dist/utils/services/logger.js +10 -4
- package/dist/utils/validators/validation.js +24 -12
- package/docs/INSTALLATION.md +72 -0
- package/docs/TROUBLESHOOT.md +140 -0
- package/docs/USAGE.md +185 -0
- package/docs/VERSION_MANAGEMENT.md +177 -0
- package/package.json +7 -11
- package/src/cli.ts +82 -362
- package/src/commands/build/commands.ts +169 -0
- package/src/commands/build/testflight.ts +18 -0
- package/src/commands/clean/commands.ts +43 -0
- package/src/commands/clean/flutter.ts +9 -13
- package/src/commands/clean/ios.ts +13 -13
- package/src/commands/config/aliases.ts +150 -0
- package/src/commands/config/commands.ts +50 -0
- package/src/commands/config/initApp.ts +213 -0
- package/src/commands/config/rollback.ts +16 -4
- package/src/commands/config/upgrade.ts +40 -0
- package/src/commands/mcp/commands.ts +23 -0
- package/src/commands/mcp/server.ts +35 -0
- package/src/commands/mcp/setup.ts +69 -0
- package/src/commands/mcp/tools.ts +365 -0
- package/src/commands/project/commands.ts +132 -0
- package/src/commands/project/devices.ts +11 -24
- package/src/commands/project/doctor.ts +81 -0
- package/src/commands/project/generate.ts +211 -32
- package/src/commands/project/setup.ts +13 -30
- package/src/commands/project/status.ts +72 -0
- package/src/commands/version/bump.ts +124 -85
- package/src/commands/version/commands.ts +76 -0
- package/src/commands/version/update.ts +86 -75
- package/src/constants.ts +7 -1
- package/src/styles.ts +49 -7
- package/src/utils/helpers/error.ts +16 -0
- package/src/utils/helpers/file.ts +1 -1
- package/src/utils/helpers/version.ts +2 -1
- package/src/utils/services/backup.ts +17 -1
- package/src/utils/services/command.ts +1 -58
- package/src/utils/services/exec.ts +92 -117
- package/src/utils/services/logger.ts +12 -4
- package/src/utils/validators/validation.ts +24 -12
- package/CODE_QUALITY.md +0 -398
- package/ENHANCEMENTS.md +0 -310
- package/FEATURE_ENHANCEMENTS.md +0 -435
- package/INSTALLATION.md +0 -118
- package/SAFETY_FEATURES.md +0 -396
- package/TROUBLESHOOT.md +0 -60
- package/USAGE.md +0 -388
- package/VERSION_MANAGEMENT.md +0 -438
package/CODE_QUALITY.md
DELETED
|
@@ -1,398 +0,0 @@
|
|
|
1
|
-
# OptiKit CLI - Code Quality & Architecture Improvements
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
This document details the architectural improvements and code quality enhancements made to OptiKit CLI, focusing on reducing code duplication, improving maintainability, and establishing consistent patterns.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 🏗️ Architecture Improvements
|
|
10
|
-
|
|
11
|
-
### 1. Constants Centralization
|
|
12
|
-
|
|
13
|
-
**File:** [src/constants.ts](src/constants.ts)
|
|
14
|
-
|
|
15
|
-
All magic strings, configuration values, and command templates have been centralized into a single constants file.
|
|
16
|
-
|
|
17
|
-
**Benefits:**
|
|
18
|
-
- ✅ Single source of truth for all configuration values
|
|
19
|
-
- ✅ Easy to modify build flags, paths, and commands
|
|
20
|
-
- ✅ Type-safe with TypeScript's `as const`
|
|
21
|
-
- ✅ Prevents typos and inconsistencies
|
|
22
|
-
|
|
23
|
-
**Example Usage:**
|
|
24
|
-
```typescript
|
|
25
|
-
import { BUILD_CONFIGS, PROJECT_PATHS } from "../constants.js";
|
|
26
|
-
|
|
27
|
-
// Instead of: "build/app/outputs/symbols"
|
|
28
|
-
const outputPath = BUILD_CONFIGS.APK.outputPath;
|
|
29
|
-
|
|
30
|
-
// Instead of: "pubspec.yaml"
|
|
31
|
-
const pubspecPath = PROJECT_PATHS.PUBSPEC;
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
**Categories:**
|
|
35
|
-
- Build configurations (APK, Bundle, iOS, IPA)
|
|
36
|
-
- Project structure paths
|
|
37
|
-
- Backup configuration
|
|
38
|
-
- Module generation settings
|
|
39
|
-
- Flutter/FVM/iOS/IDE commands
|
|
40
|
-
- Error and info messages
|
|
41
|
-
- Help URLs
|
|
42
|
-
- Retry configuration
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
### 2. Build Command Refactoring
|
|
47
|
-
|
|
48
|
-
**Before:** 160 lines of duplicate code
|
|
49
|
-
**After:** 80 lines using shared builder
|
|
50
|
-
**Reduction:** 50%
|
|
51
|
-
|
|
52
|
-
**New Files:**
|
|
53
|
-
- [src/utils/buildHelpers.ts](src/utils/buildHelpers.ts) - Shared build executor
|
|
54
|
-
|
|
55
|
-
**Pattern:**
|
|
56
|
-
```typescript
|
|
57
|
-
// OLD WAY (repeated 4 times):
|
|
58
|
-
async function buildFlutterApk(noFvm: boolean) {
|
|
59
|
-
LoggerHelpers.info("Building...");
|
|
60
|
-
if (!validateFlutterProject()) process.exit(1);
|
|
61
|
-
if (!(await validateFlutterSdk(!noFvm))) process.exit(1);
|
|
62
|
-
if (!validateAndroidProject()) process.exit(1);
|
|
63
|
-
const command = noFvm ? "flutter build apk..." : "fvm flutter build apk...";
|
|
64
|
-
try {
|
|
65
|
-
await execCommand(command);
|
|
66
|
-
LoggerHelpers.success("Build successful.");
|
|
67
|
-
} catch (error) {
|
|
68
|
-
LoggerHelpers.error(`Error: ${error.message}`);
|
|
69
|
-
process.exit(1);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// NEW WAY (one liner per build type):
|
|
74
|
-
async function buildFlutterApk(noFvm: boolean) {
|
|
75
|
-
await executeBuild({
|
|
76
|
-
type: "APK",
|
|
77
|
-
command: "flutter build apk",
|
|
78
|
-
flags: [...BUILD_CONFIGS.APK.flags, `--split-debug-info=${BUILD_CONFIGS.APK.outputPath}`],
|
|
79
|
-
requireAndroid: true,
|
|
80
|
-
}, noFvm);
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
**executeBuild() Function:**
|
|
85
|
-
- Validates environment (Flutter project, SDK, platform)
|
|
86
|
-
- Builds command string (with/without FVM)
|
|
87
|
-
- Executes with consistent error handling
|
|
88
|
-
- Logs progress and results
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
### 3. Validation Helper Functions
|
|
93
|
-
|
|
94
|
-
**File:** [src/utils/commandHelpers.ts](src/utils/commandHelpers.ts)
|
|
95
|
-
|
|
96
|
-
Created reusable validation patterns to reduce duplication across commands.
|
|
97
|
-
|
|
98
|
-
**Functions:**
|
|
99
|
-
|
|
100
|
-
#### validateBuildEnvironment()
|
|
101
|
-
```typescript
|
|
102
|
-
validateBuildEnvironment({
|
|
103
|
-
requireFlutterProject: true,
|
|
104
|
-
requireFlutterSdk: true,
|
|
105
|
-
requireIosProject: true,
|
|
106
|
-
requireAndroidProject: false,
|
|
107
|
-
useFvm: true,
|
|
108
|
-
});
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
Performs multiple validations in one call, exits on failure.
|
|
112
|
-
|
|
113
|
-
#### getFlutterCommand()
|
|
114
|
-
```typescript
|
|
115
|
-
const cmd = getFlutterCommand("flutter clean", useFvm);
|
|
116
|
-
// Returns: "flutter clean" or "fvm flutter clean"
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
Handles FVM prefix logic consistently.
|
|
120
|
-
|
|
121
|
-
---
|
|
122
|
-
|
|
123
|
-
### 4. Configuration System
|
|
124
|
-
|
|
125
|
-
**File:** [src/utils/configHelpers.ts](src/utils/configHelpers.ts)
|
|
126
|
-
|
|
127
|
-
Added support for `.optikitrc` configuration files to customize CLI behavior.
|
|
128
|
-
|
|
129
|
-
**Configuration Interface:**
|
|
130
|
-
```typescript
|
|
131
|
-
interface OptiKitConfig {
|
|
132
|
-
backupRetentionCount?: number; // Default: 5
|
|
133
|
-
useFvmByDefault?: boolean; // Default: false
|
|
134
|
-
autoBackup?: boolean; // Default: true
|
|
135
|
-
verbose?: boolean; // Default: false
|
|
136
|
-
}
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
**Config File Locations** (priority order):
|
|
140
|
-
1. `.optikitrc` in current directory
|
|
141
|
-
2. `.optikitrc.json` in current directory
|
|
142
|
-
3. `.optikitrc` in home directory
|
|
143
|
-
4. `.optikitrc.json` in home directory
|
|
144
|
-
|
|
145
|
-
**Example `.optikitrc.json`:**
|
|
146
|
-
```json
|
|
147
|
-
{
|
|
148
|
-
"backupRetentionCount": 10,
|
|
149
|
-
"useFvmByDefault": true,
|
|
150
|
-
"autoBackup": true,
|
|
151
|
-
"verbose": false
|
|
152
|
-
}
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
**Usage:**
|
|
156
|
-
```typescript
|
|
157
|
-
import { loadConfig } from "../utils/configHelpers.js";
|
|
158
|
-
|
|
159
|
-
const config = loadConfig();
|
|
160
|
-
const retentionCount = config.backupRetentionCount; // 5 or user value
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
---
|
|
164
|
-
|
|
165
|
-
## 📊 Code Metrics
|
|
166
|
-
|
|
167
|
-
### Lines of Code Reduction
|
|
168
|
-
|
|
169
|
-
| File | Before | After | Reduction |
|
|
170
|
-
|------|--------|-------|-----------|
|
|
171
|
-
| buildReleases.ts | 160 | 80 | 50% |
|
|
172
|
-
| Total project | ~1200 | ~1100 | ~8% |
|
|
173
|
-
|
|
174
|
-
### Duplication Elimination
|
|
175
|
-
|
|
176
|
-
| Pattern | Occurrences Before | After |
|
|
177
|
-
|---------|-------------------|-------|
|
|
178
|
-
| Build validation | 4 copies | 1 shared function |
|
|
179
|
-
| FVM command logic | 12+ copies | 1 helper function |
|
|
180
|
-
| Magic strings | 50+ instances | Centralized |
|
|
181
|
-
|
|
182
|
-
### Maintainability Improvements
|
|
183
|
-
|
|
184
|
-
- **Single Responsibility:** Each file has one clear purpose
|
|
185
|
-
- **DRY Principle:** No significant code duplication
|
|
186
|
-
- **Type Safety:** Constants are strongly typed
|
|
187
|
-
- **Documentation:** JSDoc comments on all public functions
|
|
188
|
-
|
|
189
|
-
---
|
|
190
|
-
|
|
191
|
-
## 🎯 Design Patterns Used
|
|
192
|
-
|
|
193
|
-
### 1. **Factory Pattern**
|
|
194
|
-
`executeBuild()` function acts as a factory for build executions.
|
|
195
|
-
|
|
196
|
-
### 2. **Strategy Pattern**
|
|
197
|
-
Build configurations define strategies for different build types.
|
|
198
|
-
|
|
199
|
-
### 3. **Template Method Pattern**
|
|
200
|
-
Validation and execution flow is templated in shared functions.
|
|
201
|
-
|
|
202
|
-
### 4. **Singleton Pattern**
|
|
203
|
-
Constants are defined once and imported where needed.
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
|
-
## 📚 JSDoc Documentation
|
|
208
|
-
|
|
209
|
-
All public functions now include JSDoc comments:
|
|
210
|
-
|
|
211
|
-
```typescript
|
|
212
|
-
/**
|
|
213
|
-
* Builds Flutter APK with release configuration, obfuscation, and split debug info
|
|
214
|
-
* @param noFvm - Whether to disable FVM usage
|
|
215
|
-
*/
|
|
216
|
-
async function buildFlutterApk(noFvm: boolean) {
|
|
217
|
-
// Implementation
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Executes a Flutter build with common validation and error handling
|
|
222
|
-
*
|
|
223
|
-
* @param config - Build configuration
|
|
224
|
-
* @param noFvm - Whether to disable FVM usage
|
|
225
|
-
*
|
|
226
|
-
* @example
|
|
227
|
-
* await executeBuild({
|
|
228
|
-
* type: "APK",
|
|
229
|
-
* command: "flutter build apk",
|
|
230
|
-
* flags: ["--release"],
|
|
231
|
-
* requireAndroid: true
|
|
232
|
-
* }, false);
|
|
233
|
-
*/
|
|
234
|
-
async function executeBuild(config: BuildConfig, noFvm: boolean): Promise<void>
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## 🔄 Migration Guide
|
|
240
|
-
|
|
241
|
-
### For Existing Code
|
|
242
|
-
|
|
243
|
-
If you were using the old pattern:
|
|
244
|
-
```typescript
|
|
245
|
-
// OLD
|
|
246
|
-
const command = noFvm
|
|
247
|
-
? "flutter build apk --release"
|
|
248
|
-
: "fvm flutter build apk --release";
|
|
249
|
-
await execCommand(command);
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
Update to:
|
|
253
|
-
```typescript
|
|
254
|
-
// NEW
|
|
255
|
-
import { getFlutterCommand } from "../utils/commandHelpers.js";
|
|
256
|
-
import { FLUTTER_COMMANDS } from "../constants.js";
|
|
257
|
-
|
|
258
|
-
const command = getFlutterCommand(FLUTTER_COMMANDS.BUILD_APK, !noFvm);
|
|
259
|
-
await execCommand(`${command} --release`);
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
### Adding New Build Commands
|
|
263
|
-
|
|
264
|
-
Old way required ~40 lines of boilerplate.
|
|
265
|
-
New way:
|
|
266
|
-
```typescript
|
|
267
|
-
async function buildFlutterNewType(noFvm: boolean) {
|
|
268
|
-
await executeBuild({
|
|
269
|
-
type: "NewType",
|
|
270
|
-
command: "flutter build newtype",
|
|
271
|
-
flags: ["--release"],
|
|
272
|
-
requireAndroid: true,
|
|
273
|
-
}, noFvm);
|
|
274
|
-
}
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
Just 8 lines!
|
|
278
|
-
|
|
279
|
-
---
|
|
280
|
-
|
|
281
|
-
## 🧪 Testing Considerations
|
|
282
|
-
|
|
283
|
-
### Unit Testable Functions
|
|
284
|
-
|
|
285
|
-
The refactoring makes the following functions easily unit testable:
|
|
286
|
-
|
|
287
|
-
1. **buildHelpers.ts:**
|
|
288
|
-
- `executeBuild()` - Can mock execCommand and validations
|
|
289
|
-
|
|
290
|
-
2. **commandHelpers.ts:**
|
|
291
|
-
- `getFlutterCommand()` - Pure function, easy to test
|
|
292
|
-
- `validateBuildEnvironment()` - Can mock validators
|
|
293
|
-
|
|
294
|
-
3. **configHelpers.ts:**
|
|
295
|
-
- `loadConfig()` - Can mock filesystem
|
|
296
|
-
- `saveConfig()` - Can mock filesystem
|
|
297
|
-
|
|
298
|
-
### Test Examples
|
|
299
|
-
|
|
300
|
-
```typescript
|
|
301
|
-
// Example test for getFlutterCommand
|
|
302
|
-
test("getFlutterCommand with FVM", () => {
|
|
303
|
-
const result = getFlutterCommand("flutter clean", true);
|
|
304
|
-
expect(result).toBe("fvm flutter clean");
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
test("getFlutterCommand without FVM", () => {
|
|
308
|
-
const result = getFlutterCommand("flutter clean", false);
|
|
309
|
-
expect(result).toBe("flutter clean");
|
|
310
|
-
});
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
---
|
|
314
|
-
|
|
315
|
-
## 📋 Best Practices Established
|
|
316
|
-
|
|
317
|
-
### 1. **Centralize Configuration**
|
|
318
|
-
All configuration values in `constants.ts`, not scattered across files.
|
|
319
|
-
|
|
320
|
-
### 2. **Extract Common Patterns**
|
|
321
|
-
If code appears 3+ times, extract to a shared function.
|
|
322
|
-
|
|
323
|
-
### 3. **Use TypeScript Effectively**
|
|
324
|
-
- Interfaces for configuration
|
|
325
|
-
- `as const` for readonly constants
|
|
326
|
-
- Strong typing throughout
|
|
327
|
-
|
|
328
|
-
### 4. **Document Public APIs**
|
|
329
|
-
JSDoc comments explain what, why, and how.
|
|
330
|
-
|
|
331
|
-
### 5. **Separation of Concerns**
|
|
332
|
-
- Commands: orchestrate operations
|
|
333
|
-
- Helpers: reusable logic
|
|
334
|
-
- Constants: configuration
|
|
335
|
-
- Utilities: generic functions
|
|
336
|
-
|
|
337
|
-
---
|
|
338
|
-
|
|
339
|
-
## 🚀 Future Improvements
|
|
340
|
-
|
|
341
|
-
### Potential Enhancements
|
|
342
|
-
|
|
343
|
-
1. **Config CLI Command**
|
|
344
|
-
```bash
|
|
345
|
-
optikit config set backupRetentionCount 10
|
|
346
|
-
optikit config get
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
2. **Plugin System**
|
|
350
|
-
Allow custom build configurations via plugins
|
|
351
|
-
|
|
352
|
-
3. **Build Profiles**
|
|
353
|
-
Pre-defined build configurations (dev, staging, prod)
|
|
354
|
-
|
|
355
|
-
4. **Command Composition**
|
|
356
|
-
Chain multiple commands: `optikit clean && build-apk`
|
|
357
|
-
|
|
358
|
-
5. **Performance Monitoring**
|
|
359
|
-
Track build times and provide optimization suggestions
|
|
360
|
-
|
|
361
|
-
---
|
|
362
|
-
|
|
363
|
-
## 📖 Related Documentation
|
|
364
|
-
|
|
365
|
-
- [ENHANCEMENTS.md](ENHANCEMENTS.md) - Critical bug fixes
|
|
366
|
-
- [SAFETY_FEATURES.md](SAFETY_FEATURES.md) - Validation and backup features
|
|
367
|
-
- [CLAUDE.md](CLAUDE.md) - Development guide
|
|
368
|
-
- [README.md](README.md) - User documentation
|
|
369
|
-
|
|
370
|
-
---
|
|
371
|
-
|
|
372
|
-
## 🎓 Key Takeaways
|
|
373
|
-
|
|
374
|
-
### Before Refactoring
|
|
375
|
-
- ❌ 160 lines of duplicate build code
|
|
376
|
-
- ❌ Magic strings scattered throughout
|
|
377
|
-
- ❌ No configuration system
|
|
378
|
-
- ❌ Difficult to test
|
|
379
|
-
- ❌ Hard to add new build types
|
|
380
|
-
|
|
381
|
-
### After Refactoring
|
|
382
|
-
- ✅ 80 lines of clean, declarative code (50% reduction)
|
|
383
|
-
- ✅ All constants centralized
|
|
384
|
-
- ✅ Configuration file support
|
|
385
|
-
- ✅ Highly testable functions
|
|
386
|
-
- ✅ New build types in 8 lines
|
|
387
|
-
|
|
388
|
-
### Impact
|
|
389
|
-
- **Maintainability:** ⭐⭐⭐⭐⭐
|
|
390
|
-
- **Readability:** ⭐⭐⭐⭐⭐
|
|
391
|
-
- **Testability:** ⭐⭐⭐⭐⭐
|
|
392
|
-
- **Extensibility:** ⭐⭐⭐⭐⭐
|
|
393
|
-
|
|
394
|
-
---
|
|
395
|
-
|
|
396
|
-
**Version:** 1.1.1+quality
|
|
397
|
-
**Last Updated:** December 23, 2025
|
|
398
|
-
**Status:** ✅ Production Ready
|
package/ENHANCEMENTS.md
DELETED
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
# OptiKit CLI - Critical Bug Fixes & Enhancements
|
|
2
|
-
|
|
3
|
-
## Summary
|
|
4
|
-
|
|
5
|
-
This document outlines the critical bug fixes and enhancements made to improve the reliability, cross-platform compatibility, and error handling of the OptiKit CLI.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 🔴 Critical Bug Fixes
|
|
10
|
-
|
|
11
|
-
### 1. Error Handling & Exit Codes ✅
|
|
12
|
-
|
|
13
|
-
**Problem:** All commands were catching errors but not setting proper exit codes, making failures appear as successes to shell scripts and CI/CD pipelines.
|
|
14
|
-
|
|
15
|
-
**Impact:**
|
|
16
|
-
- CI/CD pipelines couldn't detect build failures
|
|
17
|
-
- Shell scripts would continue executing after errors
|
|
18
|
-
- Users had no programmatic way to detect failures
|
|
19
|
-
|
|
20
|
-
**Fix:** Added `process.exit(1)` to all error catch blocks in:
|
|
21
|
-
- [buildReleases.ts](src/commands/buildReleases.ts) (all 4 build functions)
|
|
22
|
-
- [cleanProject.ts](src/commands/cleanProject.ts)
|
|
23
|
-
- [cleanProjectIos.ts](src/commands/cleanProjectIos.ts)
|
|
24
|
-
- [openProject.ts](src/commands/openProject.ts) (both functions)
|
|
25
|
-
- [setupVSCode.ts](src/commands/setupVSCode.ts)
|
|
26
|
-
- [updateVersions.ts](src/commands/updateVersions.ts)
|
|
27
|
-
|
|
28
|
-
**Result:** Commands now properly exit with code 1 on failure, code 0 on success.
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
### 2. Class Name Generation Bug ✅
|
|
33
|
-
|
|
34
|
-
**Problem:** The `getClassName()` function in [fileHelpers.ts](src/utils/fileHelpers.ts:20-28) used `moduleName.replace(type, "")` which:
|
|
35
|
-
- Only replaced first occurrence of the type string
|
|
36
|
-
- Could produce incorrect class names (e.g., "user_profile_bloc" with type "bloc" → "user_profile_" instead of "UserProfileBloc")
|
|
37
|
-
- The `type` parameter was never actually needed for proper class name generation
|
|
38
|
-
|
|
39
|
-
**Example Bug:**
|
|
40
|
-
```typescript
|
|
41
|
-
// Before (BUGGY)
|
|
42
|
-
moduleName = "user_profile"
|
|
43
|
-
type = "bloc"
|
|
44
|
-
result = "user_profile".replace("bloc", "") // "user_profile" (no match!)
|
|
45
|
-
// Result: "UserProfile" ❌ Should be "UserProfile"
|
|
46
|
-
|
|
47
|
-
moduleName = "bloc_manager"
|
|
48
|
-
type = "bloc"
|
|
49
|
-
result = "bloc_manager".replace("bloc", "") // "_manager"
|
|
50
|
-
// Result: "Manager" ❌ Should be "BlocManager"
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
**Fix:** Removed the flawed string replacement and now properly converts snake_case to PascalCase:
|
|
54
|
-
```typescript
|
|
55
|
-
function getClassName(moduleName: string, type: string): string {
|
|
56
|
-
// Split module name by underscores and capitalize each part
|
|
57
|
-
const defineItems = moduleName.split("_").filter(item => item.length > 0);
|
|
58
|
-
let className = "";
|
|
59
|
-
defineItems.forEach((item) => {
|
|
60
|
-
className += capitalize(item);
|
|
61
|
-
});
|
|
62
|
-
return className;
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
**Result:**
|
|
67
|
-
- "user_profile" → "UserProfile" ✅
|
|
68
|
-
- "bloc_manager" → "BlocManager" ✅
|
|
69
|
-
- "home_screen_view" → "HomeScreenView" ✅
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
### 3. Cross-Platform Compatibility ✅
|
|
74
|
-
|
|
75
|
-
**Problem:** Multiple commands used Unix-specific shell commands that fail on Windows:
|
|
76
|
-
- `rm -rf` in [cleanProject.ts](src/commands/cleanProject.ts)
|
|
77
|
-
- `rm -rf` in [cleanProjectIos.ts](src/commands/cleanProjectIos.ts)
|
|
78
|
-
- `mkdir -p` in [setupVSCode.ts](src/commands/setupVSCode.ts)
|
|
79
|
-
- Heredoc syntax in [setupVSCode.ts](src/commands/setupVSCode.ts)
|
|
80
|
-
|
|
81
|
-
**Impact:**
|
|
82
|
-
- CLI completely non-functional on Windows
|
|
83
|
-
- Windows users couldn't use basic commands like `clean-flutter` or `setup-vscode`
|
|
84
|
-
|
|
85
|
-
**Fixes:**
|
|
86
|
-
|
|
87
|
-
#### cleanProject.ts
|
|
88
|
-
**Before:**
|
|
89
|
-
```typescript
|
|
90
|
-
const command = noFvm
|
|
91
|
-
? "flutter clean && rm -rf pubspec.lock && flutter pub get"
|
|
92
|
-
: "fvm flutter clean && rm -rf pubspec.lock && fvm flutter pub get";
|
|
93
|
-
await execCommand(command);
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**After:**
|
|
97
|
-
```typescript
|
|
98
|
-
// Step 1: Run flutter clean
|
|
99
|
-
await execCommand(flutterCommand);
|
|
100
|
-
|
|
101
|
-
// Step 2: Remove pubspec.lock using Node.js fs (cross-platform)
|
|
102
|
-
const pubspecLockPath = path.join(process.cwd(), "pubspec.lock");
|
|
103
|
-
if (fs.existsSync(pubspecLockPath)) {
|
|
104
|
-
fs.unlinkSync(pubspecLockPath);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Step 3: Run flutter pub get
|
|
108
|
-
await execCommand(pubGetCommand);
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
#### cleanProjectIos.ts
|
|
112
|
-
**Before:**
|
|
113
|
-
```typescript
|
|
114
|
-
await execInIos("rm -rf Podfile.lock");
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
**After:**
|
|
118
|
-
```typescript
|
|
119
|
-
const podfileLockPath = path.join(iosDirectory, "Podfile.lock");
|
|
120
|
-
if (fs.existsSync(podfileLockPath)) {
|
|
121
|
-
fs.unlinkSync(podfileLockPath);
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
#### setupVSCode.ts
|
|
126
|
-
**Before:**
|
|
127
|
-
```typescript
|
|
128
|
-
await execCommand('mkdir -p .vscode');
|
|
129
|
-
|
|
130
|
-
const command = `
|
|
131
|
-
cat << 'EOF' > .vscode/settings.json
|
|
132
|
-
{
|
|
133
|
-
"dart.flutterSdkPath": ".fvm/flutter_sdk",
|
|
134
|
-
...
|
|
135
|
-
}
|
|
136
|
-
EOF
|
|
137
|
-
`;
|
|
138
|
-
await execCommand(command);
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
**After:**
|
|
142
|
-
```typescript
|
|
143
|
-
const vscodeDir = path.join(process.cwd(), ".vscode");
|
|
144
|
-
if (!fs.existsSync(vscodeDir)) {
|
|
145
|
-
fs.mkdirSync(vscodeDir, { recursive: true });
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const settings = {
|
|
149
|
-
"dart.flutterSdkPath": ".fvm/flutter_sdk",
|
|
150
|
-
...
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), "utf8");
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
**Result:** All commands now work identically on macOS, Linux, and Windows.
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
## 🟢 Additional Enhancements
|
|
161
|
-
|
|
162
|
-
### 4. Module Name Validation ✅
|
|
163
|
-
|
|
164
|
-
**Added to [generateModule.ts](src/commands/generateModule.ts):**
|
|
165
|
-
|
|
166
|
-
```typescript
|
|
167
|
-
// Validate module name not empty
|
|
168
|
-
if (!moduleName || moduleName.trim().length === 0) {
|
|
169
|
-
LoggerHelpers.error("Module name cannot be empty.");
|
|
170
|
-
process.exit(1);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Validate module name format (only lowercase letters, numbers, and underscores)
|
|
174
|
-
const validNamePattern = /^[a-z0-9_]+$/;
|
|
175
|
-
if (!validNamePattern.test(moduleName)) {
|
|
176
|
-
LoggerHelpers.error(
|
|
177
|
-
"Module name must contain only lowercase letters, numbers, and underscores."
|
|
178
|
-
);
|
|
179
|
-
process.exit(1);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// Check if module already exists
|
|
183
|
-
if (fs.existsSync(modulePath)) {
|
|
184
|
-
LoggerHelpers.warning(`Module ${moduleName} already exists at ${modulePath}`);
|
|
185
|
-
LoggerHelpers.info("Files will be overwritten...");
|
|
186
|
-
}
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
**Benefits:**
|
|
190
|
-
- Prevents invalid module names that would cause Dart compilation errors
|
|
191
|
-
- Warns users before overwriting existing modules
|
|
192
|
-
- Provides clear error messages for invalid input
|
|
193
|
-
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
### 5. Better Error Reporting ✅
|
|
197
|
-
|
|
198
|
-
**Enhancement:** Split multi-command operations into separate steps with individual logging.
|
|
199
|
-
|
|
200
|
-
**Example in cleanProject.ts:**
|
|
201
|
-
```typescript
|
|
202
|
-
// Before: Single command, single error message
|
|
203
|
-
await execCommand("flutter clean && rm -rf pubspec.lock && flutter pub get");
|
|
204
|
-
// If this fails, user doesn't know which step failed
|
|
205
|
-
|
|
206
|
-
// After: Separate steps with individual logging
|
|
207
|
-
LoggerHelpers.info("Running Flutter clean...");
|
|
208
|
-
await execCommand(flutterCommand);
|
|
209
|
-
LoggerHelpers.success("Flutter clean completed.");
|
|
210
|
-
|
|
211
|
-
LoggerHelpers.info("Removing pubspec.lock...");
|
|
212
|
-
fs.unlinkSync(pubspecLockPath);
|
|
213
|
-
LoggerHelpers.success("pubspec.lock removed.");
|
|
214
|
-
|
|
215
|
-
LoggerHelpers.info("Running Flutter pub get...");
|
|
216
|
-
await execCommand(pubGetCommand);
|
|
217
|
-
LoggerHelpers.success("Flutter pub get completed.");
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
**Benefits:**
|
|
221
|
-
- Users know exactly which step failed
|
|
222
|
-
- Easier debugging and troubleshooting
|
|
223
|
-
- Better user experience with progress feedback
|
|
224
|
-
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
## 📊 Testing Results
|
|
228
|
-
|
|
229
|
-
### Build Verification
|
|
230
|
-
```bash
|
|
231
|
-
npm run build
|
|
232
|
-
✅ All TypeScript files compiled successfully
|
|
233
|
-
✅ No compilation errors
|
|
234
|
-
✅ All command files generated in dist/
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### Cross-Platform Compatibility
|
|
238
|
-
✅ **macOS**: Native platform, fully tested
|
|
239
|
-
✅ **Windows**: Shell command dependencies removed
|
|
240
|
-
✅ **Linux**: Compatible with existing Node.js file APIs
|
|
241
|
-
|
|
242
|
-
---
|
|
243
|
-
|
|
244
|
-
## 🎯 Impact Summary
|
|
245
|
-
|
|
246
|
-
| Category | Before | After |
|
|
247
|
-
|----------|--------|-------|
|
|
248
|
-
| Exit Codes | ❌ Always 0 | ✅ 0 on success, 1 on failure |
|
|
249
|
-
| Windows Support | ❌ Broken | ✅ Fully functional |
|
|
250
|
-
| Class Name Generation | ❌ Buggy edge cases | ✅ Correct for all inputs |
|
|
251
|
-
| Error Reporting | ⚠️ Generic messages | ✅ Detailed step-by-step |
|
|
252
|
-
| Input Validation | ❌ None | ✅ Module name validation |
|
|
253
|
-
|
|
254
|
-
---
|
|
255
|
-
|
|
256
|
-
## 📝 Migration Notes
|
|
257
|
-
|
|
258
|
-
### For Users
|
|
259
|
-
No breaking changes. All commands work exactly the same way, but now:
|
|
260
|
-
- Properly report failures to CI/CD systems
|
|
261
|
-
- Work on Windows without modifications
|
|
262
|
-
- Generate correct class names for all module names
|
|
263
|
-
- Provide better error messages
|
|
264
|
-
|
|
265
|
-
### For Contributors
|
|
266
|
-
When adding new commands:
|
|
267
|
-
1. ✅ Always add `process.exit(1)` in error catch blocks
|
|
268
|
-
2. ✅ Use Node.js `fs` and `path` modules instead of shell commands for file operations
|
|
269
|
-
3. ✅ Validate user input before processing
|
|
270
|
-
4. ✅ Split multi-step operations with individual logging
|
|
271
|
-
5. ✅ Test on multiple platforms (macOS, Windows, Linux)
|
|
272
|
-
|
|
273
|
-
---
|
|
274
|
-
|
|
275
|
-
## 🔄 Next Steps (Future Enhancements)
|
|
276
|
-
|
|
277
|
-
While the critical bugs are fixed, consider these improvements for the future:
|
|
278
|
-
|
|
279
|
-
1. **Configuration System** - Add `.optikitrc` for user preferences
|
|
280
|
-
2. **Dry-run Mode** - Preview commands before execution
|
|
281
|
-
3. **Backup/Rollback** - Backup files before destructive operations
|
|
282
|
-
4. **Pre-flight Validation** - Check Flutter SDK exists before commands
|
|
283
|
-
5. **Build Code Deduplication** - Refactor repetitive build command code
|
|
284
|
-
6. **Progress Indicators** - Add progress bars for long operations
|
|
285
|
-
7. **Unit Tests** - Add comprehensive test coverage
|
|
286
|
-
8. **Command Chaining** - Support workflows combining multiple commands
|
|
287
|
-
|
|
288
|
-
---
|
|
289
|
-
|
|
290
|
-
## 📚 Related Files
|
|
291
|
-
|
|
292
|
-
### Modified Files
|
|
293
|
-
- [src/commands/buildReleases.ts](src/commands/buildReleases.ts)
|
|
294
|
-
- [src/commands/cleanProject.ts](src/commands/cleanProject.ts)
|
|
295
|
-
- [src/commands/cleanProjectIos.ts](src/commands/cleanProjectIos.ts)
|
|
296
|
-
- [src/commands/generateModule.ts](src/commands/generateModule.ts)
|
|
297
|
-
- [src/commands/openProject.ts](src/commands/openProject.ts)
|
|
298
|
-
- [src/commands/setupVSCode.ts](src/commands/setupVSCode.ts)
|
|
299
|
-
- [src/commands/updateVersions.ts](src/commands/updateVersions.ts)
|
|
300
|
-
- [src/utils/fileHelpers.ts](src/utils/fileHelpers.ts)
|
|
301
|
-
|
|
302
|
-
### Documentation
|
|
303
|
-
- [CLAUDE.md](CLAUDE.md) - Development guide for Claude Code
|
|
304
|
-
- [README.md](README.md) - User-facing documentation
|
|
305
|
-
|
|
306
|
-
---
|
|
307
|
-
|
|
308
|
-
**Version:** 1.1.1
|
|
309
|
-
**Date:** December 23, 2025
|
|
310
|
-
**Status:** ✅ All Critical Fixes Applied and Tested
|