faf-mcp 1.3.1 → 2.0.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.
Files changed (100) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/CLAUDE.md +5 -5
  3. package/README.md +70 -14
  4. package/assets/thumbnail.png +0 -0
  5. package/dist/src/faf-core/commands/agents.d.ts +29 -0
  6. package/dist/src/faf-core/commands/agents.js +140 -0
  7. package/dist/src/faf-core/commands/agents.js.map +1 -0
  8. package/dist/src/faf-core/commands/bi-sync.d.ts +9 -5
  9. package/dist/src/faf-core/commands/bi-sync.js +89 -85
  10. package/dist/src/faf-core/commands/bi-sync.js.map +1 -1
  11. package/dist/src/faf-core/commands/conductor.d.ts +25 -0
  12. package/dist/src/faf-core/commands/conductor.js +157 -0
  13. package/dist/src/faf-core/commands/conductor.js.map +1 -0
  14. package/dist/src/faf-core/commands/cursor.d.ts +29 -0
  15. package/dist/src/faf-core/commands/cursor.js +134 -0
  16. package/dist/src/faf-core/commands/cursor.js.map +1 -0
  17. package/dist/src/faf-core/commands/gemini.d.ts +29 -0
  18. package/dist/src/faf-core/commands/gemini.js +133 -0
  19. package/dist/src/faf-core/commands/gemini.js.map +1 -0
  20. package/dist/src/faf-core/commands/git-context.d.ts +23 -0
  21. package/dist/src/faf-core/commands/git-context.js +66 -0
  22. package/dist/src/faf-core/commands/git-context.js.map +1 -0
  23. package/dist/src/faf-core/commands/human.d.ts +27 -0
  24. package/dist/src/faf-core/commands/human.js +183 -0
  25. package/dist/src/faf-core/commands/human.js.map +1 -0
  26. package/dist/src/faf-core/commands/readme.d.ts +47 -0
  27. package/dist/src/faf-core/commands/readme.js +361 -0
  28. package/dist/src/faf-core/commands/readme.js.map +1 -0
  29. package/dist/src/faf-core/engines/fab-formats-processor.js +3 -3
  30. package/dist/src/faf-core/engines/fab-formats-processor.js.map +1 -1
  31. package/dist/src/faf-core/engines/faf-dna.d.ts +1 -1
  32. package/dist/src/faf-core/engines/faf-dna.js +4 -3
  33. package/dist/src/faf-core/engines/faf-dna.js.map +1 -1
  34. package/dist/src/faf-core/generators/faf-generator-championship.js +9 -8
  35. package/dist/src/faf-core/generators/faf-generator-championship.js.map +1 -1
  36. package/dist/src/faf-core/parsers/agents-parser.d.ts +59 -0
  37. package/dist/src/faf-core/parsers/agents-parser.js +324 -0
  38. package/dist/src/faf-core/parsers/agents-parser.js.map +1 -0
  39. package/dist/src/faf-core/parsers/conductor-parser.d.ts +85 -0
  40. package/dist/src/faf-core/parsers/conductor-parser.js +293 -0
  41. package/dist/src/faf-core/parsers/conductor-parser.js.map +1 -0
  42. package/dist/src/faf-core/parsers/cursorrules-parser.d.ts +57 -0
  43. package/dist/src/faf-core/parsers/cursorrules-parser.js +317 -0
  44. package/dist/src/faf-core/parsers/cursorrules-parser.js.map +1 -0
  45. package/dist/src/faf-core/parsers/faf-git-generator.d.ts +53 -0
  46. package/dist/src/faf-core/parsers/faf-git-generator.js +512 -0
  47. package/dist/src/faf-core/parsers/faf-git-generator.js.map +1 -0
  48. package/dist/src/faf-core/parsers/gemini-parser.d.ts +57 -0
  49. package/dist/src/faf-core/parsers/gemini-parser.js +263 -0
  50. package/dist/src/faf-core/parsers/gemini-parser.js.map +1 -0
  51. package/dist/src/faf-core/parsers/github-extractor.d.ts +61 -0
  52. package/dist/src/faf-core/parsers/github-extractor.js +374 -0
  53. package/dist/src/faf-core/parsers/github-extractor.js.map +1 -0
  54. package/dist/src/faf-core/parsers/index.d.ts +12 -0
  55. package/dist/src/{compiler → faf-core/parsers}/index.js +10 -5
  56. package/dist/src/faf-core/parsers/index.js.map +1 -0
  57. package/dist/src/faf-core/parsers/slot-counter.d.ts +55 -0
  58. package/dist/src/faf-core/parsers/slot-counter.js +100 -0
  59. package/dist/src/faf-core/parsers/slot-counter.js.map +1 -0
  60. package/dist/src/faf-core/utils/balance-visualizer.js +3 -3
  61. package/dist/src/faf-core/utils/balance-visualizer.js.map +1 -1
  62. package/dist/src/handlers/championship-tools.d.ts +10 -5
  63. package/dist/src/handlers/championship-tools.js +259 -232
  64. package/dist/src/handlers/championship-tools.js.map +1 -1
  65. package/dist/src/handlers/engine-adapter.js +238 -5
  66. package/dist/src/handlers/engine-adapter.js.map +1 -1
  67. package/dist/src/handlers/tools.d.ts +61 -0
  68. package/dist/src/handlers/tools.js +2103 -102
  69. package/dist/src/handlers/tools.js.map +1 -1
  70. package/dist/src/index.js +0 -0
  71. package/dist/src/types/tool-visibility.js +51 -10
  72. package/dist/src/types/tool-visibility.js.map +1 -1
  73. package/dist/src/utils/championship-format.js +11 -9
  74. package/dist/src/utils/championship-format.js.map +1 -1
  75. package/dist/src/utils/path-resolver.js +56 -2
  76. package/dist/src/utils/path-resolver.js.map +1 -1
  77. package/dist/src/utils/visual-style.js +7 -5
  78. package/dist/src/utils/visual-style.js.map +1 -1
  79. package/dist/src/version.js +24 -11
  80. package/dist/src/version.js.map +1 -1
  81. package/package.json +5 -3
  82. package/project.faf +14 -18
  83. package/dist/index.json +0 -1
  84. package/dist/src/compiler/index.d.ts +0 -7
  85. package/dist/src/compiler/index.js.map +0 -1
  86. package/dist/src/compiler/scorer.d.ts +0 -53
  87. package/dist/src/compiler/scorer.js +0 -189
  88. package/dist/src/compiler/scorer.js.map +0 -1
  89. package/dist/src/compiler/slot-validator.d.ts +0 -32
  90. package/dist/src/compiler/slot-validator.js +0 -293
  91. package/dist/src/compiler/slot-validator.js.map +0 -1
  92. package/dist/src/compiler/type-detector.d.ts +0 -62
  93. package/dist/src/compiler/type-detector.js +0 -388
  94. package/dist/src/compiler/type-detector.js.map +0 -1
  95. package/dist/src/types/project-types.d.ts +0 -22
  96. package/dist/src/types/project-types.js +0 -85
  97. package/dist/src/types/project-types.js.map +0 -1
  98. package/dist/src/types/slots.d.ts +0 -39
  99. package/dist/src/types/slots.js +0 -162
  100. package/dist/src/types/slots.js.map +0 -1
@@ -0,0 +1,512 @@
1
+ "use strict";
2
+ /**
3
+ * FAF Generation for `faf git`
4
+ *
5
+ * Generates clean, accurate .faf files from GitHub repos without cloning.
6
+ * Output is compact and PR-ready — every line adds value.
7
+ *
8
+ * Ported from faf-cli for claude-faf-mcp v4.5.0
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.extract6WsFromReadme = extract6WsFromReadme;
12
+ exports.extractFromLanguages = extractFromLanguages;
13
+ exports.analyzePackageJson = analyzePackageJson;
14
+ exports.generateEnhancedFaf = generateEnhancedFaf;
15
+ exports.getScoreTier = getScoreTier;
16
+ const github_extractor_js_1 = require("./github-extractor.js");
17
+ const slot_counter_js_1 = require("./slot-counter.js");
18
+ const yaml_js_1 = require("../fix-once/yaml.js");
19
+ // Default sentinel values — if unchanged, we omit from output
20
+ const DEFAULT_WHO = 'Open source contributors';
21
+ const DEFAULT_WHY = '';
22
+ const DEFAULT_HOW = 'See README for usage';
23
+ /**
24
+ * Extract 6 Ws from README content
25
+ */
26
+ function extract6WsFromReadme(readme, metadata) {
27
+ const result = {
28
+ who: DEFAULT_WHO,
29
+ what: metadata.description || 'Software project',
30
+ why: '',
31
+ where: 'GitHub',
32
+ when: 'Active',
33
+ how: DEFAULT_HOW,
34
+ confidence: 40
35
+ };
36
+ let confidenceBoost = 0;
37
+ // === WHAT: Extract from README patterns ===
38
+ // Pattern 1: Bold subtitle after H1
39
+ const boldSubtitleMatch = readme.match(/^#\s+[^\n]+\n+\*\*([^*]+)\*\*/m);
40
+ if (boldSubtitleMatch?.[1]) {
41
+ const extracted = cleanText(boldSubtitleMatch[1]);
42
+ if (extracted.length > 10 && extracted.length < 150) {
43
+ result.what = extracted;
44
+ confidenceBoost += 15;
45
+ }
46
+ }
47
+ // Pattern 2: First descriptive paragraph
48
+ if (!boldSubtitleMatch) {
49
+ const firstParaMatch = readme.match(/^#\s+[^\n]+\n+([A-Z][^#\n`*|]{30,200})/m);
50
+ if (firstParaMatch?.[1]) {
51
+ result.what = cleanText(firstParaMatch[1]);
52
+ confidenceBoost += 10;
53
+ }
54
+ }
55
+ // === WHY: Problem/motivation ===
56
+ const whyPatterns = [
57
+ /\*\*Problem:\*\*\s*([^\n]+)/i,
58
+ /##\s*Why[^#\n]*\n+([\s\S]{20,200})(?=\n##|$)/i,
59
+ /(\d+\s*(?:seconds?|minutes?|hours?)\s+(?:replaces?|vs)[^.\n]+)/i
60
+ ];
61
+ for (const pattern of whyPatterns) {
62
+ const match = readme.match(pattern);
63
+ if (match?.[1]) {
64
+ result.why = cleanText(match[1]);
65
+ confidenceBoost += 10;
66
+ break;
67
+ }
68
+ }
69
+ // === WHO: Target audience ===
70
+ const whoPatterns = [
71
+ /##\s*(?:Who|Target Audience)[^#\n]*\n+([\s\S]{10,150})(?=\n##|$)/i,
72
+ /(?:Built for|Designed for|Perfect for)\s+([^.\n]{15,100})/i
73
+ ];
74
+ for (const pattern of whoPatterns) {
75
+ const match = readme.match(pattern);
76
+ if (match?.[1]) {
77
+ const extracted = cleanText(match[1]);
78
+ // Only use if it looks like a real audience description
79
+ if (extracted.length >= 15 && extracted.length <= 120
80
+ && !extracted.includes(':') && !extracted.endsWith('|')
81
+ && !extracted.includes('```') && !extracted.includes('[')) {
82
+ result.who = extracted;
83
+ confidenceBoost += 10;
84
+ }
85
+ break;
86
+ }
87
+ }
88
+ // === HOW: Installation/usage (language-aware) ===
89
+ if (readme.includes('pip install') || readme.includes('pip3 install')) {
90
+ result.how = 'pip install (see README)';
91
+ confidenceBoost += 5;
92
+ }
93
+ else if (readme.includes('cargo install') || readme.includes('cargo add')) {
94
+ result.how = 'cargo install (see README)';
95
+ confidenceBoost += 5;
96
+ }
97
+ else if (readme.includes('go install') || readme.includes('go get')) {
98
+ result.how = 'go install (see README)';
99
+ confidenceBoost += 5;
100
+ }
101
+ else if (readme.includes('npm install') || readme.includes('npx ') || readme.includes('yarn add')) {
102
+ result.how = 'npm install (see README)';
103
+ confidenceBoost += 5;
104
+ }
105
+ else if (readme.includes('brew install')) {
106
+ result.how = 'brew install (see README)';
107
+ confidenceBoost += 5;
108
+ }
109
+ else if (readme.includes('docker pull') || readme.includes('docker run')) {
110
+ result.how = 'Docker (see README)';
111
+ confidenceBoost += 5;
112
+ }
113
+ else if (readme.match(/##\s*(Quick Start|Getting Started|Installation)/i)) {
114
+ result.how = 'See Getting Started in README';
115
+ confidenceBoost += 5;
116
+ }
117
+ result.confidence = Math.min(100, result.confidence + confidenceBoost);
118
+ return result;
119
+ }
120
+ /**
121
+ * Extract stack from GitHub API languages array (source of truth)
122
+ * Languages are sorted by percentage descending — first entry is primary.
123
+ */
124
+ function extractFromLanguages(metadata) {
125
+ const analysis = {
126
+ frameworks: []
127
+ };
128
+ if (!metadata.languages || metadata.languages.length === 0) {
129
+ return analysis;
130
+ }
131
+ // Use PRIMARY language (highest percentage, first in sorted array)
132
+ const primaryLangName = metadata.languages[0]?.split(' ')[0];
133
+ const langRuntimeMap = {
134
+ 'C++': { language: 'C++', runtime: 'C++' },
135
+ 'Rust': { language: 'Rust', runtime: 'Rust' },
136
+ 'Go': { language: 'Go', runtime: 'Go' },
137
+ 'Python': { language: 'Python', runtime: 'Python' },
138
+ 'Java': { language: 'Java', runtime: 'JVM' },
139
+ 'C': { language: 'C', runtime: 'C' },
140
+ 'TypeScript': { language: 'TypeScript', runtime: 'Node.js' },
141
+ 'JavaScript': { language: 'JavaScript', runtime: 'Node.js' },
142
+ 'Ruby': { language: 'Ruby', runtime: 'Ruby' },
143
+ 'Swift': { language: 'Swift', runtime: 'Swift' },
144
+ 'Kotlin': { language: 'Kotlin', runtime: 'JVM' },
145
+ 'Zig': { language: 'Zig', runtime: 'Zig' },
146
+ 'Lua': { language: 'Lua', runtime: 'Lua' },
147
+ 'Dart': { language: 'Dart', runtime: 'Dart' },
148
+ 'PHP': { language: 'PHP', runtime: 'PHP' },
149
+ 'Scala': { language: 'Scala', runtime: 'JVM' },
150
+ 'Elixir': { language: 'Elixir', runtime: 'BEAM' },
151
+ 'Haskell': { language: 'Haskell', runtime: 'GHC' },
152
+ };
153
+ if (primaryLangName && langRuntimeMap[primaryLangName]) {
154
+ const match = langRuntimeMap[primaryLangName];
155
+ analysis.language = match.language;
156
+ analysis.runtime = match.runtime;
157
+ }
158
+ // Build system + Docker detection from all languages
159
+ const allLangs = metadata.languages.map(l => l.split(' ')[0].toLowerCase());
160
+ if (allLangs.includes('cmake')) {
161
+ analysis.buildTool = 'CMake';
162
+ }
163
+ else if (allLangs.includes('makefile')) {
164
+ analysis.buildTool = 'Make';
165
+ }
166
+ else if (allLangs.includes('gradle')) {
167
+ analysis.buildTool = 'Gradle';
168
+ }
169
+ else if (allLangs.includes('maven')) {
170
+ analysis.buildTool = 'Maven';
171
+ }
172
+ if (allLangs.includes('dockerfile')) {
173
+ analysis.hosting = 'Docker';
174
+ }
175
+ return analysis;
176
+ }
177
+ /**
178
+ * Analyze package.json for npm ecosystem details
179
+ */
180
+ function analyzePackageJson(packageJson, _metadata) {
181
+ const analysis = {
182
+ frameworks: []
183
+ };
184
+ const deps = {
185
+ ...packageJson.dependencies,
186
+ ...packageJson.devDependencies
187
+ };
188
+ // Frontend
189
+ if (deps.react) {
190
+ analysis.frontend = 'React';
191
+ }
192
+ else if (deps.vue) {
193
+ analysis.frontend = 'Vue';
194
+ }
195
+ else if (deps.svelte) {
196
+ analysis.frontend = 'Svelte';
197
+ }
198
+ else if (deps['@angular/core']) {
199
+ analysis.frontend = 'Angular';
200
+ }
201
+ else if (deps.next) {
202
+ analysis.frontend = 'Next.js';
203
+ }
204
+ // Backend
205
+ if (deps.express) {
206
+ analysis.backend = 'Express';
207
+ }
208
+ else if (deps.fastify) {
209
+ analysis.backend = 'Fastify';
210
+ }
211
+ else if (deps.koa) {
212
+ analysis.backend = 'Koa';
213
+ }
214
+ else if (deps['@nestjs/core']) {
215
+ analysis.backend = 'NestJS';
216
+ }
217
+ // Database
218
+ if (deps.mongoose) {
219
+ analysis.database = 'MongoDB';
220
+ }
221
+ else if (deps.pg || deps.postgres) {
222
+ analysis.database = 'PostgreSQL';
223
+ }
224
+ else if (deps.mysql || deps.mysql2) {
225
+ analysis.database = 'MySQL';
226
+ }
227
+ else if (deps.sqlite3 || deps['better-sqlite3']) {
228
+ analysis.database = 'SQLite';
229
+ }
230
+ else if (deps.redis) {
231
+ analysis.database = 'Redis';
232
+ }
233
+ // Testing
234
+ if (deps.jest) {
235
+ analysis.testing = 'Jest';
236
+ }
237
+ else if (deps.vitest) {
238
+ analysis.testing = 'Vitest';
239
+ }
240
+ else if (deps.mocha) {
241
+ analysis.testing = 'Mocha';
242
+ }
243
+ // Build tools
244
+ if (deps.vite) {
245
+ analysis.buildTool = 'Vite';
246
+ }
247
+ else if (deps.webpack) {
248
+ analysis.buildTool = 'Webpack';
249
+ }
250
+ else if (deps.rollup) {
251
+ analysis.buildTool = 'Rollup';
252
+ }
253
+ else if (deps.esbuild) {
254
+ analysis.buildTool = 'esbuild';
255
+ }
256
+ else if (deps.turbo) {
257
+ analysis.buildTool = 'Turborepo';
258
+ }
259
+ // Collect frameworks
260
+ if (analysis.frontend) {
261
+ analysis.frameworks.push(analysis.frontend);
262
+ }
263
+ if (analysis.backend) {
264
+ analysis.frameworks.push(analysis.backend);
265
+ }
266
+ return analysis;
267
+ }
268
+ /**
269
+ * Generate clean .faf file from GitHub repo metadata
270
+ */
271
+ async function generateEnhancedFaf(metadata, _files) {
272
+ // Fetch README.md
273
+ const readme = await (0, github_extractor_js_1.fetchGitHubFileContent)(metadata.owner, metadata.repo, 'README.md', metadata.defaultBranch);
274
+ // Fetch package.json
275
+ let packageJsonContent = null;
276
+ const packageJsonRaw = await (0, github_extractor_js_1.fetchGitHubFileContent)(metadata.owner, metadata.repo, 'package.json', metadata.defaultBranch);
277
+ if (packageJsonRaw) {
278
+ try {
279
+ packageJsonContent = JSON.parse(packageJsonRaw);
280
+ }
281
+ catch {
282
+ // Invalid JSON
283
+ }
284
+ }
285
+ // Extract 6 Ws from README
286
+ const sixWs = readme
287
+ ? extract6WsFromReadme(readme, metadata)
288
+ : {
289
+ who: DEFAULT_WHO,
290
+ what: metadata.description || 'Software project',
291
+ why: '',
292
+ where: 'GitHub',
293
+ when: 'Active',
294
+ how: DEFAULT_HOW,
295
+ confidence: 25
296
+ };
297
+ // Extract stack from GitHub API languages (source of truth)
298
+ const langStack = extractFromLanguages(metadata);
299
+ // Analyze stack from package.json (adds npm-specific detail)
300
+ const npmStack = packageJsonContent
301
+ ? analyzePackageJson(packageJsonContent, metadata)
302
+ : { frameworks: [] };
303
+ // Merge: npm takes priority for fields it detects (more specific)
304
+ const stackAnalysis = { ...langStack, ...npmStack, frameworks: npmStack.frameworks || [] };
305
+ // Determine main language
306
+ const mainLanguage = stackAnalysis.language
307
+ || metadata.languages?.[0]?.split(' ')[0]
308
+ || null;
309
+ // Determine project type
310
+ const projectType = determineProjectType(metadata, stackAnalysis, packageJsonContent);
311
+ // Calculate score internally for display (slot-counting)
312
+ const slotCount = (0, slot_counter_js_1.countSlots)({
313
+ projectName: metadata.repo,
314
+ projectGoal: metadata.description || null,
315
+ mainLanguage: mainLanguage || 'Unknown',
316
+ projectType: projectType,
317
+ who: sixWs.who,
318
+ what: sixWs.what,
319
+ why: sixWs.why || 'slotignored',
320
+ where: sixWs.where,
321
+ when: sixWs.when,
322
+ how: sixWs.how,
323
+ frontend: stackAnalysis.frontend || 'slotignored',
324
+ uiLibrary: 'slotignored',
325
+ backend: stackAnalysis.backend || 'slotignored',
326
+ runtime: stackAnalysis.runtime || 'slotignored',
327
+ database: stackAnalysis.database || 'slotignored',
328
+ build: stackAnalysis.buildTool || 'slotignored',
329
+ packageManager: packageJsonContent ? 'npm' : 'slotignored',
330
+ apiType: 'slotignored',
331
+ hosting: stackAnalysis.hosting || 'slotignored',
332
+ cicd: 'slotignored',
333
+ cssFramework: 'slotignored'
334
+ });
335
+ const score = slotCount.score;
336
+ // === Build clean .faf output ===
337
+ // Project section
338
+ const project = {
339
+ name: metadata.repo,
340
+ };
341
+ if (metadata.description) {
342
+ project.description = metadata.description;
343
+ }
344
+ if (mainLanguage) {
345
+ project.language = mainLanguage;
346
+ }
347
+ project.type = projectType;
348
+ if (metadata.license && metadata.license !== 'NOASSERTION') {
349
+ project.license = metadata.license;
350
+ }
351
+ // Metadata section
352
+ const metadataSection = {
353
+ repository: metadata.url,
354
+ owner: metadata.owner,
355
+ };
356
+ if (metadata.stars && metadata.stars !== '0') {
357
+ metadataSection.stars = metadata.stars;
358
+ }
359
+ if (metadata.forks && metadata.forks !== '0') {
360
+ metadataSection.forks = metadata.forks;
361
+ }
362
+ if (metadata.topics && metadata.topics.length > 0) {
363
+ metadataSection.topics = metadata.topics;
364
+ }
365
+ if (metadata.languages && metadata.languages.length > 0) {
366
+ // Top 6 languages
367
+ metadataSection.languages = metadata.languages.slice(0, 6);
368
+ }
369
+ metadataSection.default_branch = metadata.defaultBranch || 'main';
370
+ // Stack section — only populated fields, no slotignored
371
+ const stack = {};
372
+ if (stackAnalysis.frontend) {
373
+ stack.frontend = stackAnalysis.frontend;
374
+ }
375
+ if (stackAnalysis.backend) {
376
+ stack.backend = stackAnalysis.backend;
377
+ }
378
+ if (stackAnalysis.runtime && stackAnalysis.runtime !== mainLanguage) {
379
+ stack.runtime = stackAnalysis.runtime;
380
+ }
381
+ if (stackAnalysis.database) {
382
+ stack.database = stackAnalysis.database;
383
+ }
384
+ if (stackAnalysis.buildTool) {
385
+ stack.build = stackAnalysis.buildTool;
386
+ }
387
+ if (stackAnalysis.testing) {
388
+ stack.testing = stackAnalysis.testing;
389
+ }
390
+ if (packageJsonContent) {
391
+ stack.package_manager = 'npm';
392
+ }
393
+ if (stackAnalysis.hosting) {
394
+ stack.hosting = stackAnalysis.hosting;
395
+ }
396
+ // Context section — only non-default, actually extracted values
397
+ const context = {};
398
+ if (sixWs.what && sixWs.what !== metadata.description) {
399
+ context.what = sixWs.what;
400
+ }
401
+ if (sixWs.who && sixWs.who !== DEFAULT_WHO) {
402
+ context.who = sixWs.who;
403
+ }
404
+ if (sixWs.why) {
405
+ context.why = sixWs.why;
406
+ }
407
+ if (sixWs.how && sixWs.how !== DEFAULT_HOW) {
408
+ context.how = sixWs.how;
409
+ }
410
+ // Assemble the data
411
+ const fafData = {
412
+ faf_version: '2.5.0',
413
+ project,
414
+ metadata: metadataSection,
415
+ };
416
+ if (Object.keys(stack).length > 0) {
417
+ fafData.stack = stack;
418
+ }
419
+ if (Object.keys(context).length > 0) {
420
+ fafData.context = context;
421
+ }
422
+ fafData.generated_by = {
423
+ tool: 'claude-faf-mcp',
424
+ version: '4.5.0',
425
+ command: `faf git ${metadata.owner}/${metadata.repo}`,
426
+ };
427
+ // Convert to YAML
428
+ const yamlContent = (0, yaml_js_1.stringify)(fafData);
429
+ // Clean, informative header
430
+ const header = `# project.faf — Machine-readable project context for AI tools
431
+ # ${metadata.url}
432
+ # Spec: https://faf.dev | MIME: application/vnd.faf+yaml
433
+ # Generated: faf git ${metadata.owner}/${metadata.repo}
434
+
435
+ `;
436
+ return {
437
+ content: header + yamlContent,
438
+ score
439
+ };
440
+ }
441
+ // === Helper functions ===
442
+ function cleanText(text) {
443
+ return text
444
+ .replace(/\*\*/g, '')
445
+ .replace(/\n+/g, ' ')
446
+ .trim();
447
+ }
448
+ /**
449
+ * Score tier for display (not written to file)
450
+ */
451
+ function getScoreTier(score) {
452
+ if (score >= 100) {
453
+ return 'Trophy';
454
+ }
455
+ if (score >= 99) {
456
+ return 'Gold';
457
+ }
458
+ if (score >= 95) {
459
+ return 'Silver';
460
+ }
461
+ if (score >= 85) {
462
+ return 'Bronze';
463
+ }
464
+ if (score >= 70) {
465
+ return 'Green';
466
+ }
467
+ if (score >= 55) {
468
+ return 'Yellow';
469
+ }
470
+ if (score > 0) {
471
+ return 'Red';
472
+ }
473
+ return 'White';
474
+ }
475
+ function determineProjectType(metadata, stack, packageJson) {
476
+ // CLI tools
477
+ if (packageJson?.bin) {
478
+ return 'cli';
479
+ }
480
+ // Detect from topics
481
+ const topics = (metadata.topics || []).map(t => t.toLowerCase());
482
+ if (topics.includes('framework') || topics.includes('library')) {
483
+ return 'library';
484
+ }
485
+ // Language/runtime repos
486
+ const languageRepos = ['cpython', 'rust', 'go', 'swift', 'deno', 'bun', 'node'];
487
+ if (languageRepos.includes(metadata.repo.toLowerCase())) {
488
+ return 'runtime';
489
+ }
490
+ // Full-stack / frontend / backend
491
+ if (stack.frontend && stack.backend) {
492
+ return 'full-stack';
493
+ }
494
+ if (stack.frontend) {
495
+ return 'frontend';
496
+ }
497
+ if (stack.backend) {
498
+ return 'backend';
499
+ }
500
+ if (stack.database) {
501
+ return 'database';
502
+ }
503
+ // Library detection
504
+ if (packageJson?.name?.includes('lib') || packageJson?.name?.includes('sdk')) {
505
+ return 'library';
506
+ }
507
+ if (topics.includes('sdk') || topics.includes('api')) {
508
+ return 'library';
509
+ }
510
+ return 'application';
511
+ }
512
+ //# sourceMappingURL=faf-git-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faf-git-generator.js","sourceRoot":"","sources":["../../../../src/faf-core/parsers/faf-git-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * GEMINI.md Parser
3
+ *
4
+ * Parses Google Gemini CLI GEMINI.md files for bidirectional
5
+ * interoperability with FAF.
6
+ *
7
+ * GEMINI.md Structure:
8
+ * - H1: Project name
9
+ * - H2: Section headers (General Instructions, Coding Style, etc.)
10
+ * - Bullets: Specific guidelines
11
+ *
12
+ * Ported from faf-cli for claude-faf-mcp v4.5.0
13
+ */
14
+ export interface GeminiMdSection {
15
+ title: string;
16
+ content: string[];
17
+ }
18
+ export interface GeminiMdFile {
19
+ projectName: string;
20
+ sections: GeminiMdSection[];
21
+ }
22
+ export interface FafFromGemini {
23
+ project: {
24
+ name: string;
25
+ description: string;
26
+ type: string;
27
+ rules: string[];
28
+ guidelines: string[];
29
+ codingStyle: string[];
30
+ };
31
+ metadata: {
32
+ source: string;
33
+ imported: string;
34
+ };
35
+ }
36
+ export interface GeminiImportResult {
37
+ success: boolean;
38
+ faf: FafFromGemini;
39
+ warnings: string[];
40
+ sectionsFound: string[];
41
+ }
42
+ export interface GeminiExportResult {
43
+ success: boolean;
44
+ filePath: string;
45
+ warnings: string[];
46
+ }
47
+ /**
48
+ * Parse GEMINI.md file content
49
+ */
50
+ export declare function parseGeminiMd(content: string): GeminiMdFile;
51
+ export declare function geminiImport(geminiPath: string): Promise<GeminiImportResult>;
52
+ export declare function geminiExport(fafContent: any, outputPath: string): Promise<GeminiExportResult>;
53
+ export declare function detectGeminiMd(basePath: string): Promise<string | null>;
54
+ /**
55
+ * Check for global GEMINI.md
56
+ */
57
+ export declare function detectGlobalGeminiMd(): Promise<string | null>;