faf-cli 3.2.5 → 3.2.7
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/dist/big-orange/bigo-push.js +1 -1
- package/dist/big-orange/bigo-push.js.map +1 -1
- package/dist/big-orange/compare.js +21 -14
- package/dist/big-orange/compare.js.map +1 -1
- package/dist/big-orange/faf-generator.d.ts +2 -2
- package/dist/big-orange/faf-generator.d.ts.map +1 -1
- package/dist/big-orange/faf-generator.js +2 -2
- package/dist/big-orange/faf-generator.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/ai-analyze.js +8 -10
- package/dist/commands/ai-analyze.js.map +1 -1
- package/dist/commands/ai-enhance.d.ts +1 -1
- package/dist/commands/ai-enhance.d.ts.map +1 -1
- package/dist/commands/ai-enhance.js +4 -4
- package/dist/commands/ai-enhance.js.map +1 -1
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/auto.d.ts.map +1 -1
- package/dist/commands/auto.js +51 -4
- package/dist/commands/auto.js.map +1 -1
- package/dist/commands/bi-sync.d.ts.map +1 -1
- package/dist/commands/bi-sync.js +0 -1
- package/dist/commands/bi-sync.js.map +1 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +1 -1
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/check.js +1 -1
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/convert.js +2 -2
- package/dist/commands/convert.js.map +1 -1
- package/dist/commands/doctor.js +9 -5
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/drift.js +28 -21
- package/dist/commands/drift.js.map +1 -1
- package/dist/commands/edit-helper.d.ts +1 -1
- package/dist/commands/edit-helper.d.ts.map +1 -1
- package/dist/commands/edit-helper.js.map +1 -1
- package/dist/commands/edit.d.ts.map +1 -1
- package/dist/commands/edit.js +1 -1
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/enhance-real.d.ts.map +1 -1
- package/dist/commands/enhance-real.js +234 -129
- package/dist/commands/enhance-real.js.map +1 -1
- package/dist/commands/faf-auth.js.map +1 -1
- package/dist/commands/faf-dna.js.map +1 -1
- package/dist/commands/faf-log.js.map +1 -1
- package/dist/commands/faf-recover.js +27 -26
- package/dist/commands/faf-recover.js.map +1 -1
- package/dist/commands/fam.js +15 -12
- package/dist/commands/fam.js.map +1 -1
- package/dist/commands/formats.d.ts.map +1 -1
- package/dist/commands/formats.js +2 -0
- package/dist/commands/formats.js.map +1 -1
- package/dist/commands/git.d.ts.map +1 -1
- package/dist/commands/git.js +16 -8
- package/dist/commands/git.js.map +1 -1
- package/dist/commands/human.d.ts.map +1 -1
- package/dist/commands/human.js +2 -3
- package/dist/commands/human.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +8 -6
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +45 -41
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.js +2 -2
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/quick.js +31 -16
- package/dist/commands/quick.js.map +1 -1
- package/dist/commands/readme.js +27 -14
- package/dist/commands/readme.js.map +1 -1
- package/dist/commands/rename.d.ts.map +1 -1
- package/dist/commands/rename.js +4 -3
- package/dist/commands/rename.js.map +1 -1
- package/dist/commands/score-v3.js +32 -21
- package/dist/commands/score-v3.js.map +1 -1
- package/dist/commands/search.js +4 -4
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/share.js +2 -1
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +21 -12
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/todo.js +1 -1
- package/dist/commands/todo.js.map +1 -1
- package/dist/commands/trust.d.ts.map +1 -1
- package/dist/commands/trust.js +2 -5
- package/dist/commands/trust.js.map +1 -1
- package/dist/commands/tsa.js.map +1 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/verify.js +2 -2
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/version.js.map +1 -1
- package/dist/commands/vibe.d.ts +1 -1
- package/dist/commands/vibe.d.ts.map +1 -1
- package/dist/commands/vibe.js +2 -2
- package/dist/commands/vibe.js.map +1 -1
- package/dist/commands/yolo.d.ts +12 -0
- package/dist/commands/yolo.d.ts.map +1 -0
- package/dist/commands/yolo.js +206 -0
- package/dist/commands/yolo.js.map +1 -0
- package/dist/compiler/faf-compiler.js +75 -38
- package/dist/compiler/faf-compiler.js.map +1 -1
- package/dist/converters/faf-converters.d.ts.map +1 -1
- package/dist/converters/faf-converters.js +22 -11
- package/dist/converters/faf-converters.js.map +1 -1
- package/dist/engines/art-ansi-renderer.js +3 -7
- package/dist/engines/art-ansi-renderer.js.map +1 -1
- package/dist/engines/dependency-tsa.d.ts.map +1 -1
- package/dist/engines/dependency-tsa.js +8 -4
- package/dist/engines/dependency-tsa.js.map +1 -1
- package/dist/engines/fab-formats-processor.d.ts.map +1 -1
- package/dist/engines/fab-formats-processor.js +87 -49
- package/dist/engines/fab-formats-processor.js.map +1 -1
- package/dist/engines/faf-dna.d.ts +1 -1
- package/dist/engines/faf-dna.d.ts.map +1 -1
- package/dist/engines/faf-dna.js +20 -27
- package/dist/engines/faf-dna.js.map +1 -1
- package/dist/engines/relentless-context-extractor.d.ts.map +1 -1
- package/dist/engines/relentless-context-extractor.js +42 -31
- package/dist/engines/relentless-context-extractor.js.map +1 -1
- package/dist/family/registry.d.ts.map +1 -1
- package/dist/family/registry.js +8 -6
- package/dist/family/registry.js.map +1 -1
- package/dist/fix-once/colors.d.ts.map +1 -1
- package/dist/fix-once/colors.js +23 -11
- package/dist/fix-once/colors.js.map +1 -1
- package/dist/fix-once/commander.js +1 -1
- package/dist/fix-once/commander.js.map +1 -1
- package/dist/generators/faf-generator-championship.d.ts.map +1 -1
- package/dist/generators/faf-generator-championship.js +145 -59
- package/dist/generators/faf-generator-championship.js.map +1 -1
- package/dist/github/github-extractor.d.ts.map +1 -1
- package/dist/github/github-extractor.js +55 -28
- package/dist/github/github-extractor.js.map +1 -1
- package/dist/github/repo-selector.js +24 -14
- package/dist/github/repo-selector.js.map +1 -1
- package/dist/output/experience-manager.js +6 -3
- package/dist/output/experience-manager.js.map +1 -1
- package/dist/taf/stats.js +21 -13
- package/dist/taf/stats.js.map +1 -1
- package/dist/telemetry/analytics.js +1 -1
- package/dist/telemetry/analytics.js.map +1 -1
- package/dist/utils/balance-visualizer.d.ts.map +1 -1
- package/dist/utils/balance-visualizer.js +3 -10
- package/dist/utils/balance-visualizer.js.map +1 -1
- package/dist/utils/championship-core.js +14 -7
- package/dist/utils/championship-core.js.map +1 -1
- package/dist/utils/color-utils.d.ts.map +1 -1
- package/dist/utils/color-utils.js +1 -0
- package/dist/utils/color-utils.js.map +1 -1
- package/dist/utils/email-opt-in.js +5 -3
- package/dist/utils/email-opt-in.js.map +1 -1
- package/dist/utils/fab-formats-engine.d.ts.map +1 -1
- package/dist/utils/fab-formats-engine.js +105 -52
- package/dist/utils/fab-formats-engine.js.map +1 -1
- package/dist/utils/file-utils.js +1 -1
- package/dist/utils/file-utils.js.map +1 -1
- package/dist/utils/markdown-to-context.js +24 -13
- package/dist/utils/markdown-to-context.js.map +1 -1
- package/dist/utils/native-cli-parser.d.ts +2 -2
- package/dist/utils/native-cli-parser.d.ts.map +1 -1
- package/dist/utils/native-cli-parser.js +14 -10
- package/dist/utils/native-cli-parser.js.map +1 -1
- package/dist/utils/native-file-finder.js +1 -1
- package/dist/utils/native-file-finder.js.map +1 -1
- package/dist/utils/platform-detector.d.ts.map +1 -1
- package/dist/utils/platform-detector.js +3 -1
- package/dist/utils/platform-detector.js.map +1 -1
- package/dist/utils/technical-credit.js +2 -2
- package/dist/utils/technical-credit.js.map +1 -1
- package/dist/utils/trust-cache.d.ts.map +1 -1
- package/dist/utils/trust-cache.js +1 -2
- package/dist/utils/trust-cache.js.map +1 -1
- package/dist/utils/turbo-cat-knowledge.d.ts +17 -4
- package/dist/utils/turbo-cat-knowledge.d.ts.map +1 -1
- package/dist/utils/turbo-cat-knowledge.js +560 -4
- package/dist/utils/turbo-cat-knowledge.js.map +1 -1
- package/dist/utils/turbo-cat-pyramid.d.ts +14 -4
- package/dist/utils/turbo-cat-pyramid.d.ts.map +1 -1
- package/dist/utils/turbo-cat-pyramid.js +113 -21
- package/dist/utils/turbo-cat-pyramid.js.map +1 -1
- package/dist/utils/turbo-cat.d.ts.map +1 -1
- package/dist/utils/turbo-cat.js +50 -25
- package/dist/utils/turbo-cat.js.map +1 -1
- package/dist/utils/universal-fuzzy-detector.js +10 -5
- package/dist/utils/universal-fuzzy-detector.js.map +1 -1
- package/dist/utils/update-checker.d.ts.map +1 -1
- package/dist/utils/update-checker.js +15 -9
- package/dist/utils/update-checker.js.map +1 -1
- package/dist/utils/vibe-sync.d.ts.map +1 -1
- package/dist/utils/vibe-sync.js +12 -7
- package/dist/utils/vibe-sync.js.map +1 -1
- package/dist/utils/yaml-generator.d.ts +12 -12
- package/dist/utils/yaml-generator.d.ts.map +1 -1
- package/dist/utils/yaml-generator.js +58 -31
- package/dist/utils/yaml-generator.js.map +1 -1
- package/package.json +3 -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
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
fafData.project
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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(
|
|
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,
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
689
|
+
}
|
|
690
|
+
else if (files.includes('netlify.toml')) {
|
|
671
691
|
improvements.hosting = 'Netlify';
|
|
672
|
-
|
|
692
|
+
}
|
|
693
|
+
else if (files.includes('app.yaml')) {
|
|
673
694
|
improvements.hosting = 'Google App Engine';
|
|
674
|
-
|
|
695
|
+
}
|
|
696
|
+
else if (files.includes('Procfile')) {
|
|
675
697
|
improvements.hosting = 'Heroku';
|
|
676
|
-
|
|
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
|
|
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
|
-
|
|
712
|
+
}
|
|
713
|
+
else if (hasServerFile && !hasIndexHtml) {
|
|
689
714
|
improvements.projectType = 'backend-api';
|
|
690
|
-
|
|
715
|
+
}
|
|
716
|
+
else if (hasPublicDir && hasIndexHtml) {
|
|
691
717
|
improvements.projectType = 'frontend';
|
|
692
|
-
|
|
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
|
-
|
|
727
|
+
}
|
|
728
|
+
else if (files.includes('requirements.txt')) {
|
|
700
729
|
improvements.runtime = 'Python';
|
|
701
|
-
|
|
730
|
+
}
|
|
731
|
+
else if (files.includes('Gemfile')) {
|
|
702
732
|
improvements.runtime = 'Ruby';
|
|
703
|
-
|
|
733
|
+
}
|
|
734
|
+
else if (files.includes('go.mod')) {
|
|
704
735
|
improvements.runtime = 'Go';
|
|
705
|
-
|
|
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
|
-
|
|
751
|
+
}
|
|
752
|
+
else if (allDeps['@trpc/server']) {
|
|
719
753
|
improvements.api_type = 'tRPC';
|
|
720
|
-
|
|
754
|
+
}
|
|
755
|
+
else if (allDeps['socket.io']) {
|
|
721
756
|
improvements.api_type = 'WebSocket';
|
|
722
|
-
|
|
757
|
+
}
|
|
758
|
+
else {
|
|
723
759
|
improvements.api_type = 'REST';
|
|
760
|
+
}
|
|
724
761
|
}
|
|
725
|
-
catch
|
|
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
|
-
|
|
869
|
+
}
|
|
870
|
+
if (deps['vue']) {
|
|
833
871
|
frameworks.push('Vue');
|
|
834
|
-
|
|
872
|
+
}
|
|
873
|
+
if (deps['@angular/core']) {
|
|
835
874
|
frameworks.push('Angular');
|
|
836
|
-
|
|
875
|
+
}
|
|
876
|
+
if (deps['svelte']) {
|
|
837
877
|
frameworks.push('Svelte');
|
|
838
|
-
|
|
878
|
+
}
|
|
879
|
+
if (deps['solid-js']) {
|
|
839
880
|
frameworks.push('SolidJS');
|
|
840
|
-
|
|
881
|
+
}
|
|
882
|
+
if (deps['preact']) {
|
|
841
883
|
frameworks.push('Preact');
|
|
842
|
-
|
|
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
|
-
|
|
891
|
+
}
|
|
892
|
+
if (deps['nuxt']) {
|
|
848
893
|
frameworks.push('Nuxt');
|
|
849
|
-
|
|
894
|
+
}
|
|
895
|
+
if (deps['gatsby']) {
|
|
850
896
|
frameworks.push('Gatsby');
|
|
851
|
-
|
|
897
|
+
}
|
|
898
|
+
if (deps['@remix-run/react']) {
|
|
852
899
|
frameworks.push('Remix');
|
|
853
|
-
|
|
900
|
+
}
|
|
901
|
+
if (deps['astro']) {
|
|
854
902
|
frameworks.push('Astro');
|
|
855
|
-
|
|
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
|
-
|
|
910
|
+
}
|
|
911
|
+
if (deps['fastify']) {
|
|
861
912
|
frameworks.push('Fastify');
|
|
862
|
-
|
|
913
|
+
}
|
|
914
|
+
if (deps['@nestjs/core']) {
|
|
863
915
|
frameworks.push('NestJS');
|
|
864
|
-
|
|
916
|
+
}
|
|
917
|
+
if (deps['koa']) {
|
|
865
918
|
frameworks.push('Koa');
|
|
866
|
-
|
|
919
|
+
}
|
|
920
|
+
if (deps['@hapi/hapi']) {
|
|
867
921
|
frameworks.push('Hapi');
|
|
868
|
-
|
|
922
|
+
}
|
|
923
|
+
if (deps['@feathersjs/feathers']) {
|
|
869
924
|
frameworks.push('Feathers');
|
|
870
|
-
|
|
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
|
-
|
|
943
|
+
}
|
|
944
|
+
if (deps['webpack']) {
|
|
887
945
|
return 'Webpack';
|
|
888
|
-
|
|
946
|
+
}
|
|
947
|
+
if (deps['@parcel/core'] || deps['parcel']) {
|
|
889
948
|
return 'Parcel';
|
|
890
|
-
|
|
949
|
+
}
|
|
950
|
+
if (deps['esbuild']) {
|
|
891
951
|
return 'ESBuild';
|
|
892
|
-
|
|
952
|
+
}
|
|
953
|
+
if (deps['rollup']) {
|
|
893
954
|
return 'Rollup';
|
|
894
|
-
|
|
955
|
+
}
|
|
956
|
+
if (deps['@swc/core']) {
|
|
895
957
|
return 'SWC';
|
|
896
|
-
|
|
958
|
+
}
|
|
959
|
+
if (deps['turbopack']) {
|
|
897
960
|
return 'Turbopack';
|
|
898
|
-
|
|
961
|
+
}
|
|
962
|
+
if (deps['snowpack']) {
|
|
899
963
|
return 'Snowpack';
|
|
900
|
-
|
|
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
|
-
|
|
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
|
-
|
|
992
|
+
}
|
|
993
|
+
if (extensions.includes('.js') || extensions.includes('.jsx')) {
|
|
924
994
|
return 'JavaScript';
|
|
925
|
-
|
|
995
|
+
}
|
|
996
|
+
if (extensions.includes('.py')) {
|
|
926
997
|
return 'Python';
|
|
927
|
-
|
|
998
|
+
}
|
|
999
|
+
if (extensions.includes('.rs')) {
|
|
928
1000
|
return 'Rust';
|
|
929
|
-
|
|
1001
|
+
}
|
|
1002
|
+
if (extensions.includes('.go')) {
|
|
930
1003
|
return 'Go';
|
|
931
|
-
|
|
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
|
-
|
|
1048
|
+
}
|
|
1049
|
+
if (deps['jest']) {
|
|
974
1050
|
return 'Jest';
|
|
975
|
-
|
|
1051
|
+
}
|
|
1052
|
+
if (deps['mocha']) {
|
|
976
1053
|
return 'Mocha';
|
|
977
|
-
|
|
1054
|
+
}
|
|
1055
|
+
if (deps['jasmine']) {
|
|
978
1056
|
return 'Jasmine';
|
|
979
|
-
|
|
1057
|
+
}
|
|
1058
|
+
if (deps['ava']) {
|
|
980
1059
|
return 'AVA';
|
|
981
|
-
|
|
1060
|
+
}
|
|
1061
|
+
if (deps['tape']) {
|
|
982
1062
|
return 'Tape';
|
|
983
|
-
|
|
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
|
-
|
|
1070
|
+
}
|
|
1071
|
+
if (deps['cypress']) {
|
|
989
1072
|
return 'Cypress';
|
|
990
|
-
|
|
1073
|
+
}
|
|
1074
|
+
if (deps['puppeteer']) {
|
|
991
1075
|
return 'Puppeteer';
|
|
992
|
-
|
|
1076
|
+
}
|
|
1077
|
+
if (deps['webdriverio']) {
|
|
993
1078
|
return 'WebdriverIO';
|
|
994
|
-
|
|
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
|
-
|
|
1086
|
+
}
|
|
1087
|
+
if (deps['@testing-library/vue']) {
|
|
1000
1088
|
return 'Vue Testing Library';
|
|
1001
|
-
|
|
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
|
-
|
|
1102
|
+
}
|
|
1103
|
+
if (deps['typeorm']) {
|
|
1013
1104
|
return 'TypeORM';
|
|
1014
|
-
|
|
1105
|
+
}
|
|
1106
|
+
if (deps['sequelize']) {
|
|
1015
1107
|
return 'Sequelize';
|
|
1016
|
-
|
|
1108
|
+
}
|
|
1109
|
+
if (deps['drizzle-orm']) {
|
|
1017
1110
|
return 'Drizzle';
|
|
1018
|
-
|
|
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
|
-
|
|
1118
|
+
}
|
|
1119
|
+
if (deps['mysql'] || deps['mysql2']) {
|
|
1024
1120
|
return 'MySQL';
|
|
1025
|
-
|
|
1121
|
+
}
|
|
1122
|
+
if (deps['mongodb'] || deps['mongoose']) {
|
|
1026
1123
|
return 'MongoDB';
|
|
1027
|
-
|
|
1124
|
+
}
|
|
1125
|
+
if (deps['sqlite3'] || deps['better-sqlite3']) {
|
|
1028
1126
|
return 'SQLite';
|
|
1029
|
-
|
|
1127
|
+
}
|
|
1128
|
+
if (deps['redis'] || deps['ioredis']) {
|
|
1030
1129
|
return 'Redis';
|
|
1031
|
-
|
|
1130
|
+
}
|
|
1131
|
+
if (deps['@supabase/supabase-js']) {
|
|
1032
1132
|
return 'Supabase';
|
|
1033
|
-
|
|
1133
|
+
}
|
|
1134
|
+
if (deps['firebase']) {
|
|
1034
1135
|
return 'Firebase';
|
|
1035
|
-
|
|
1136
|
+
}
|
|
1137
|
+
if (deps['@planetscale/database']) {
|
|
1036
1138
|
return 'PlanetScale';
|
|
1037
|
-
|
|
1139
|
+
}
|
|
1140
|
+
if (deps['@neondatabase/serverless']) {
|
|
1038
1141
|
return 'Neon';
|
|
1039
|
-
|
|
1142
|
+
}
|
|
1143
|
+
if (deps['@vercel/postgres']) {
|
|
1040
1144
|
return 'Vercel Postgres';
|
|
1145
|
+
}
|
|
1041
1146
|
return null;
|
|
1042
1147
|
}
|
|
1043
1148
|
function displayImprovements(improvements) {
|