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.
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 +45 -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 +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 [category, slots] of Object.entries(ALL_SLOTS)) {
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
- if (ctx.mainLanguage)
826
+ }
827
+ if (ctx.mainLanguage) {
824
828
  discovered.mainLanguage = ctx.mainLanguage;
825
- if (ctx.framework)
829
+ }
830
+ if (ctx.framework) {
826
831
  discovered.framework = ctx.framework;
827
- if (ctx.database)
832
+ }
833
+ if (ctx.database) {
828
834
  discovered.database = ctx.database;
829
- if (ctx.backend)
835
+ }
836
+ if (ctx.backend) {
830
837
  discovered.backend = ctx.backend;
831
- if (ctx.hosting)
838
+ }
839
+ if (ctx.hosting) {
832
840
  discovered.hosting = ctx.hosting;
833
- if (ctx.buildTool)
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
- if (!ast.stack.runtime)
937
+ }
938
+ if (!ast.stack.runtime) {
928
939
  ast.stack.runtime = 'Chrome/Browser';
929
- if (!ast.stack.hosting)
940
+ }
941
+ if (!ast.stack.hosting) {
930
942
  ast.stack.hosting = 'Chrome Web Store';
931
- if (!ast.stack.api_type)
943
+ }
944
+ if (!ast.stack.api_type) {
932
945
  ast.stack.api_type = 'Chrome Extension APIs';
933
- if (!ast.stack.backend)
946
+ }
947
+ if (!ast.stack.backend) {
934
948
  ast.stack.backend = 'Service Worker';
935
- if (!ast.stack.database)
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
- if (!ast.stack.frontend)
965
+ }
966
+ if (!ast.stack.frontend) {
950
967
  ast.stack.frontend = 'HTML/CSS/JavaScript';
951
- if (!ast.stack.runtime)
968
+ }
969
+ if (!ast.stack.runtime) {
952
970
  ast.stack.runtime = 'Browser';
953
- if (!ast.stack.hosting)
971
+ }
972
+ if (!ast.stack.hosting) {
954
973
  ast.stack.hosting = 'Static Hosting';
955
- if (!ast.stack.build)
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
- if (!ast.stack.runtime)
989
+ }
990
+ if (!ast.stack.runtime) {
968
991
  ast.stack.runtime = ast.tech_stack?.workflow_engine || 'n8n';
969
- if (!ast.stack.backend)
992
+ }
993
+ if (!ast.stack.backend) {
970
994
  ast.stack.backend = 'Node.js (n8n server)';
971
- if (!ast.stack.api_type)
995
+ }
996
+ if (!ast.stack.api_type) {
972
997
  ast.stack.api_type = 'Webhooks + HTTP';
973
- if (!ast.stack.database)
998
+ }
999
+ if (!ast.stack.database) {
974
1000
  ast.stack.database = ast.tech_stack?.infrastructure?.vector_db || 'Workflow State';
975
- if (!ast.stack.hosting)
1001
+ }
1002
+ if (!ast.stack.hosting) {
976
1003
  ast.stack.hosting = 'n8n Cloud';
977
- if (!ast.stack.build)
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) {