faf-cli 4.2.2 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,557 @@
1
+ "use strict";
2
+ /**
3
+ * 🏆 Enhanced FAF Generation for `faf git`
4
+ *
5
+ * Generates 90%+ AI-ready .faf files from GitHub repos WITHOUT cloning
6
+ *
7
+ * Strategy:
8
+ * 1. Fetch README.md → Extract 6 Ws (+30%)
9
+ * 2. Fetch package.json → Deep stack analysis (+15%)
10
+ * 3. Full FAF schema → Match faf-cli init (+20%)
11
+ * 4. Smart defaults → AI instructions, project type (+15%)
12
+ * 5. Enhanced scoring → Championship grade (+10%)
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.extract6WsFromReadme = extract6WsFromReadme;
16
+ exports.extractFromLanguages = extractFromLanguages;
17
+ exports.analyzePackageJson = analyzePackageJson;
18
+ exports.calculateEnhancedScore = calculateEnhancedScore;
19
+ exports.generateEnhancedFaf = generateEnhancedFaf;
20
+ const github_extractor_1 = require("./github-extractor");
21
+ const slot_counter_1 = require("../utils/slot-counter");
22
+ /**
23
+ * Extract 6 Ws from README content (simplified version for git command)
24
+ */
25
+ function extract6WsFromReadme(readme, metadata) {
26
+ const result = {
27
+ who: 'Open source contributors',
28
+ what: metadata.description || 'Software project',
29
+ why: 'Solve problems with code',
30
+ where: 'GitHub + npm registry',
31
+ when: 'Production/Stable',
32
+ how: 'See README for usage',
33
+ confidence: 40
34
+ };
35
+ let confidenceBoost = 0;
36
+ // === WHAT: Extract from README patterns ===
37
+ // Pattern 1: Bold subtitle after H1
38
+ const boldSubtitleMatch = readme.match(/^#\s+[^\n]+\n+\*\*([^*]+)\*\*/m);
39
+ if (boldSubtitleMatch?.[1]) {
40
+ const extracted = cleanText(boldSubtitleMatch[1]);
41
+ if (extracted.length > 10 && extracted.length < 150) {
42
+ result.what = extracted;
43
+ confidenceBoost += 15;
44
+ }
45
+ }
46
+ // Pattern 2: First descriptive paragraph
47
+ if (!boldSubtitleMatch) {
48
+ const firstParaMatch = readme.match(/^#\s+[^\n]+\n+([A-Z][^#\n`*|]{30,200})/m);
49
+ if (firstParaMatch?.[1]) {
50
+ result.what = cleanText(firstParaMatch[1]);
51
+ confidenceBoost += 10;
52
+ }
53
+ }
54
+ // === WHY: Problem/motivation ===
55
+ const whyPatterns = [
56
+ /\*\*Problem:\*\*\s*([^\n]+)/i,
57
+ /##\s*Why[^#\n]*\n+([\s\S]{20,200})(?=\n##|$)/i,
58
+ /(\d+\s*(?:seconds?|minutes?|hours?)\s+(?:replaces?|vs)[^.\n]+)/i
59
+ ];
60
+ for (const pattern of whyPatterns) {
61
+ const match = readme.match(pattern);
62
+ if (match?.[1]) {
63
+ result.why = cleanText(match[1]);
64
+ confidenceBoost += 10;
65
+ break;
66
+ }
67
+ }
68
+ // === WHO: Target audience ===
69
+ const whoPatterns = [
70
+ /##\s*(?:Who|Target Audience|For)[^#\n]*\n+([\s\S]{10,150})(?=\n##|$)/i,
71
+ /(?:Built for|Designed for|Perfect for)\s+([^.\n]{10,100})/i
72
+ ];
73
+ for (const pattern of whoPatterns) {
74
+ const match = readme.match(pattern);
75
+ if (match?.[1]) {
76
+ result.who = cleanText(match[1]);
77
+ confidenceBoost += 10;
78
+ break;
79
+ }
80
+ }
81
+ // === HOW: Usage/installation ===
82
+ if (readme.includes('npm install') || readme.includes('Installation')) {
83
+ result.how = 'npm install + usage guide in README';
84
+ confidenceBoost += 5;
85
+ }
86
+ else if (readme.includes('Quick Start') || readme.includes('Getting Started')) {
87
+ result.how = 'See Quick Start guide in README';
88
+ confidenceBoost += 5;
89
+ }
90
+ result.confidence = Math.min(100, result.confidence + confidenceBoost);
91
+ return result;
92
+ }
93
+ /**
94
+ * Extract stack from GH API languages array
95
+ * This is the SOURCE OF TRUTH from GitHub - trust it!
96
+ */
97
+ function extractFromLanguages(metadata) {
98
+ const analysis = {
99
+ frameworks: []
100
+ };
101
+ if (!metadata.languages || metadata.languages.length === 0) {
102
+ return analysis;
103
+ }
104
+ // Convert to lowercase for easier matching
105
+ const langs = metadata.languages.map(l => l.toLowerCase());
106
+ // Runtime detection (from primary language)
107
+ const primaryLang = metadata.languages[0]?.split(' ')[0];
108
+ if (langs.some(l => l.startsWith('c++'))) {
109
+ analysis.language = 'C++';
110
+ analysis.runtime = 'C++';
111
+ }
112
+ else if (langs.some(l => l.startsWith('rust'))) {
113
+ analysis.language = 'Rust';
114
+ analysis.runtime = 'Rust';
115
+ }
116
+ else if (langs.some(l => l.startsWith('go'))) {
117
+ analysis.language = 'Go';
118
+ analysis.runtime = 'Go';
119
+ }
120
+ else if (langs.some(l => l.startsWith('python'))) {
121
+ analysis.language = 'Python';
122
+ analysis.runtime = 'Python';
123
+ }
124
+ else if (langs.some(l => l.startsWith('java'))) {
125
+ analysis.language = 'Java';
126
+ analysis.runtime = 'JVM';
127
+ }
128
+ else if (langs.some(l => l.startsWith('c ('))) {
129
+ analysis.language = 'C';
130
+ analysis.runtime = 'C';
131
+ }
132
+ else if (langs.some(l => l.startsWith('typescript'))) {
133
+ analysis.language = 'TypeScript';
134
+ analysis.runtime = 'Node.js';
135
+ }
136
+ else if (langs.some(l => l.startsWith('javascript'))) {
137
+ analysis.language = 'JavaScript';
138
+ analysis.runtime = 'Node.js';
139
+ }
140
+ // Build system detection
141
+ if (langs.some(l => l.startsWith('cmake'))) {
142
+ analysis.buildTool = 'CMake';
143
+ }
144
+ else if (langs.some(l => l.startsWith('makefile'))) {
145
+ analysis.buildTool = 'Make';
146
+ }
147
+ else if (langs.some(l => l.startsWith('gradle'))) {
148
+ analysis.buildTool = 'Gradle';
149
+ }
150
+ else if (langs.some(l => l.startsWith('maven'))) {
151
+ analysis.buildTool = 'Maven';
152
+ }
153
+ // Hosting detection (from Dockerfile)
154
+ if (langs.some(l => l.startsWith('dockerfile'))) {
155
+ analysis.hosting = 'Docker';
156
+ }
157
+ return analysis;
158
+ }
159
+ function analyzePackageJson(packageJson, metadata) {
160
+ const analysis = {
161
+ frameworks: []
162
+ };
163
+ const deps = {
164
+ ...packageJson.dependencies,
165
+ ...packageJson.devDependencies
166
+ };
167
+ // Frontend
168
+ if (deps.react)
169
+ analysis.frontend = 'React';
170
+ else if (deps.vue)
171
+ analysis.frontend = 'Vue';
172
+ else if (deps.svelte)
173
+ analysis.frontend = 'Svelte';
174
+ else if (deps['@angular/core'])
175
+ analysis.frontend = 'Angular';
176
+ else if (deps.next)
177
+ analysis.frontend = 'Next.js';
178
+ // Backend
179
+ if (deps.express)
180
+ analysis.backend = 'Express';
181
+ else if (deps.fastify)
182
+ analysis.backend = 'Fastify';
183
+ else if (deps.koa)
184
+ analysis.backend = 'Koa';
185
+ else if (deps['@nestjs/core'])
186
+ analysis.backend = 'NestJS';
187
+ // Database
188
+ if (deps.mongoose)
189
+ analysis.database = 'MongoDB';
190
+ else if (deps.pg || deps.postgres)
191
+ analysis.database = 'PostgreSQL';
192
+ else if (deps.mysql || deps.mysql2)
193
+ analysis.database = 'MySQL';
194
+ else if (deps.sqlite3 || deps['better-sqlite3'])
195
+ analysis.database = 'SQLite';
196
+ else if (deps.redis)
197
+ analysis.database = 'Redis';
198
+ // Testing
199
+ if (deps.jest)
200
+ analysis.testing = 'Jest';
201
+ else if (deps.vitest)
202
+ analysis.testing = 'Vitest';
203
+ else if (deps.mocha)
204
+ analysis.testing = 'Mocha';
205
+ // Build tools (npm ecosystem)
206
+ if (deps.vite)
207
+ analysis.buildTool = 'Vite';
208
+ else if (deps.webpack)
209
+ analysis.buildTool = 'Webpack';
210
+ else if (deps.rollup)
211
+ analysis.buildTool = 'Rollup';
212
+ else if (deps.esbuild)
213
+ analysis.buildTool = 'esbuild';
214
+ // Runtime (npm ecosystem - override if detected from GH languages)
215
+ if (metadata.languages?.some(l => l.startsWith('TypeScript'))) {
216
+ analysis.language = 'TypeScript';
217
+ analysis.runtime = 'Node.js';
218
+ }
219
+ else if (metadata.languages?.some(l => l.startsWith('JavaScript'))) {
220
+ analysis.language = 'JavaScript';
221
+ analysis.runtime = 'Node.js';
222
+ }
223
+ // Collect frameworks
224
+ if (analysis.frontend)
225
+ analysis.frameworks.push(analysis.frontend);
226
+ if (analysis.backend)
227
+ analysis.frameworks.push(analysis.backend);
228
+ return analysis;
229
+ }
230
+ /**
231
+ * Calculate enhanced quality score (targeting 90%+)
232
+ */
233
+ function calculateEnhancedScore(metadata, has6Ws, hasPackageJson, hasReadme) {
234
+ let score = 0;
235
+ // Base metadata (25%)
236
+ if (metadata.description)
237
+ score += 5;
238
+ if (metadata.stars && parseInt(metadata.stars.replace(/[KM]/g, '')) > 0)
239
+ score += 5;
240
+ if (metadata.license)
241
+ score += 5;
242
+ if (metadata.topics && metadata.topics.length > 0)
243
+ score += 5;
244
+ if (metadata.languages && metadata.languages.length > 0)
245
+ score += 5;
246
+ // README extraction (30%)
247
+ if (hasReadme) {
248
+ score += 10; // Has README
249
+ if (has6Ws)
250
+ score += 20; // Extracted 6 Ws
251
+ }
252
+ // package.json analysis (15%)
253
+ if (hasPackageJson) {
254
+ score += 15; // Deep dependency analysis
255
+ }
256
+ // Stack detection (10%)
257
+ if (metadata.hasPackageJson || metadata.hasTsConfig)
258
+ score += 5;
259
+ if (metadata.hasDockerfile)
260
+ score += 5;
261
+ // Recent activity (10%)
262
+ if (metadata.lastUpdated) {
263
+ const daysSince = (Date.now() - new Date(metadata.lastUpdated).getTime()) / (1000 * 60 * 60 * 24);
264
+ if (daysSince < 90)
265
+ score += 10;
266
+ else if (daysSince < 180)
267
+ score += 5;
268
+ }
269
+ // File structure (5%)
270
+ score += 5;
271
+ // AI-ready structure (5%)
272
+ score += 5; // Full FAF schema
273
+ return Math.min(100, score);
274
+ }
275
+ /**
276
+ * Generate full FAF structure (matching faf-cli init output)
277
+ */
278
+ async function generateEnhancedFaf(metadata, files) {
279
+ const timestamp = new Date().toISOString();
280
+ // Fetch README.md
281
+ const readme = await (0, github_extractor_1.fetchGitHubFileContent)(metadata.owner, metadata.repo, 'README.md', metadata.defaultBranch);
282
+ // Fetch package.json
283
+ let packageJsonContent = null;
284
+ const packageJsonRaw = await (0, github_extractor_1.fetchGitHubFileContent)(metadata.owner, metadata.repo, 'package.json', metadata.defaultBranch);
285
+ if (packageJsonRaw) {
286
+ try {
287
+ packageJsonContent = JSON.parse(packageJsonRaw);
288
+ }
289
+ catch {
290
+ // Invalid JSON
291
+ }
292
+ }
293
+ // Extract 6 Ws from README
294
+ const sixWs = readme
295
+ ? extract6WsFromReadme(readme, metadata)
296
+ : {
297
+ who: 'Open source contributors',
298
+ what: metadata.description || 'Software project',
299
+ why: 'Solve problems with code',
300
+ where: 'GitHub',
301
+ when: 'Production',
302
+ how: 'See repository',
303
+ confidence: 25
304
+ };
305
+ // Extract stack from GH API languages (SOURCE OF TRUTH)
306
+ const langStack = extractFromLanguages(metadata);
307
+ // Analyze stack from package.json (if exists - adds npm-specific detail)
308
+ const npmStack = packageJsonContent
309
+ ? analyzePackageJson(packageJsonContent, metadata)
310
+ : { frameworks: [] };
311
+ // Merge: npm takes priority for fields it detects (more specific)
312
+ const stackAnalysis = { ...langStack, ...npmStack, frameworks: npmStack.frameworks || [] };
313
+ // Determine project type
314
+ const projectType = determineProjectType(metadata, stackAnalysis, packageJsonContent);
315
+ // Calculate REAL score using slot-counting (not hardcoded formula)
316
+ // IMPORTANT: Values must match what's written to .faf file (apply same defaults)
317
+ const slotCount = (0, slot_counter_1.countSlots)({
318
+ // Project (4)
319
+ projectName: metadata.repo,
320
+ projectGoal: metadata.description || null,
321
+ mainLanguage: stackAnalysis.language || metadata.languages?.[0]?.split(' ')[0] || 'Unknown',
322
+ projectType: projectType,
323
+ // Human context (6)
324
+ who: sixWs.who,
325
+ what: sixWs.what,
326
+ why: sixWs.why,
327
+ where: sixWs.where,
328
+ when: sixWs.when,
329
+ how: sixWs.how,
330
+ // Stack (11) - Apply same defaults as written to .faf (MUST MATCH!)
331
+ frontend: stackAnalysis.frontend || 'slotignored',
332
+ uiLibrary: 'slotignored',
333
+ backend: stackAnalysis.backend || 'slotignored',
334
+ runtime: stackAnalysis.runtime || 'slotignored',
335
+ database: stackAnalysis.database || 'slotignored',
336
+ build: stackAnalysis.buildTool || 'slotignored',
337
+ packageManager: packageJsonContent ? 'npm' : 'slotignored',
338
+ apiType: 'slotignored',
339
+ hosting: stackAnalysis.hosting || (metadata.topics?.includes('vercel') || metadata.topics?.includes('netlify') ? 'Cloud' : 'slotignored'),
340
+ cicd: 'slotignored',
341
+ cssFramework: 'slotignored'
342
+ });
343
+ const score = slotCount.score;
344
+ // Generate full FAF structure
345
+ const fafData = {
346
+ faf_version: '2.5.0',
347
+ generated: timestamp,
348
+ ai_scoring_system: '2025-09-20',
349
+ ai_score: `${score}%`,
350
+ ai_confidence: score >= 80 ? 'HIGH' : score >= 60 ? 'MEDIUM' : 'LOW',
351
+ ai_value: '30_seconds_replaces_20_minutes_of_questions',
352
+ ai_tldr: {
353
+ project: metadata.repo,
354
+ stack: stackAnalysis.frameworks.join('/') || 'See stack section',
355
+ quality_bar: 'production_ready',
356
+ current_focus: 'See README for details',
357
+ your_role: 'Build features with perfect context'
358
+ },
359
+ instant_context: {
360
+ tech_stack: stackAnalysis.frameworks.join('/') || 'See metadata',
361
+ main_language: stackAnalysis.language || metadata.languages?.[0]?.split(' ')[0] || 'Unknown',
362
+ key_files: getKeyFiles(files),
363
+ },
364
+ context_quality: {
365
+ slots_filled: `${slotCount.filled + slotCount.ignored}/21 (${score}%)`,
366
+ ai_confidence: score >= 80 ? 'HIGH' : score >= 60 ? 'MEDIUM' : 'LOW',
367
+ handoff_ready: score >= 85,
368
+ missing_context: slotCount.missingSlots.length > 0 ? slotCount.missingSlots : ['None - fully specified!']
369
+ },
370
+ project: {
371
+ name: metadata.repo,
372
+ goal: metadata.description || null,
373
+ main_language: stackAnalysis.language || metadata.languages?.[0]?.split(' ')[0] || 'Unknown',
374
+ type: projectType
375
+ },
376
+ ai_instructions: {
377
+ priority_order: [
378
+ '1. Read THIS .faf file first',
379
+ '2. Check README.md for usage details',
380
+ '3. Review package.json for dependencies'
381
+ ],
382
+ working_style: {
383
+ code_first: true,
384
+ explanations: 'minimal',
385
+ quality_bar: 'zero_errors',
386
+ testing: 'required'
387
+ },
388
+ warnings: [
389
+ 'Check README for project-specific guidelines',
390
+ 'Review existing code style before modifying'
391
+ ]
392
+ },
393
+ stack: {
394
+ frontend: stackAnalysis.frontend || 'slotignored',
395
+ ui_library: 'slotignored', // TODO: Detect from package.json
396
+ backend: stackAnalysis.backend || 'slotignored',
397
+ runtime: stackAnalysis.runtime || 'slotignored',
398
+ database: stackAnalysis.database || 'slotignored',
399
+ build: stackAnalysis.buildTool || 'slotignored',
400
+ package_manager: packageJsonContent ? 'npm' : 'slotignored',
401
+ api_type: 'slotignored', // TODO: Detect API type
402
+ hosting: stackAnalysis.hosting || (metadata.topics?.includes('vercel') || metadata.topics?.includes('netlify') ? 'Cloud' : 'slotignored'),
403
+ cicd: 'slotignored', // TODO: Detect from .github/workflows
404
+ css_framework: 'slotignored' // TODO: Detect from package.json
405
+ },
406
+ metadata: {
407
+ url: metadata.url,
408
+ owner: metadata.owner,
409
+ repository: metadata.repo,
410
+ description: metadata.description || 'No description',
411
+ stars: metadata.stars || '0',
412
+ forks: metadata.forks || '0',
413
+ license: metadata.license || 'Not specified',
414
+ topics: metadata.topics || [],
415
+ languages: metadata.languages || [],
416
+ last_updated: metadata.lastUpdated,
417
+ default_branch: metadata.defaultBranch
418
+ },
419
+ human_context: {
420
+ who: sixWs.who,
421
+ what: sixWs.what,
422
+ why: sixWs.why,
423
+ where: sixWs.where,
424
+ when: sixWs.when,
425
+ how: sixWs.how,
426
+ additional_context: readme ? 'See README.md for full details' : null,
427
+ context_score: sixWs.confidence,
428
+ total_prd_score: score,
429
+ success_rate: `${Math.min(100, sixWs.confidence)}%`
430
+ },
431
+ scores: {
432
+ faf_score: score,
433
+ slot_based_percentage: score,
434
+ total_slots: 21
435
+ },
436
+ tags: {
437
+ auto_generated: [
438
+ metadata.repo,
439
+ ...(metadata.topics || []).slice(0, 5)
440
+ ],
441
+ smart_defaults: [
442
+ '.faf',
443
+ 'ai-ready',
444
+ new Date().getFullYear().toString(),
445
+ 'github',
446
+ 'open-source'
447
+ ]
448
+ },
449
+ generated_by: {
450
+ tool: 'faf-cli',
451
+ command: `faf git ${metadata.owner}/${metadata.repo}`,
452
+ version: '4.3.0',
453
+ source: 'github-api'
454
+ }
455
+ };
456
+ // Convert to YAML
457
+ const { stringify: stringifyYAML } = require('../fix-once/yaml');
458
+ const yamlContent = stringifyYAML(fafData);
459
+ // Add header
460
+ const tier = getScoreTier(score);
461
+ const header = `# ========================================
462
+ # 🏎️ FAF GIT - ENHANCED GENERATION
463
+ # ========================================
464
+ #
465
+ # Repository: ${metadata.owner}/${metadata.repo}
466
+ # URL: ${metadata.url}
467
+ # Description: ${metadata.description || 'No description'}
468
+ # Stars: ${metadata.stars || '0'} | Forks: ${metadata.forks || '0'}
469
+ # License: ${metadata.license || 'Not specified'}
470
+ #
471
+ # Quality Score: ${score}% ${tier}
472
+ # 6 Ws Confidence: ${sixWs.confidence}%
473
+ #
474
+ # Generated: ${timestamp}
475
+ # Command: npx faf-cli git ${metadata.owner}/${metadata.repo}
476
+ # Strategy: README extraction + package.json analysis + smart defaults
477
+ #
478
+ # ========================================
479
+ # AI-READY CONTEXT (No Cloning Required!)
480
+ # ========================================
481
+
482
+ `;
483
+ return {
484
+ content: header + yamlContent,
485
+ score
486
+ };
487
+ }
488
+ // Helper functions
489
+ function cleanText(text) {
490
+ return text
491
+ .replace(/\*\*/g, '')
492
+ .replace(/\n+/g, ' ')
493
+ .trim();
494
+ }
495
+ function getScoreTier(score) {
496
+ if (score >= 100)
497
+ return '🏆 Trophy';
498
+ if (score >= 99)
499
+ return '🥇 Gold';
500
+ if (score >= 95)
501
+ return '🥈 Silver';
502
+ if (score >= 85)
503
+ return '🥉 Bronze';
504
+ if (score >= 70)
505
+ return '🟢 Green';
506
+ if (score >= 55)
507
+ return '🟡 Yellow';
508
+ if (score > 0)
509
+ return '🔴 Red';
510
+ return '🤍 White';
511
+ }
512
+ function determineProjectType(metadata, stack, packageJson) {
513
+ if (packageJson?.bin)
514
+ return 'cli';
515
+ if (stack.frontend && stack.backend)
516
+ return 'full-stack';
517
+ if (stack.frontend)
518
+ return 'frontend';
519
+ if (stack.backend)
520
+ return 'backend';
521
+ if (stack.database)
522
+ return 'database';
523
+ if (packageJson?.name?.includes('lib'))
524
+ return 'library';
525
+ return 'application';
526
+ }
527
+ function getKeyFiles(files) {
528
+ const priority = [
529
+ 'package.json',
530
+ 'README.md',
531
+ 'tsconfig.json',
532
+ 'vite.config.ts',
533
+ 'next.config.js',
534
+ 'src/index.ts',
535
+ 'src/main.ts',
536
+ 'index.js'
537
+ ];
538
+ return files
539
+ .filter(f => priority.includes(f.path))
540
+ .map(f => f.path)
541
+ .slice(0, 10);
542
+ }
543
+ function getMissingContext(stack, score) {
544
+ const missing = [];
545
+ if (!stack.database && score < 90)
546
+ missing.push('Database');
547
+ if (!stack.testing && score < 90)
548
+ missing.push('Testing framework');
549
+ if (!stack.buildTool && score < 85)
550
+ missing.push('Build tool');
551
+ if (score < 80)
552
+ missing.push('Deployment info');
553
+ if (score < 75)
554
+ missing.push('CI/CD pipeline');
555
+ return missing;
556
+ }
557
+ //# sourceMappingURL=faf-git-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faf-git-generator.js","sourceRoot":"","sources":["../../src/github/faf-git-generator.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,10 @@ export declare function fetchGitHubMetadata(owner: string, repo: string, include
45
45
  * Fetch repository file tree
46
46
  */
47
47
  export declare function fetchGitHubFileTree(owner: string, repo: string, branch?: string, path?: string): Promise<GitHubFile[]>;
48
+ /**
49
+ * Fetch file content from GitHub repository
50
+ */
51
+ export declare function fetchGitHubFileContent(owner: string, repo: string, path: string, branch?: string): Promise<string | null>;
48
52
  /**
49
53
  * Detect framework/stack from repository metadata
50
54
  */
@@ -1 +1 @@
1
- {"version":3,"file":"github-extractor.d.ts","sourceRoot":"","sources":["../../src/github/github-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgDlF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,cAAc,CAAC,CAwFzB;AA4BD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAe,EACvB,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,UAAU,EAAE,CAAC,CA8BvB;AAeD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,EAAE,CAgD1E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAiD1E"}
1
+ {"version":3,"file":"github-extractor.d.ts","sourceRoot":"","sources":["../../src/github/github-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgDlF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,cAAc,CAAC,CAwFzB;AA4BD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAe,EACvB,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,UAAU,EAAE,CAAC,CA8BvB;AAeD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAe,GACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0BxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,EAAE,CAgD1E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAiD1E"}
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.parseGitHubUrl = parseGitHubUrl;
10
10
  exports.fetchGitHubMetadata = fetchGitHubMetadata;
11
11
  exports.fetchGitHubFileTree = fetchGitHubFileTree;
12
+ exports.fetchGitHubFileContent = fetchGitHubFileContent;
12
13
  exports.detectStackFromMetadata = detectStackFromMetadata;
13
14
  exports.calculateRepoQualityScore = calculateRepoQualityScore;
14
15
  /**
@@ -200,6 +201,32 @@ function formatNumber(num) {
200
201
  }
201
202
  return num.toString();
202
203
  }
204
+ /**
205
+ * Fetch file content from GitHub repository
206
+ */
207
+ async function fetchGitHubFileContent(owner, repo, path, branch = 'main') {
208
+ const url = `https://api.github.com/repos/${owner}/${repo}/contents/${path}?ref=${branch}`;
209
+ try {
210
+ const response = await fetch(url, {
211
+ headers: {
212
+ 'Accept': 'application/vnd.github.v3+json',
213
+ 'User-Agent': 'faf-cli'
214
+ }
215
+ });
216
+ if (!response.ok) {
217
+ return null;
218
+ }
219
+ const data = await response.json();
220
+ // GitHub API returns base64-encoded content
221
+ if (data.content && data.encoding === 'base64') {
222
+ return Buffer.from(data.content, 'base64').toString('utf-8');
223
+ }
224
+ return null;
225
+ }
226
+ catch {
227
+ return null;
228
+ }
229
+ }
203
230
  /**
204
231
  * Detect framework/stack from repository metadata
205
232
  */