faf-cli 3.2.5 → 3.2.6

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 (203) hide show
  1. package/dist/big-orange/bigo-push.js +1 -1
  2. package/dist/big-orange/bigo-push.js.map +1 -1
  3. package/dist/big-orange/compare.js +21 -14
  4. package/dist/big-orange/compare.js.map +1 -1
  5. package/dist/big-orange/faf-generator.d.ts +2 -2
  6. package/dist/big-orange/faf-generator.d.ts.map +1 -1
  7. package/dist/big-orange/faf-generator.js +2 -2
  8. package/dist/big-orange/faf-generator.js.map +1 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +21 -0
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/ai-analyze.js +8 -10
  13. package/dist/commands/ai-analyze.js.map +1 -1
  14. package/dist/commands/ai-enhance.d.ts +1 -1
  15. package/dist/commands/ai-enhance.d.ts.map +1 -1
  16. package/dist/commands/ai-enhance.js +4 -4
  17. package/dist/commands/ai-enhance.js.map +1 -1
  18. package/dist/commands/audit.js.map +1 -1
  19. package/dist/commands/auto.d.ts.map +1 -1
  20. package/dist/commands/auto.js +51 -4
  21. package/dist/commands/auto.js.map +1 -1
  22. package/dist/commands/bi-sync.d.ts.map +1 -1
  23. package/dist/commands/bi-sync.js +0 -1
  24. package/dist/commands/bi-sync.js.map +1 -1
  25. package/dist/commands/chat.d.ts.map +1 -1
  26. package/dist/commands/chat.js +1 -1
  27. package/dist/commands/chat.js.map +1 -1
  28. package/dist/commands/check.js +1 -1
  29. package/dist/commands/check.js.map +1 -1
  30. package/dist/commands/convert.js +2 -2
  31. package/dist/commands/convert.js.map +1 -1
  32. package/dist/commands/doctor.js +9 -5
  33. package/dist/commands/doctor.js.map +1 -1
  34. package/dist/commands/drift.js +28 -21
  35. package/dist/commands/drift.js.map +1 -1
  36. package/dist/commands/edit-helper.d.ts +1 -1
  37. package/dist/commands/edit-helper.d.ts.map +1 -1
  38. package/dist/commands/edit-helper.js.map +1 -1
  39. package/dist/commands/edit.d.ts.map +1 -1
  40. package/dist/commands/edit.js +1 -1
  41. package/dist/commands/edit.js.map +1 -1
  42. package/dist/commands/enhance-real.d.ts.map +1 -1
  43. package/dist/commands/enhance-real.js +234 -129
  44. package/dist/commands/enhance-real.js.map +1 -1
  45. package/dist/commands/faf-auth.js.map +1 -1
  46. package/dist/commands/faf-dna.js.map +1 -1
  47. package/dist/commands/faf-log.js.map +1 -1
  48. package/dist/commands/faf-recover.js +27 -26
  49. package/dist/commands/faf-recover.js.map +1 -1
  50. package/dist/commands/fam.js +15 -12
  51. package/dist/commands/fam.js.map +1 -1
  52. package/dist/commands/formats.d.ts.map +1 -1
  53. package/dist/commands/formats.js +2 -0
  54. package/dist/commands/formats.js.map +1 -1
  55. package/dist/commands/git.d.ts.map +1 -1
  56. package/dist/commands/git.js +16 -8
  57. package/dist/commands/git.js.map +1 -1
  58. package/dist/commands/human.d.ts.map +1 -1
  59. package/dist/commands/human.js +2 -3
  60. package/dist/commands/human.js.map +1 -1
  61. package/dist/commands/index.d.ts.map +1 -1
  62. package/dist/commands/index.js +8 -6
  63. package/dist/commands/index.js.map +1 -1
  64. package/dist/commands/init.d.ts.map +1 -1
  65. package/dist/commands/init.js +18 -41
  66. package/dist/commands/init.js.map +1 -1
  67. package/dist/commands/migrate.js +2 -2
  68. package/dist/commands/migrate.js.map +1 -1
  69. package/dist/commands/quick.js +31 -16
  70. package/dist/commands/quick.js.map +1 -1
  71. package/dist/commands/readme.js +27 -14
  72. package/dist/commands/readme.js.map +1 -1
  73. package/dist/commands/rename.d.ts.map +1 -1
  74. package/dist/commands/rename.js +4 -3
  75. package/dist/commands/rename.js.map +1 -1
  76. package/dist/commands/score-v3.js +32 -21
  77. package/dist/commands/score-v3.js.map +1 -1
  78. package/dist/commands/search.js +4 -4
  79. package/dist/commands/search.js.map +1 -1
  80. package/dist/commands/share.js +2 -1
  81. package/dist/commands/share.js.map +1 -1
  82. package/dist/commands/show.js.map +1 -1
  83. package/dist/commands/status.d.ts.map +1 -1
  84. package/dist/commands/status.js +2 -2
  85. package/dist/commands/status.js.map +1 -1
  86. package/dist/commands/sync.d.ts.map +1 -1
  87. package/dist/commands/sync.js +21 -12
  88. package/dist/commands/sync.js.map +1 -1
  89. package/dist/commands/todo.js +1 -1
  90. package/dist/commands/todo.js.map +1 -1
  91. package/dist/commands/trust.d.ts.map +1 -1
  92. package/dist/commands/trust.js +2 -5
  93. package/dist/commands/trust.js.map +1 -1
  94. package/dist/commands/tsa.js.map +1 -1
  95. package/dist/commands/validate.js.map +1 -1
  96. package/dist/commands/verify.js +2 -2
  97. package/dist/commands/verify.js.map +1 -1
  98. package/dist/commands/version.js.map +1 -1
  99. package/dist/commands/vibe.d.ts +1 -1
  100. package/dist/commands/vibe.d.ts.map +1 -1
  101. package/dist/commands/vibe.js +2 -2
  102. package/dist/commands/vibe.js.map +1 -1
  103. package/dist/commands/yolo.d.ts +12 -0
  104. package/dist/commands/yolo.d.ts.map +1 -0
  105. package/dist/commands/yolo.js +206 -0
  106. package/dist/commands/yolo.js.map +1 -0
  107. package/dist/compiler/faf-compiler.js +75 -38
  108. package/dist/compiler/faf-compiler.js.map +1 -1
  109. package/dist/converters/faf-converters.d.ts.map +1 -1
  110. package/dist/converters/faf-converters.js +22 -11
  111. package/dist/converters/faf-converters.js.map +1 -1
  112. package/dist/engines/art-ansi-renderer.js +3 -7
  113. package/dist/engines/art-ansi-renderer.js.map +1 -1
  114. package/dist/engines/dependency-tsa.d.ts.map +1 -1
  115. package/dist/engines/dependency-tsa.js +8 -4
  116. package/dist/engines/dependency-tsa.js.map +1 -1
  117. package/dist/engines/fab-formats-processor.d.ts.map +1 -1
  118. package/dist/engines/fab-formats-processor.js +87 -49
  119. package/dist/engines/fab-formats-processor.js.map +1 -1
  120. package/dist/engines/faf-dna.d.ts +1 -1
  121. package/dist/engines/faf-dna.d.ts.map +1 -1
  122. package/dist/engines/faf-dna.js +20 -27
  123. package/dist/engines/faf-dna.js.map +1 -1
  124. package/dist/engines/relentless-context-extractor.d.ts.map +1 -1
  125. package/dist/engines/relentless-context-extractor.js +42 -31
  126. package/dist/engines/relentless-context-extractor.js.map +1 -1
  127. package/dist/family/registry.d.ts.map +1 -1
  128. package/dist/family/registry.js +8 -6
  129. package/dist/family/registry.js.map +1 -1
  130. package/dist/fix-once/colors.d.ts.map +1 -1
  131. package/dist/fix-once/colors.js +23 -11
  132. package/dist/fix-once/colors.js.map +1 -1
  133. package/dist/fix-once/commander.js +1 -1
  134. package/dist/fix-once/commander.js.map +1 -1
  135. package/dist/generators/faf-generator-championship.d.ts.map +1 -1
  136. package/dist/generators/faf-generator-championship.js +145 -59
  137. package/dist/generators/faf-generator-championship.js.map +1 -1
  138. package/dist/github/github-extractor.d.ts.map +1 -1
  139. package/dist/github/github-extractor.js +55 -28
  140. package/dist/github/github-extractor.js.map +1 -1
  141. package/dist/github/repo-selector.js +24 -14
  142. package/dist/github/repo-selector.js.map +1 -1
  143. package/dist/output/experience-manager.js +6 -3
  144. package/dist/output/experience-manager.js.map +1 -1
  145. package/dist/taf/stats.js +21 -13
  146. package/dist/taf/stats.js.map +1 -1
  147. package/dist/telemetry/analytics.js +1 -1
  148. package/dist/telemetry/analytics.js.map +1 -1
  149. package/dist/utils/balance-visualizer.d.ts.map +1 -1
  150. package/dist/utils/balance-visualizer.js +3 -10
  151. package/dist/utils/balance-visualizer.js.map +1 -1
  152. package/dist/utils/championship-core.js +14 -7
  153. package/dist/utils/championship-core.js.map +1 -1
  154. package/dist/utils/color-utils.d.ts.map +1 -1
  155. package/dist/utils/color-utils.js +1 -0
  156. package/dist/utils/color-utils.js.map +1 -1
  157. package/dist/utils/email-opt-in.js +5 -3
  158. package/dist/utils/email-opt-in.js.map +1 -1
  159. package/dist/utils/fab-formats-engine.d.ts.map +1 -1
  160. package/dist/utils/fab-formats-engine.js +105 -52
  161. package/dist/utils/fab-formats-engine.js.map +1 -1
  162. package/dist/utils/file-utils.js +1 -1
  163. package/dist/utils/file-utils.js.map +1 -1
  164. package/dist/utils/markdown-to-context.js +24 -13
  165. package/dist/utils/markdown-to-context.js.map +1 -1
  166. package/dist/utils/native-cli-parser.d.ts +2 -2
  167. package/dist/utils/native-cli-parser.d.ts.map +1 -1
  168. package/dist/utils/native-cli-parser.js +14 -10
  169. package/dist/utils/native-cli-parser.js.map +1 -1
  170. package/dist/utils/native-file-finder.js +1 -1
  171. package/dist/utils/native-file-finder.js.map +1 -1
  172. package/dist/utils/platform-detector.d.ts.map +1 -1
  173. package/dist/utils/platform-detector.js +3 -1
  174. package/dist/utils/platform-detector.js.map +1 -1
  175. package/dist/utils/technical-credit.js +2 -2
  176. package/dist/utils/technical-credit.js.map +1 -1
  177. package/dist/utils/trust-cache.d.ts.map +1 -1
  178. package/dist/utils/trust-cache.js +1 -2
  179. package/dist/utils/trust-cache.js.map +1 -1
  180. package/dist/utils/turbo-cat-knowledge.d.ts +17 -4
  181. package/dist/utils/turbo-cat-knowledge.d.ts.map +1 -1
  182. package/dist/utils/turbo-cat-knowledge.js +560 -4
  183. package/dist/utils/turbo-cat-knowledge.js.map +1 -1
  184. package/dist/utils/turbo-cat-pyramid.d.ts +14 -4
  185. package/dist/utils/turbo-cat-pyramid.d.ts.map +1 -1
  186. package/dist/utils/turbo-cat-pyramid.js +113 -21
  187. package/dist/utils/turbo-cat-pyramid.js.map +1 -1
  188. package/dist/utils/turbo-cat.d.ts.map +1 -1
  189. package/dist/utils/turbo-cat.js +50 -25
  190. package/dist/utils/turbo-cat.js.map +1 -1
  191. package/dist/utils/universal-fuzzy-detector.js +10 -5
  192. package/dist/utils/universal-fuzzy-detector.js.map +1 -1
  193. package/dist/utils/update-checker.d.ts.map +1 -1
  194. package/dist/utils/update-checker.js +15 -9
  195. package/dist/utils/update-checker.js.map +1 -1
  196. package/dist/utils/vibe-sync.d.ts.map +1 -1
  197. package/dist/utils/vibe-sync.js +12 -7
  198. package/dist/utils/vibe-sync.js.map +1 -1
  199. package/dist/utils/yaml-generator.d.ts +12 -12
  200. package/dist/utils/yaml-generator.d.ts.map +1 -1
  201. package/dist/utils/yaml-generator.js +58 -31
  202. package/dist/utils/yaml-generator.js.map +1 -1
  203. package/package.json +1 -1
@@ -88,7 +88,13 @@ async function realEnhanceFaf(file, options = {}) {
88
88
  iteration++;
89
89
  console.log(colors_1.chalk.cyan(`\n🔄 Enhancement Round ${iteration}...`));
90
90
  // Analyze project for REAL improvements
91
- const improvements = await analyzeProjectForRealImprovements(projectPath, fafData, currentScore);
91
+ let improvements = {};
92
+ try {
93
+ improvements = await analyzeProjectForRealImprovements(projectPath, fafData, currentScore);
94
+ }
95
+ catch {
96
+ console.log(colors_1.chalk.yellow(' Could not analyze project automatically'));
97
+ }
92
98
  if (options.verbose) {
93
99
  console.log(colors_1.chalk.gray(`Found ${Object.keys(improvements).length} automatic improvements`));
94
100
  if (Object.keys(improvements).length > 0 && Object.keys(improvements).length <= 3) {
@@ -124,36 +130,42 @@ async function realEnhanceFaf(file, options = {}) {
124
130
  displayImprovements(improvements);
125
131
  continue;
126
132
  }
127
- // Apply REAL improvements
128
- fafData = applyRealEnhancements(fafData, improvements);
129
- // CRITICAL: Preserve essential fields that should never be removed
130
- if (!fafData.project)
131
- fafData.project = {};
132
- if (!fafData.project.generated && fafData.generated) {
133
- fafData.project.generated = fafData.generated;
134
- }
135
- // Add meta tracking for enhancement
136
- fafData.meta = fafData.meta || {};
137
- fafData.meta.last_enhanced = new Date().toISOString();
138
- fafData.meta.enhanced_by = 'faf-real-enhance';
139
- // Save enhanced file
140
- const enhancedYaml = (0, yaml_1.stringify)(fafData);
141
- await fs_1.promises.writeFile(fafPath, enhancedYaml);
142
- // Calculate new score
143
- const newScore = await compiler.compile(fafPath);
144
- const improvement = newScore.score - currentScore.score;
145
- if (improvement > 0) {
146
- console.log(colors_1.chalk.green(`✅ Improvement: +${improvement}% (${currentScore.score}% → ${newScore.score}%)`));
147
- // Show what was actually added
148
- if (options.verbose) {
149
- console.log(colors_1.chalk.cyan("📝 Changes Made:"));
150
- displayImprovements(improvements);
133
+ try {
134
+ // Apply REAL improvements
135
+ fafData = applyRealEnhancements(fafData, improvements);
136
+ // CRITICAL: Preserve essential fields that should never be removed
137
+ if (!fafData.project) {
138
+ fafData.project = {};
139
+ }
140
+ if (!fafData.project.generated && fafData.generated) {
141
+ fafData.project.generated = fafData.generated;
151
142
  }
143
+ // Add meta tracking for enhancement
144
+ fafData.meta = fafData.meta || {};
145
+ fafData.meta.last_enhanced = new Date().toISOString();
146
+ fafData.meta.enhanced_by = 'faf-real-enhance';
147
+ // Save enhanced file
148
+ const enhancedYaml = (0, yaml_1.stringify)(fafData);
149
+ await fs_1.promises.writeFile(fafPath, enhancedYaml);
150
+ // Calculate new score
151
+ const newScore = await compiler.compile(fafPath);
152
+ const improvement = newScore.score - currentScore.score;
153
+ if (improvement > 0) {
154
+ console.log(colors_1.chalk.green(`✅ Improvement: +${improvement}% (${currentScore.score}% → ${newScore.score}%)`));
155
+ // Show what was actually added
156
+ if (options.verbose) {
157
+ console.log(colors_1.chalk.cyan("📝 Changes Made:"));
158
+ displayImprovements(improvements);
159
+ }
160
+ }
161
+ currentScore = newScore;
162
+ }
163
+ catch {
164
+ console.log(colors_1.chalk.yellow("\n⚠️ Enhancement iteration failed, continuing..."));
152
165
  }
153
- currentScore = newScore;
154
166
  }
155
167
  // Final results
156
- console.log(colors_1.chalk.cyan("\n" + "=".repeat(60)));
168
+ console.log(colors_1.chalk.cyan(`\n${"=".repeat(60)}`));
157
169
  if (currentScore.score >= targetScore) {
158
170
  console.log(colors_1.chalk.green(`🎯 TARGET ACHIEVED! Score: ${currentScore.score}%`));
159
171
  }
@@ -213,7 +225,7 @@ function displayMissingSlots(score) {
213
225
  * Ask human for missing critical data via inquirer
214
226
  * RELENTLESS 1-6 questionnaire for the 6 W's of Human Context
215
227
  */
216
- async function askHumanForMissingData(currentFaf, score) {
228
+ async function askHumanForMissingData(currentFaf, _score) {
217
229
  // Check if we're in an interactive terminal
218
230
  if (!process.stdin.isTTY) {
219
231
  console.log(colors_1.chalk.yellow('\n⚠️ Interactive questions require a terminal (TTY)'));
@@ -256,10 +268,11 @@ async function askHumanForMissingData(currentFaf, score) {
256
268
  default: getSmartDefault('who', currentFaf),
257
269
  transformer: (input) => colors_1.chalk.green(input),
258
270
  validate: (input) => {
259
- if (input.trim().length < 3)
271
+ if (input.trim().length < 3) {
260
272
  return 'Please specify your target users';
273
+ }
261
274
  if (genericAnswers.who.includes(input.toLowerCase())) {
262
- return 'Please be more specific than "' + input + '"';
275
+ return `Please be more specific than "${input}"`;
263
276
  }
264
277
  return true;
265
278
  }
@@ -274,8 +287,9 @@ async function askHumanForMissingData(currentFaf, score) {
274
287
  default: getSmartDefault('what', currentFaf),
275
288
  transformer: (input) => colors_1.chalk.green(input),
276
289
  validate: (input) => {
277
- if (input.trim().length < 10)
290
+ if (input.trim().length < 10) {
278
291
  return 'Please describe the specific problem';
292
+ }
279
293
  if (genericAnswers.what.includes(input.toLowerCase())) {
280
294
  return 'Please be more specific about the problem';
281
295
  }
@@ -292,8 +306,9 @@ async function askHumanForMissingData(currentFaf, score) {
292
306
  default: getSmartDefault('why', currentFaf),
293
307
  transformer: (input) => colors_1.chalk.green(input),
294
308
  validate: (input) => {
295
- if (input.trim().length < 10)
309
+ if (input.trim().length < 10) {
296
310
  return 'Please explain why this matters';
311
+ }
297
312
  if (genericAnswers.why.includes(input.toLowerCase())) {
298
313
  return 'Please be more specific about the value/impact';
299
314
  }
@@ -310,8 +325,9 @@ async function askHumanForMissingData(currentFaf, score) {
310
325
  default: getSmartDefault('where', currentFaf),
311
326
  transformer: (input) => colors_1.chalk.green(input),
312
327
  validate: (input) => {
313
- if (input.trim().length < 3)
328
+ if (input.trim().length < 3) {
314
329
  return 'Please specify the deployment context';
330
+ }
315
331
  return true;
316
332
  }
317
333
  });
@@ -325,8 +341,9 @@ async function askHumanForMissingData(currentFaf, score) {
325
341
  default: getSmartDefault('when', currentFaf),
326
342
  transformer: (input) => colors_1.chalk.green(input),
327
343
  validate: (input) => {
328
- if (input.trim().length < 3)
344
+ if (input.trim().length < 3) {
329
345
  return 'Please specify the timeline';
346
+ }
330
347
  return true;
331
348
  }
332
349
  });
@@ -340,8 +357,9 @@ async function askHumanForMissingData(currentFaf, score) {
340
357
  default: getSmartDefault('how', currentFaf),
341
358
  transformer: (input) => colors_1.chalk.green(input),
342
359
  validate: (input) => {
343
- if (input.trim().length < 5)
360
+ if (input.trim().length < 5) {
344
361
  return 'Please describe your approach';
362
+ }
345
363
  if (genericAnswers.how.includes(input.toLowerCase())) {
346
364
  return 'Please be more specific about your methodology';
347
365
  }
@@ -417,7 +435,7 @@ const genericAnswers = {
417
435
  // Smart defaults based on project type
418
436
  function getSmartDefault(field, currentFaf) {
419
437
  const projectType = currentFaf.project?.type || '';
420
- const projectName = currentFaf.project?.name || '';
438
+ const _projectName = currentFaf.project?.name || '';
421
439
  const language = currentFaf.project?.main_language || '';
422
440
  const defaults = {
423
441
  who: {
@@ -464,14 +482,15 @@ function getSmartDefault(field, currentFaf) {
464
482
  }
465
483
  };
466
484
  const typeDefaults = defaults[field];
467
- if (!typeDefaults)
485
+ if (!typeDefaults) {
468
486
  return '';
487
+ }
469
488
  return typeDefaults[projectType] || typeDefaults['default'] || '';
470
489
  }
471
490
  /**
472
491
  * Analyze project for REAL improvements based on actual files
473
492
  */
474
- async function analyzeProjectForRealImprovements(projectPath, currentFaf, currentScore) {
493
+ async function analyzeProjectForRealImprovements(projectPath, currentFaf, _currentScore) {
475
494
  const improvements = {};
476
495
  // Priority order: Fill critical slots first
477
496
  // 1. PROJECT SLOTS (name, goal, language) - Most critical for AI
@@ -529,7 +548,7 @@ async function analyzeProjectForRealImprovements(projectPath, currentFaf, curren
529
548
  }
530
549
  }
531
550
  }
532
- catch (e) {
551
+ catch {
533
552
  // No package.json, try other files
534
553
  }
535
554
  // 2. Use FAB-Formats to INTELLIGENTLY discover project structure
@@ -623,7 +642,7 @@ async function analyzeProjectForRealImprovements(projectPath, currentFaf, curren
623
642
  improvements.what = readmeInfo.what;
624
643
  }
625
644
  }
626
- catch (e) {
645
+ catch {
627
646
  // No README or can't parse
628
647
  }
629
648
  // 4. Add REAL human context from git
@@ -653,7 +672,7 @@ async function analyzeProjectForRealImprovements(projectPath, currentFaf, curren
653
672
  }
654
673
  }
655
674
  }
656
- catch (e) {
675
+ catch {
657
676
  // No git or git commands failed
658
677
  }
659
678
  // 5. Add REAL technical details
@@ -665,45 +684,59 @@ async function analyzeProjectForRealImprovements(projectPath, currentFaf, curren
665
684
  }
666
685
  // 6. Analyze file patterns for more intelligent stack detection
667
686
  if (!currentFaf.stack?.hosting) {
668
- if (files.includes('vercel.json'))
687
+ if (files.includes('vercel.json')) {
669
688
  improvements.hosting = 'Vercel';
670
- else if (files.includes('netlify.toml'))
689
+ }
690
+ else if (files.includes('netlify.toml')) {
671
691
  improvements.hosting = 'Netlify';
672
- else if (files.includes('app.yaml'))
692
+ }
693
+ else if (files.includes('app.yaml')) {
673
694
  improvements.hosting = 'Google App Engine';
674
- else if (files.includes('Procfile'))
695
+ }
696
+ else if (files.includes('Procfile')) {
675
697
  improvements.hosting = 'Heroku';
676
- else if (files.includes('.elasticbeanstalk'))
698
+ }
699
+ else if (files.includes('.elasticbeanstalk')) {
677
700
  improvements.hosting = 'AWS Elastic Beanstalk';
701
+ }
678
702
  }
679
703
  // 7. Intelligent project type detection from structure
680
704
  if (!currentFaf.project?.type) {
681
705
  const hasPublicDir = files.includes('public');
682
- const hasSrcDir = files.includes('src');
706
+ const _hasSrcDir = files.includes('src');
683
707
  const hasApiDir = files.includes('api');
684
708
  const hasServerFile = files.some(f => f.includes('server'));
685
709
  const hasIndexHtml = files.includes('index.html');
686
- if (hasApiDir && hasPublicDir)
710
+ if (hasApiDir && hasPublicDir) {
687
711
  improvements.projectType = 'fullstack';
688
- else if (hasServerFile && !hasIndexHtml)
712
+ }
713
+ else if (hasServerFile && !hasIndexHtml) {
689
714
  improvements.projectType = 'backend-api';
690
- else if (hasPublicDir && hasIndexHtml)
715
+ }
716
+ else if (hasPublicDir && hasIndexHtml) {
691
717
  improvements.projectType = 'frontend';
692
- else if (files.includes('cli.js') || files.includes('cli.ts'))
718
+ }
719
+ else if (files.includes('cli.js') || files.includes('cli.ts')) {
693
720
  improvements.projectType = 'cli-tool';
721
+ }
694
722
  }
695
723
  // 8. Extract runtime from files
696
724
  if (!currentFaf.stack?.runtime) {
697
- if (files.includes('package.json'))
725
+ if (files.includes('package.json')) {
698
726
  improvements.runtime = 'Node.js';
699
- else if (files.includes('requirements.txt'))
727
+ }
728
+ else if (files.includes('requirements.txt')) {
700
729
  improvements.runtime = 'Python';
701
- else if (files.includes('Gemfile'))
730
+ }
731
+ else if (files.includes('Gemfile')) {
702
732
  improvements.runtime = 'Ruby';
703
- else if (files.includes('go.mod'))
733
+ }
734
+ else if (files.includes('go.mod')) {
704
735
  improvements.runtime = 'Go';
705
- else if (files.includes('Cargo.toml'))
736
+ }
737
+ else if (files.includes('Cargo.toml')) {
706
738
  improvements.runtime = 'Rust';
739
+ }
707
740
  }
708
741
  // 9. Fill API type if we have a backend
709
742
  if (!currentFaf.stack?.api_type && (currentFaf.stack?.backend || improvements.backend)) {
@@ -713,16 +746,20 @@ async function analyzeProjectForRealImprovements(projectPath, currentFaf, curren
713
746
  const pkgContent = await fs_1.promises.readFile(pkgPath, 'utf-8');
714
747
  const pkg = JSON.parse(pkgContent);
715
748
  const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
716
- if (allDeps['graphql'])
749
+ if (allDeps['graphql']) {
717
750
  improvements.api_type = 'GraphQL';
718
- else if (allDeps['@trpc/server'])
751
+ }
752
+ else if (allDeps['@trpc/server']) {
719
753
  improvements.api_type = 'tRPC';
720
- else if (allDeps['socket.io'])
754
+ }
755
+ else if (allDeps['socket.io']) {
721
756
  improvements.api_type = 'WebSocket';
722
- else
757
+ }
758
+ else {
723
759
  improvements.api_type = 'REST';
760
+ }
724
761
  }
725
- catch (e) {
762
+ catch {
726
763
  improvements.api_type = 'REST'; // Default to REST if can't read package.json
727
764
  }
728
765
  }
@@ -827,48 +864,68 @@ function applyRealEnhancements(fafData, improvements) {
827
864
  function detectFrameworks(deps) {
828
865
  const frameworks = [];
829
866
  // Frontend frameworks
830
- if (deps['react'])
867
+ if (deps['react']) {
831
868
  frameworks.push('React');
832
- if (deps['vue'])
869
+ }
870
+ if (deps['vue']) {
833
871
  frameworks.push('Vue');
834
- if (deps['@angular/core'])
872
+ }
873
+ if (deps['@angular/core']) {
835
874
  frameworks.push('Angular');
836
- if (deps['svelte'])
875
+ }
876
+ if (deps['svelte']) {
837
877
  frameworks.push('Svelte');
838
- if (deps['solid-js'])
878
+ }
879
+ if (deps['solid-js']) {
839
880
  frameworks.push('SolidJS');
840
- if (deps['preact'])
881
+ }
882
+ if (deps['preact']) {
841
883
  frameworks.push('Preact');
842
- if (deps['@ember/core'])
884
+ }
885
+ if (deps['@ember/core']) {
843
886
  frameworks.push('Ember');
887
+ }
844
888
  // Meta-frameworks
845
- if (deps['next'])
889
+ if (deps['next']) {
846
890
  frameworks.push('Next.js');
847
- if (deps['nuxt'])
891
+ }
892
+ if (deps['nuxt']) {
848
893
  frameworks.push('Nuxt');
849
- if (deps['gatsby'])
894
+ }
895
+ if (deps['gatsby']) {
850
896
  frameworks.push('Gatsby');
851
- if (deps['@remix-run/react'])
897
+ }
898
+ if (deps['@remix-run/react']) {
852
899
  frameworks.push('Remix');
853
- if (deps['astro'])
900
+ }
901
+ if (deps['astro']) {
854
902
  frameworks.push('Astro');
855
- if (deps['@sveltekit/adapter-auto'])
903
+ }
904
+ if (deps['@sveltekit/adapter-auto']) {
856
905
  frameworks.push('SvelteKit');
906
+ }
857
907
  // Backend frameworks
858
- if (deps['express'])
908
+ if (deps['express']) {
859
909
  frameworks.push('Express');
860
- if (deps['fastify'])
910
+ }
911
+ if (deps['fastify']) {
861
912
  frameworks.push('Fastify');
862
- if (deps['@nestjs/core'])
913
+ }
914
+ if (deps['@nestjs/core']) {
863
915
  frameworks.push('NestJS');
864
- if (deps['koa'])
916
+ }
917
+ if (deps['koa']) {
865
918
  frameworks.push('Koa');
866
- if (deps['@hapi/hapi'])
919
+ }
920
+ if (deps['@hapi/hapi']) {
867
921
  frameworks.push('Hapi');
868
- if (deps['@feathersjs/feathers'])
922
+ }
923
+ if (deps['@feathersjs/feathers']) {
869
924
  frameworks.push('Feathers');
870
- if (deps['@adonisjs/core'])
925
+ }
926
+ if (deps['@adonisjs/core']) {
871
927
  frameworks.push('AdonisJS');
928
+ }
872
929
  return frameworks;
873
930
  }
874
931
  function isFrontendFramework(framework) {
@@ -881,55 +938,73 @@ function isBackendFramework(framework) {
881
938
  return backend.includes(framework);
882
939
  }
883
940
  function detectBuildTool(deps) {
884
- if (deps['vite'])
941
+ if (deps['vite']) {
885
942
  return 'Vite';
886
- if (deps['webpack'])
943
+ }
944
+ if (deps['webpack']) {
887
945
  return 'Webpack';
888
- if (deps['@parcel/core'] || deps['parcel'])
946
+ }
947
+ if (deps['@parcel/core'] || deps['parcel']) {
889
948
  return 'Parcel';
890
- if (deps['esbuild'])
949
+ }
950
+ if (deps['esbuild']) {
891
951
  return 'ESBuild';
892
- if (deps['rollup'])
952
+ }
953
+ if (deps['rollup']) {
893
954
  return 'Rollup';
894
- if (deps['@swc/core'])
955
+ }
956
+ if (deps['@swc/core']) {
895
957
  return 'SWC';
896
- if (deps['turbopack'])
958
+ }
959
+ if (deps['turbopack']) {
897
960
  return 'Turbopack';
898
- if (deps['snowpack'])
961
+ }
962
+ if (deps['snowpack']) {
899
963
  return 'Snowpack';
900
- if (deps['@rspack/core'])
964
+ }
965
+ if (deps['@rspack/core']) {
901
966
  return 'Rspack';
967
+ }
902
968
  return 'npm';
903
969
  }
904
970
  function detectProjectType(files) {
905
971
  if (files.includes('package.json')) {
906
- if (files.includes('tsconfig.json'))
972
+ if (files.includes('tsconfig.json')) {
907
973
  return 'typescript-node';
974
+ }
908
975
  return 'javascript-node';
909
976
  }
910
977
  if (files.includes('requirements.txt') || files.includes('setup.py')) {
911
978
  return 'python';
912
979
  }
913
- if (files.includes('Cargo.toml'))
980
+ if (files.includes('Cargo.toml')) {
914
981
  return 'rust';
915
- if (files.includes('go.mod'))
982
+ }
983
+ if (files.includes('go.mod')) {
916
984
  return 'go';
985
+ }
917
986
  return 'unknown';
918
987
  }
919
988
  function detectLanguage(files) {
920
989
  const extensions = files.map(f => path.extname(f));
921
- if (extensions.includes('.ts') || extensions.includes('.tsx'))
990
+ if (extensions.includes('.ts') || extensions.includes('.tsx')) {
922
991
  return 'TypeScript';
923
- if (extensions.includes('.js') || extensions.includes('.jsx'))
992
+ }
993
+ if (extensions.includes('.js') || extensions.includes('.jsx')) {
924
994
  return 'JavaScript';
925
- if (extensions.includes('.py'))
995
+ }
996
+ if (extensions.includes('.py')) {
926
997
  return 'Python';
927
- if (extensions.includes('.rs'))
998
+ }
999
+ if (extensions.includes('.rs')) {
928
1000
  return 'Rust';
929
- if (extensions.includes('.go'))
1001
+ }
1002
+ if (extensions.includes('.go')) {
930
1003
  return 'Go';
931
- if (extensions.includes('.java'))
1004
+ }
1005
+ if (extensions.includes('.java')) {
932
1006
  return 'Java';
1007
+ }
933
1008
  return 'Unknown';
934
1009
  }
935
1010
  function isImportantFile(filename) {
@@ -968,38 +1043,53 @@ function extractFromReadme(content) {
968
1043
  */
969
1044
  function detectTestingFramework(deps) {
970
1045
  // Unit testing
971
- if (deps['vitest'])
1046
+ if (deps['vitest']) {
972
1047
  return 'Vitest';
973
- if (deps['jest'])
1048
+ }
1049
+ if (deps['jest']) {
974
1050
  return 'Jest';
975
- if (deps['mocha'])
1051
+ }
1052
+ if (deps['mocha']) {
976
1053
  return 'Mocha';
977
- if (deps['jasmine'])
1054
+ }
1055
+ if (deps['jasmine']) {
978
1056
  return 'Jasmine';
979
- if (deps['ava'])
1057
+ }
1058
+ if (deps['ava']) {
980
1059
  return 'AVA';
981
- if (deps['tape'])
1060
+ }
1061
+ if (deps['tape']) {
982
1062
  return 'Tape';
983
- if (deps['uvu'])
1063
+ }
1064
+ if (deps['uvu']) {
984
1065
  return 'uvu';
1066
+ }
985
1067
  // E2E testing
986
- if (deps['@playwright/test'] || deps['playwright'])
1068
+ if (deps['@playwright/test'] || deps['playwright']) {
987
1069
  return 'Playwright';
988
- if (deps['cypress'])
1070
+ }
1071
+ if (deps['cypress']) {
989
1072
  return 'Cypress';
990
- if (deps['puppeteer'])
1073
+ }
1074
+ if (deps['puppeteer']) {
991
1075
  return 'Puppeteer';
992
- if (deps['webdriverio'])
1076
+ }
1077
+ if (deps['webdriverio']) {
993
1078
  return 'WebdriverIO';
994
- if (deps['nightwatch'])
1079
+ }
1080
+ if (deps['nightwatch']) {
995
1081
  return 'Nightwatch';
1082
+ }
996
1083
  // Testing utilities
997
- if (deps['@testing-library/react'])
1084
+ if (deps['@testing-library/react']) {
998
1085
  return 'React Testing Library';
999
- if (deps['@testing-library/vue'])
1086
+ }
1087
+ if (deps['@testing-library/vue']) {
1000
1088
  return 'Vue Testing Library';
1001
- if (deps['enzyme'])
1089
+ }
1090
+ if (deps['enzyme']) {
1002
1091
  return 'Enzyme';
1092
+ }
1003
1093
  return null;
1004
1094
  }
1005
1095
  /**
@@ -1007,37 +1097,52 @@ function detectTestingFramework(deps) {
1007
1097
  */
1008
1098
  function detectDatabase(deps) {
1009
1099
  // ORMs that support multiple databases
1010
- if (deps['@prisma/client'])
1100
+ if (deps['@prisma/client']) {
1011
1101
  return 'Prisma';
1012
- if (deps['typeorm'])
1102
+ }
1103
+ if (deps['typeorm']) {
1013
1104
  return 'TypeORM';
1014
- if (deps['sequelize'])
1105
+ }
1106
+ if (deps['sequelize']) {
1015
1107
  return 'Sequelize';
1016
- if (deps['drizzle-orm'])
1108
+ }
1109
+ if (deps['drizzle-orm']) {
1017
1110
  return 'Drizzle';
1018
- if (deps['kysely'])
1111
+ }
1112
+ if (deps['kysely']) {
1019
1113
  return 'Kysely';
1114
+ }
1020
1115
  // Specific databases
1021
- if (deps['pg'] || deps['postgres'])
1116
+ if (deps['pg'] || deps['postgres']) {
1022
1117
  return 'PostgreSQL';
1023
- if (deps['mysql'] || deps['mysql2'])
1118
+ }
1119
+ if (deps['mysql'] || deps['mysql2']) {
1024
1120
  return 'MySQL';
1025
- if (deps['mongodb'] || deps['mongoose'])
1121
+ }
1122
+ if (deps['mongodb'] || deps['mongoose']) {
1026
1123
  return 'MongoDB';
1027
- if (deps['sqlite3'] || deps['better-sqlite3'])
1124
+ }
1125
+ if (deps['sqlite3'] || deps['better-sqlite3']) {
1028
1126
  return 'SQLite';
1029
- if (deps['redis'] || deps['ioredis'])
1127
+ }
1128
+ if (deps['redis'] || deps['ioredis']) {
1030
1129
  return 'Redis';
1031
- if (deps['@supabase/supabase-js'])
1130
+ }
1131
+ if (deps['@supabase/supabase-js']) {
1032
1132
  return 'Supabase';
1033
- if (deps['firebase'])
1133
+ }
1134
+ if (deps['firebase']) {
1034
1135
  return 'Firebase';
1035
- if (deps['@planetscale/database'])
1136
+ }
1137
+ if (deps['@planetscale/database']) {
1036
1138
  return 'PlanetScale';
1037
- if (deps['@neondatabase/serverless'])
1139
+ }
1140
+ if (deps['@neondatabase/serverless']) {
1038
1141
  return 'Neon';
1039
- if (deps['@vercel/postgres'])
1142
+ }
1143
+ if (deps['@vercel/postgres']) {
1040
1144
  return 'Vercel Postgres';
1145
+ }
1041
1146
  return null;
1042
1147
  }
1043
1148
  function displayImprovements(improvements) {