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
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 🏎️ faf yolo - Claude Power User Mode
|
|
4
|
+
* Maximum context extraction, no hand-holding, speed run!
|
|
5
|
+
*
|
|
6
|
+
* faf yolo = faf init --new --force + aggressive extraction + minimal output
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.yoloCommand = yoloCommand;
|
|
46
|
+
const colors_1 = require("../fix-once/colors");
|
|
47
|
+
const fs = __importStar(require("fs/promises"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
50
|
+
const faf_generator_championship_1 = require("../generators/faf-generator-championship");
|
|
51
|
+
const yaml_1 = __importDefault(require("../fix-once/yaml"));
|
|
52
|
+
const faf_compiler_1 = require("../compiler/faf-compiler");
|
|
53
|
+
const turbo_cat_1 = require("../utils/turbo-cat");
|
|
54
|
+
const relentless_context_extractor_1 = require("../engines/relentless-context-extractor");
|
|
55
|
+
const bi_sync_1 = require("./bi-sync");
|
|
56
|
+
const fafignore_parser_1 = require("../utils/fafignore-parser");
|
|
57
|
+
async function yoloCommand(directory, options = {}) {
|
|
58
|
+
const startTime = Date.now();
|
|
59
|
+
const targetDir = directory || process.cwd();
|
|
60
|
+
const homeDir = require('os').homedir();
|
|
61
|
+
// CRITICAL: Prevent running in home or root directory
|
|
62
|
+
if (!directory && (targetDir === homeDir || targetDir === '/')) {
|
|
63
|
+
console.log(colors_1.chalk.red('\n⚠️ YOLO doesn\'t mean reckless - not running on ROOT'));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
console.log(colors_1.chalk.bold.magenta("\n🚀 FAF YOLO - Power User Mode"));
|
|
67
|
+
console.log(colors_1.chalk.gray("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"));
|
|
68
|
+
try {
|
|
69
|
+
const outputPath = path.join(targetDir, 'project.faf');
|
|
70
|
+
// Step 1: Force create .fafignore if missing
|
|
71
|
+
const fafIgnorePath = path.join(targetDir, ".fafignore");
|
|
72
|
+
if (!(await (0, file_utils_1.fileExists)(fafIgnorePath))) {
|
|
73
|
+
await (0, fafignore_parser_1.createDefaultFafIgnore)(targetDir);
|
|
74
|
+
}
|
|
75
|
+
// Step 2: Detect project and generate fresh .faf (always overwrite)
|
|
76
|
+
const projectType = await (0, file_utils_1.detectProjectType)(targetDir);
|
|
77
|
+
const fafContent = await (0, faf_generator_championship_1.generateFafFromProject)({
|
|
78
|
+
projectType,
|
|
79
|
+
outputPath,
|
|
80
|
+
projectRoot: targetDir,
|
|
81
|
+
});
|
|
82
|
+
await fs.writeFile(outputPath, fafContent, "utf-8");
|
|
83
|
+
if (options.verbose) {
|
|
84
|
+
console.log(colors_1.chalk.green("✅ Fresh .faf created"));
|
|
85
|
+
}
|
|
86
|
+
// Step 3: TURBO-CAT format discovery
|
|
87
|
+
try {
|
|
88
|
+
const turboCat = new turbo_cat_1.TurboCat();
|
|
89
|
+
const analysis = await turboCat.discoverFormats(targetDir);
|
|
90
|
+
if (analysis.discoveredFormats.length > 0) {
|
|
91
|
+
const fafData = await fs.readFile(outputPath, 'utf-8');
|
|
92
|
+
const parsed = yaml_1.default.parse(fafData);
|
|
93
|
+
if (!parsed.stack) {
|
|
94
|
+
parsed.stack = {};
|
|
95
|
+
}
|
|
96
|
+
// Apply all TURBO-CAT discoveries
|
|
97
|
+
if (analysis.slotFillRecommendations) {
|
|
98
|
+
Object.entries(analysis.slotFillRecommendations).forEach(([key, value]) => {
|
|
99
|
+
if (!parsed.stack[key] || parsed.stack[key] === 'None' || parsed.stack[key] === null) {
|
|
100
|
+
parsed.stack[key] = value;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (analysis.stackSignature && analysis.stackSignature !== 'unknown-stack') {
|
|
105
|
+
parsed.stack_signature = analysis.stackSignature;
|
|
106
|
+
}
|
|
107
|
+
if (Object.keys(analysis.frameworkConfidence).length > 0) {
|
|
108
|
+
parsed.detected_frameworks = Object.keys(analysis.frameworkConfidence);
|
|
109
|
+
}
|
|
110
|
+
parsed.turbo_cat_intelligence = analysis.totalIntelligenceScore;
|
|
111
|
+
await fs.writeFile(outputPath, yaml_1.default.stringify(parsed), 'utf-8');
|
|
112
|
+
if (options.verbose) {
|
|
113
|
+
console.log(colors_1.chalk.green(`✅ TURBO-CAT: ${analysis.discoveredFormats.length} formats, ${Object.keys(analysis.slotFillRecommendations).length} slots`));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Silent fail - non-critical
|
|
119
|
+
}
|
|
120
|
+
// Step 4: AGGRESSIVE human context extraction (YOLO = accept INFERRED too!)
|
|
121
|
+
try {
|
|
122
|
+
const extractor = new relentless_context_extractor_1.RelentlessContextExtractor();
|
|
123
|
+
const humanContext = await extractor.extractFromProject(targetDir);
|
|
124
|
+
const fafData = await fs.readFile(outputPath, 'utf-8');
|
|
125
|
+
const parsed = yaml_1.default.parse(fafData);
|
|
126
|
+
if (!parsed.human_context) {
|
|
127
|
+
parsed.human_context = {};
|
|
128
|
+
}
|
|
129
|
+
let filledCount = 0;
|
|
130
|
+
const wFields = ['who', 'what', 'why', 'where', 'when', 'how'];
|
|
131
|
+
for (const field of wFields) {
|
|
132
|
+
const extraction = humanContext[field];
|
|
133
|
+
const currentValue = parsed.human_context[field];
|
|
134
|
+
// HONEST SCORING: Only write REAL values, never empty or MISSING
|
|
135
|
+
// YOLO MODE: Accept CERTAIN, PROBABLE, and INFERRED confidence!
|
|
136
|
+
if ((!currentValue || currentValue === 'null' || currentValue === null) &&
|
|
137
|
+
extraction.value &&
|
|
138
|
+
extraction.value.trim() !== '' && // Skip empty values
|
|
139
|
+
extraction.confidence !== 'MISSING' && // Skip MISSING confidence
|
|
140
|
+
(extraction.confidence === 'CERTAIN' ||
|
|
141
|
+
extraction.confidence === 'PROBABLE' ||
|
|
142
|
+
extraction.confidence === 'INFERRED')) {
|
|
143
|
+
parsed.human_context[field] = extraction.value;
|
|
144
|
+
filledCount++;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (filledCount > 0) {
|
|
148
|
+
await fs.writeFile(outputPath, yaml_1.default.stringify(parsed), 'utf-8');
|
|
149
|
+
if (options.verbose) {
|
|
150
|
+
console.log(colors_1.chalk.green(`✅ Extracted ${filledCount} human context fields (YOLO mode)`));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Silent fail
|
|
156
|
+
}
|
|
157
|
+
// Step 5: Bi-sync CLAUDE.md (silent)
|
|
158
|
+
try {
|
|
159
|
+
await (0, bi_sync_1.biSyncCommand)({ auto: true, force: true });
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Silent fail
|
|
163
|
+
}
|
|
164
|
+
// Calculate final score
|
|
165
|
+
let finalScore = 0;
|
|
166
|
+
try {
|
|
167
|
+
const compiler = new faf_compiler_1.FafCompiler();
|
|
168
|
+
const scoreResult = await compiler.compile(outputPath);
|
|
169
|
+
finalScore = Math.round(scoreResult.score || 0);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Fallback
|
|
173
|
+
}
|
|
174
|
+
// Speed run time
|
|
175
|
+
const lapTime = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
176
|
+
// Compact output - just what matters
|
|
177
|
+
console.log(colors_1.chalk.bold.cyan(`⚡ ${finalScore}% in ${lapTime}s`));
|
|
178
|
+
// Medal display
|
|
179
|
+
let medal = '🔴';
|
|
180
|
+
if (finalScore >= 99) {
|
|
181
|
+
medal = '🏆';
|
|
182
|
+
}
|
|
183
|
+
else if (finalScore >= 95) {
|
|
184
|
+
medal = '🥇';
|
|
185
|
+
}
|
|
186
|
+
else if (finalScore >= 85) {
|
|
187
|
+
medal = '🥈';
|
|
188
|
+
}
|
|
189
|
+
else if (finalScore >= 70) {
|
|
190
|
+
medal = '🥉';
|
|
191
|
+
}
|
|
192
|
+
else if (finalScore >= 55) {
|
|
193
|
+
medal = '🟡';
|
|
194
|
+
}
|
|
195
|
+
console.log(colors_1.chalk.white(`${medal} ${targetDir.split('/').pop()}`));
|
|
196
|
+
if (finalScore < 70) {
|
|
197
|
+
console.log(colors_1.chalk.gray(`\n💡 Add README.md with who/what/why for higher scores`));
|
|
198
|
+
}
|
|
199
|
+
console.log(colors_1.chalk.gray("\n🏎️ YOLO complete - now go build something!\n"));
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
console.log(colors_1.chalk.red(`\n💥 YOLO failed: ${error instanceof Error ? error.message : String(error)}`));
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=yolo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yolo.js","sourceRoot":"","sources":["../../src/commands/yolo.ts"],"names":[],"mappings":"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"}
|
|
@@ -605,8 +605,9 @@ function getSlotsForType(projectType) {
|
|
|
605
605
|
*/
|
|
606
606
|
function parseSlotIgnore(ast) {
|
|
607
607
|
const slotIgnore = ast.slot_ignore || ast.slotIgnore || ast.ignore_slots;
|
|
608
|
-
if (!slotIgnore)
|
|
608
|
+
if (!slotIgnore) {
|
|
609
609
|
return [];
|
|
610
|
+
}
|
|
610
611
|
// Handle array format
|
|
611
612
|
if (Array.isArray(slotIgnore)) {
|
|
612
613
|
return slotIgnore.map((s) => normalizeSlotName(s));
|
|
@@ -623,13 +624,15 @@ function parseSlotIgnore(ast) {
|
|
|
623
624
|
*/
|
|
624
625
|
function normalizeSlotName(slot) {
|
|
625
626
|
// Already has prefix
|
|
626
|
-
if (slot.includes('.'))
|
|
627
|
+
if (slot.includes('.')) {
|
|
627
628
|
return slot;
|
|
629
|
+
}
|
|
628
630
|
// Check each category for the slot
|
|
629
|
-
for (const [
|
|
631
|
+
for (const [_category, slots] of Object.entries(ALL_SLOTS)) {
|
|
630
632
|
const fullSlot = slots.find(s => s.endsWith(`.${slot}`));
|
|
631
|
-
if (fullSlot)
|
|
633
|
+
if (fullSlot) {
|
|
632
634
|
return fullSlot;
|
|
635
|
+
}
|
|
633
636
|
}
|
|
634
637
|
// Return as-is if not found (will be ignored)
|
|
635
638
|
return slot;
|
|
@@ -818,20 +821,27 @@ class FafCompiler {
|
|
|
818
821
|
if (analysis.context) {
|
|
819
822
|
const ctx = analysis.context;
|
|
820
823
|
// Map discovered items (WITHOUT modifying original)
|
|
821
|
-
if (ctx.projectName)
|
|
824
|
+
if (ctx.projectName) {
|
|
822
825
|
discovered.projectName = ctx.projectName;
|
|
823
|
-
|
|
826
|
+
}
|
|
827
|
+
if (ctx.mainLanguage) {
|
|
824
828
|
discovered.mainLanguage = ctx.mainLanguage;
|
|
825
|
-
|
|
829
|
+
}
|
|
830
|
+
if (ctx.framework) {
|
|
826
831
|
discovered.framework = ctx.framework;
|
|
827
|
-
|
|
832
|
+
}
|
|
833
|
+
if (ctx.database) {
|
|
828
834
|
discovered.database = ctx.database;
|
|
829
|
-
|
|
835
|
+
}
|
|
836
|
+
if (ctx.backend) {
|
|
830
837
|
discovered.backend = ctx.backend;
|
|
831
|
-
|
|
838
|
+
}
|
|
839
|
+
if (ctx.hosting) {
|
|
832
840
|
discovered.hosting = ctx.hosting;
|
|
833
|
-
|
|
841
|
+
}
|
|
842
|
+
if (ctx.buildTool) {
|
|
834
843
|
discovered.buildTool = ctx.buildTool;
|
|
844
|
+
}
|
|
835
845
|
}
|
|
836
846
|
return discovered;
|
|
837
847
|
}
|
|
@@ -922,18 +932,24 @@ class FafCompiler {
|
|
|
922
932
|
// Special handling for certain project types (auto-fill missing values)
|
|
923
933
|
// Chrome Extension: auto-fill technical context
|
|
924
934
|
if (projectType === 'chrome-extension') {
|
|
925
|
-
if (!ast.stack)
|
|
935
|
+
if (!ast.stack) {
|
|
926
936
|
ast.stack = {};
|
|
927
|
-
|
|
937
|
+
}
|
|
938
|
+
if (!ast.stack.runtime) {
|
|
928
939
|
ast.stack.runtime = 'Chrome/Browser';
|
|
929
|
-
|
|
940
|
+
}
|
|
941
|
+
if (!ast.stack.hosting) {
|
|
930
942
|
ast.stack.hosting = 'Chrome Web Store';
|
|
931
|
-
|
|
943
|
+
}
|
|
944
|
+
if (!ast.stack.api_type) {
|
|
932
945
|
ast.stack.api_type = 'Chrome Extension APIs';
|
|
933
|
-
|
|
946
|
+
}
|
|
947
|
+
if (!ast.stack.backend) {
|
|
934
948
|
ast.stack.backend = 'Service Worker';
|
|
935
|
-
|
|
949
|
+
}
|
|
950
|
+
if (!ast.stack.database) {
|
|
936
951
|
ast.stack.database = 'chrome.storage API';
|
|
952
|
+
}
|
|
937
953
|
// Add auto-filled slots (only if they're in the active slots list)
|
|
938
954
|
const chromeSlots = ['stack.runtime', 'stack.hosting', 'stack.api_type', 'stack.backend', 'stack.database'];
|
|
939
955
|
for (const slot of chromeSlots) {
|
|
@@ -944,38 +960,51 @@ class FafCompiler {
|
|
|
944
960
|
}
|
|
945
961
|
// Static HTML: auto-fill technical context
|
|
946
962
|
if (projectType === 'static-html' || projectType === 'landing-page') {
|
|
947
|
-
if (!ast.stack)
|
|
963
|
+
if (!ast.stack) {
|
|
948
964
|
ast.stack = {};
|
|
949
|
-
|
|
965
|
+
}
|
|
966
|
+
if (!ast.stack.frontend) {
|
|
950
967
|
ast.stack.frontend = 'HTML/CSS/JavaScript';
|
|
951
|
-
|
|
968
|
+
}
|
|
969
|
+
if (!ast.stack.runtime) {
|
|
952
970
|
ast.stack.runtime = 'Browser';
|
|
953
|
-
|
|
971
|
+
}
|
|
972
|
+
if (!ast.stack.hosting) {
|
|
954
973
|
ast.stack.hosting = 'Static Hosting';
|
|
955
|
-
|
|
974
|
+
}
|
|
975
|
+
if (!ast.stack.build) {
|
|
956
976
|
ast.stack.build = 'Direct HTML (no build step)';
|
|
977
|
+
}
|
|
957
978
|
}
|
|
958
979
|
// n8n Workflow: auto-fill technical context
|
|
959
980
|
if (projectType === 'n8n-workflow') {
|
|
960
|
-
if (!ast.project)
|
|
981
|
+
if (!ast.project) {
|
|
961
982
|
ast.project = {};
|
|
983
|
+
}
|
|
962
984
|
if (!ast.project.main_language) {
|
|
963
985
|
ast.project.main_language = ast.tech_stack?.primary_language || 'JSON (workflow definition)';
|
|
964
986
|
}
|
|
965
|
-
if (!ast.stack)
|
|
987
|
+
if (!ast.stack) {
|
|
966
988
|
ast.stack = {};
|
|
967
|
-
|
|
989
|
+
}
|
|
990
|
+
if (!ast.stack.runtime) {
|
|
968
991
|
ast.stack.runtime = ast.tech_stack?.workflow_engine || 'n8n';
|
|
969
|
-
|
|
992
|
+
}
|
|
993
|
+
if (!ast.stack.backend) {
|
|
970
994
|
ast.stack.backend = 'Node.js (n8n server)';
|
|
971
|
-
|
|
995
|
+
}
|
|
996
|
+
if (!ast.stack.api_type) {
|
|
972
997
|
ast.stack.api_type = 'Webhooks + HTTP';
|
|
973
|
-
|
|
998
|
+
}
|
|
999
|
+
if (!ast.stack.database) {
|
|
974
1000
|
ast.stack.database = ast.tech_stack?.infrastructure?.vector_db || 'Workflow State';
|
|
975
|
-
|
|
1001
|
+
}
|
|
1002
|
+
if (!ast.stack.hosting) {
|
|
976
1003
|
ast.stack.hosting = 'n8n Cloud';
|
|
977
|
-
|
|
1004
|
+
}
|
|
1005
|
+
if (!ast.stack.build) {
|
|
978
1006
|
ast.stack.build = 'n8n Visual Editor';
|
|
1007
|
+
}
|
|
979
1008
|
}
|
|
980
1009
|
// Discovered slots (if any) - only add if slot is active and not already filled
|
|
981
1010
|
if (ast._discovered) {
|
|
@@ -1026,8 +1055,9 @@ class FafCompiler {
|
|
|
1026
1055
|
}
|
|
1027
1056
|
isSlotFilled(value) {
|
|
1028
1057
|
// Handle null, undefined, false explicitly
|
|
1029
|
-
if (value === null || value === undefined || value === false)
|
|
1058
|
+
if (value === null || value === undefined || value === false) {
|
|
1030
1059
|
return false;
|
|
1060
|
+
}
|
|
1031
1061
|
if (typeof value === 'string') {
|
|
1032
1062
|
// Also treat string representations of null/undefined as empty
|
|
1033
1063
|
const empty = ['', 'None', 'Unknown', 'Not specified', 'N/A', 'null', 'undefined', '~'];
|
|
@@ -1051,8 +1081,9 @@ class FafCompiler {
|
|
|
1051
1081
|
}
|
|
1052
1082
|
if (typeof value === 'object') {
|
|
1053
1083
|
// Arrays and objects need content
|
|
1054
|
-
if (Array.isArray(value))
|
|
1084
|
+
if (Array.isArray(value)) {
|
|
1055
1085
|
return value.length > 0;
|
|
1086
|
+
}
|
|
1056
1087
|
return Object.keys(value).length > 0;
|
|
1057
1088
|
}
|
|
1058
1089
|
return true;
|
|
@@ -1061,8 +1092,9 @@ class FafCompiler {
|
|
|
1061
1092
|
const parts = path.split('.');
|
|
1062
1093
|
let current = ast;
|
|
1063
1094
|
for (const part of parts) {
|
|
1064
|
-
if (!current || !current[part])
|
|
1095
|
+
if (!current || !current[part]) {
|
|
1065
1096
|
return false;
|
|
1097
|
+
}
|
|
1066
1098
|
current = current[part];
|
|
1067
1099
|
}
|
|
1068
1100
|
return this.isSlotFilled(current);
|
|
@@ -1122,8 +1154,9 @@ class FafCompiler {
|
|
|
1122
1154
|
}
|
|
1123
1155
|
// Language-based defaults
|
|
1124
1156
|
if (mainLanguage === 'python') {
|
|
1125
|
-
if (ast.stack?.frontend)
|
|
1157
|
+
if (ast.stack?.frontend) {
|
|
1126
1158
|
return 'fullstack';
|
|
1159
|
+
}
|
|
1127
1160
|
return 'python-app'; // Could be CLI, API, or data science
|
|
1128
1161
|
}
|
|
1129
1162
|
return 'generic';
|
|
@@ -1152,8 +1185,9 @@ class FafCompiler {
|
|
|
1152
1185
|
section === 'project' ? 'project' : 'stack';
|
|
1153
1186
|
const sec = sections[sectionKey];
|
|
1154
1187
|
sec.total++;
|
|
1155
|
-
if (slot.filled)
|
|
1188
|
+
if (slot.filled) {
|
|
1156
1189
|
sec.filled++;
|
|
1190
|
+
}
|
|
1157
1191
|
sec.slots.push({
|
|
1158
1192
|
id: slot.id,
|
|
1159
1193
|
value: slot.value,
|
|
@@ -1194,8 +1228,9 @@ class FafCompiler {
|
|
|
1194
1228
|
return { filled, total, breakdown };
|
|
1195
1229
|
}
|
|
1196
1230
|
calculateScore(slots) {
|
|
1197
|
-
if (slots.total === 0)
|
|
1231
|
+
if (slots.total === 0) {
|
|
1198
1232
|
return 0;
|
|
1233
|
+
}
|
|
1199
1234
|
return (slots.filled / slots.total) * 100;
|
|
1200
1235
|
}
|
|
1201
1236
|
// ============================================================================
|
|
@@ -1272,16 +1307,18 @@ class FafCompiler {
|
|
|
1272
1307
|
console.log(`\n❌ ${byType.error.length} Errors:`);
|
|
1273
1308
|
byType.error.forEach(d => {
|
|
1274
1309
|
console.log(` ${d.message}`);
|
|
1275
|
-
if (d.suggestion)
|
|
1310
|
+
if (d.suggestion) {
|
|
1276
1311
|
console.log(` → ${d.suggestion}`);
|
|
1312
|
+
}
|
|
1277
1313
|
});
|
|
1278
1314
|
}
|
|
1279
1315
|
if (byType.warning.length > 0) {
|
|
1280
1316
|
console.log(`\n⚠️ ${byType.warning.length} Warnings:`);
|
|
1281
1317
|
byType.warning.forEach(d => {
|
|
1282
1318
|
console.log(` ${d.message}`);
|
|
1283
|
-
if (d.suggestion)
|
|
1319
|
+
if (d.suggestion) {
|
|
1284
1320
|
console.log(` → ${d.suggestion}`);
|
|
1321
|
+
}
|
|
1285
1322
|
});
|
|
1286
1323
|
}
|
|
1287
1324
|
if (byType.info.length > 0) {
|