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.
- package/CHANGELOG.md +32 -0
- package/CLAUDE.md +5 -5
- package/README.md +70 -14
- package/assets/thumbnail.png +0 -0
- package/dist/src/faf-core/commands/agents.d.ts +29 -0
- package/dist/src/faf-core/commands/agents.js +140 -0
- package/dist/src/faf-core/commands/agents.js.map +1 -0
- package/dist/src/faf-core/commands/bi-sync.d.ts +9 -5
- package/dist/src/faf-core/commands/bi-sync.js +89 -85
- package/dist/src/faf-core/commands/bi-sync.js.map +1 -1
- package/dist/src/faf-core/commands/conductor.d.ts +25 -0
- package/dist/src/faf-core/commands/conductor.js +157 -0
- package/dist/src/faf-core/commands/conductor.js.map +1 -0
- package/dist/src/faf-core/commands/cursor.d.ts +29 -0
- package/dist/src/faf-core/commands/cursor.js +134 -0
- package/dist/src/faf-core/commands/cursor.js.map +1 -0
- package/dist/src/faf-core/commands/gemini.d.ts +29 -0
- package/dist/src/faf-core/commands/gemini.js +133 -0
- package/dist/src/faf-core/commands/gemini.js.map +1 -0
- package/dist/src/faf-core/commands/git-context.d.ts +23 -0
- package/dist/src/faf-core/commands/git-context.js +66 -0
- package/dist/src/faf-core/commands/git-context.js.map +1 -0
- package/dist/src/faf-core/commands/human.d.ts +27 -0
- package/dist/src/faf-core/commands/human.js +183 -0
- package/dist/src/faf-core/commands/human.js.map +1 -0
- package/dist/src/faf-core/commands/readme.d.ts +47 -0
- package/dist/src/faf-core/commands/readme.js +361 -0
- package/dist/src/faf-core/commands/readme.js.map +1 -0
- package/dist/src/faf-core/engines/fab-formats-processor.js +3 -3
- package/dist/src/faf-core/engines/fab-formats-processor.js.map +1 -1
- package/dist/src/faf-core/engines/faf-dna.d.ts +1 -1
- package/dist/src/faf-core/engines/faf-dna.js +4 -3
- package/dist/src/faf-core/engines/faf-dna.js.map +1 -1
- package/dist/src/faf-core/generators/faf-generator-championship.js +9 -8
- package/dist/src/faf-core/generators/faf-generator-championship.js.map +1 -1
- package/dist/src/faf-core/parsers/agents-parser.d.ts +59 -0
- package/dist/src/faf-core/parsers/agents-parser.js +324 -0
- package/dist/src/faf-core/parsers/agents-parser.js.map +1 -0
- package/dist/src/faf-core/parsers/conductor-parser.d.ts +85 -0
- package/dist/src/faf-core/parsers/conductor-parser.js +293 -0
- package/dist/src/faf-core/parsers/conductor-parser.js.map +1 -0
- package/dist/src/faf-core/parsers/cursorrules-parser.d.ts +57 -0
- package/dist/src/faf-core/parsers/cursorrules-parser.js +317 -0
- package/dist/src/faf-core/parsers/cursorrules-parser.js.map +1 -0
- package/dist/src/faf-core/parsers/faf-git-generator.d.ts +53 -0
- package/dist/src/faf-core/parsers/faf-git-generator.js +512 -0
- package/dist/src/faf-core/parsers/faf-git-generator.js.map +1 -0
- package/dist/src/faf-core/parsers/gemini-parser.d.ts +57 -0
- package/dist/src/faf-core/parsers/gemini-parser.js +263 -0
- package/dist/src/faf-core/parsers/gemini-parser.js.map +1 -0
- package/dist/src/faf-core/parsers/github-extractor.d.ts +61 -0
- package/dist/src/faf-core/parsers/github-extractor.js +374 -0
- package/dist/src/faf-core/parsers/github-extractor.js.map +1 -0
- package/dist/src/faf-core/parsers/index.d.ts +12 -0
- package/dist/src/{compiler → faf-core/parsers}/index.js +10 -5
- package/dist/src/faf-core/parsers/index.js.map +1 -0
- package/dist/src/faf-core/parsers/slot-counter.d.ts +55 -0
- package/dist/src/faf-core/parsers/slot-counter.js +100 -0
- package/dist/src/faf-core/parsers/slot-counter.js.map +1 -0
- package/dist/src/faf-core/utils/balance-visualizer.js +3 -3
- package/dist/src/faf-core/utils/balance-visualizer.js.map +1 -1
- package/dist/src/handlers/championship-tools.d.ts +10 -5
- package/dist/src/handlers/championship-tools.js +259 -232
- package/dist/src/handlers/championship-tools.js.map +1 -1
- package/dist/src/handlers/engine-adapter.js +238 -5
- package/dist/src/handlers/engine-adapter.js.map +1 -1
- package/dist/src/handlers/tools.d.ts +61 -0
- package/dist/src/handlers/tools.js +2103 -102
- package/dist/src/handlers/tools.js.map +1 -1
- package/dist/src/index.js +0 -0
- package/dist/src/types/tool-visibility.js +51 -10
- package/dist/src/types/tool-visibility.js.map +1 -1
- package/dist/src/utils/championship-format.js +11 -9
- package/dist/src/utils/championship-format.js.map +1 -1
- package/dist/src/utils/path-resolver.js +56 -2
- package/dist/src/utils/path-resolver.js.map +1 -1
- package/dist/src/utils/visual-style.js +7 -5
- package/dist/src/utils/visual-style.js.map +1 -1
- package/dist/src/version.js +24 -11
- package/dist/src/version.js.map +1 -1
- package/package.json +5 -3
- package/project.faf +14 -18
- package/dist/index.json +0 -1
- package/dist/src/compiler/index.d.ts +0 -7
- package/dist/src/compiler/index.js.map +0 -1
- package/dist/src/compiler/scorer.d.ts +0 -53
- package/dist/src/compiler/scorer.js +0 -189
- package/dist/src/compiler/scorer.js.map +0 -1
- package/dist/src/compiler/slot-validator.d.ts +0 -32
- package/dist/src/compiler/slot-validator.js +0 -293
- package/dist/src/compiler/slot-validator.js.map +0 -1
- package/dist/src/compiler/type-detector.d.ts +0 -62
- package/dist/src/compiler/type-detector.js +0 -388
- package/dist/src/compiler/type-detector.js.map +0 -1
- package/dist/src/types/project-types.d.ts +0 -22
- package/dist/src/types/project-types.js +0 -85
- package/dist/src/types/project-types.js.map +0 -1
- package/dist/src/types/slots.d.ts +0 -39
- package/dist/src/types/slots.js +0 -162
- package/dist/src/types/slots.js.map +0 -1
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GEMINI.md Parser
|
|
4
|
+
*
|
|
5
|
+
* Parses Google Gemini CLI GEMINI.md files for bidirectional
|
|
6
|
+
* interoperability with FAF.
|
|
7
|
+
*
|
|
8
|
+
* GEMINI.md Structure:
|
|
9
|
+
* - H1: Project name
|
|
10
|
+
* - H2: Section headers (General Instructions, Coding Style, etc.)
|
|
11
|
+
* - Bullets: Specific guidelines
|
|
12
|
+
*
|
|
13
|
+
* Ported from faf-cli for claude-faf-mcp v4.5.0
|
|
14
|
+
*/
|
|
15
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
16
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.parseGeminiMd = parseGeminiMd;
|
|
20
|
+
exports.geminiImport = geminiImport;
|
|
21
|
+
exports.geminiExport = geminiExport;
|
|
22
|
+
exports.detectGeminiMd = detectGeminiMd;
|
|
23
|
+
exports.detectGlobalGeminiMd = detectGlobalGeminiMd;
|
|
24
|
+
const fs_1 = require("fs");
|
|
25
|
+
const path_1 = __importDefault(require("path"));
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Parsing
|
|
28
|
+
// ============================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Parse GEMINI.md file content
|
|
31
|
+
*/
|
|
32
|
+
function parseGeminiMd(content) {
|
|
33
|
+
const lines = content.split('\n');
|
|
34
|
+
let projectName = 'Unknown Project';
|
|
35
|
+
const sections = [];
|
|
36
|
+
let currentSection = null;
|
|
37
|
+
for (const line of lines) {
|
|
38
|
+
// H1 = Project name
|
|
39
|
+
const h1Match = line.match(/^#\s+(?:Project:\s*)?(.+)$/);
|
|
40
|
+
if (h1Match) {
|
|
41
|
+
projectName = h1Match[1].trim();
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// H2 = Section header
|
|
45
|
+
const h2Match = line.match(/^##\s+(.+)$/);
|
|
46
|
+
if (h2Match) {
|
|
47
|
+
if (currentSection) {
|
|
48
|
+
sections.push(currentSection);
|
|
49
|
+
}
|
|
50
|
+
currentSection = {
|
|
51
|
+
title: h2Match[1].trim(),
|
|
52
|
+
content: [],
|
|
53
|
+
};
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
// Bullet point
|
|
57
|
+
const bulletMatch = line.match(/^[-*]\s+(.+)$/);
|
|
58
|
+
if (bulletMatch && currentSection) {
|
|
59
|
+
currentSection.content.push(bulletMatch[1].trim());
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Push last section
|
|
63
|
+
if (currentSection) {
|
|
64
|
+
sections.push(currentSection);
|
|
65
|
+
}
|
|
66
|
+
return { projectName, sections };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Convert GEMINI.md sections to FAF structure
|
|
70
|
+
*/
|
|
71
|
+
function categorizeSections(sections) {
|
|
72
|
+
const rules = [];
|
|
73
|
+
const guidelines = [];
|
|
74
|
+
const codingStyle = [];
|
|
75
|
+
for (const section of sections) {
|
|
76
|
+
const titleLower = section.title.toLowerCase();
|
|
77
|
+
if (titleLower.includes('coding') || titleLower.includes('style') || titleLower.includes('format')) {
|
|
78
|
+
codingStyle.push(...section.content);
|
|
79
|
+
}
|
|
80
|
+
else if (titleLower.includes('rule') || titleLower.includes('constraint') || titleLower.includes('requirement')) {
|
|
81
|
+
rules.push(...section.content);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Default to guidelines
|
|
85
|
+
guidelines.push(...section.content);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { rules, guidelines, codingStyle };
|
|
89
|
+
}
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// Import: GEMINI.md -> FAF
|
|
92
|
+
// ============================================================================
|
|
93
|
+
async function geminiImport(geminiPath) {
|
|
94
|
+
const warnings = [];
|
|
95
|
+
// Check if file exists
|
|
96
|
+
try {
|
|
97
|
+
await fs_1.promises.access(geminiPath);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return {
|
|
101
|
+
success: false,
|
|
102
|
+
faf: createEmptyFaf(),
|
|
103
|
+
warnings: [`GEMINI.md not found: ${geminiPath}`],
|
|
104
|
+
sectionsFound: [],
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Read and parse
|
|
108
|
+
const content = await fs_1.promises.readFile(geminiPath, 'utf-8');
|
|
109
|
+
const parsed = parseGeminiMd(content);
|
|
110
|
+
if (parsed.sections.length === 0) {
|
|
111
|
+
warnings.push('No sections found in GEMINI.md');
|
|
112
|
+
}
|
|
113
|
+
const { rules, guidelines, codingStyle } = categorizeSections(parsed.sections);
|
|
114
|
+
const faf = {
|
|
115
|
+
project: {
|
|
116
|
+
name: parsed.projectName,
|
|
117
|
+
description: `Imported from GEMINI.md`,
|
|
118
|
+
type: 'gemini-import',
|
|
119
|
+
rules,
|
|
120
|
+
guidelines,
|
|
121
|
+
codingStyle,
|
|
122
|
+
},
|
|
123
|
+
metadata: {
|
|
124
|
+
source: 'gemini',
|
|
125
|
+
imported: new Date().toISOString(),
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
return {
|
|
129
|
+
success: true,
|
|
130
|
+
faf,
|
|
131
|
+
warnings,
|
|
132
|
+
sectionsFound: parsed.sections.map(s => s.title),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function createEmptyFaf() {
|
|
136
|
+
return {
|
|
137
|
+
project: {
|
|
138
|
+
name: 'Unknown',
|
|
139
|
+
description: '',
|
|
140
|
+
type: 'gemini-import',
|
|
141
|
+
rules: [],
|
|
142
|
+
guidelines: [],
|
|
143
|
+
codingStyle: [],
|
|
144
|
+
},
|
|
145
|
+
metadata: {
|
|
146
|
+
source: 'gemini',
|
|
147
|
+
imported: new Date().toISOString(),
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// ============================================================================
|
|
152
|
+
// Export: FAF -> GEMINI.md
|
|
153
|
+
// ============================================================================
|
|
154
|
+
async function geminiExport(fafContent, outputPath) {
|
|
155
|
+
const warnings = [];
|
|
156
|
+
// Build GEMINI.md content
|
|
157
|
+
const lines = [];
|
|
158
|
+
// Project header
|
|
159
|
+
const projectName = fafContent.project?.name || fafContent.name || 'My Project';
|
|
160
|
+
lines.push(`# Project: ${projectName}`);
|
|
161
|
+
lines.push('');
|
|
162
|
+
// Description as intro paragraph if exists
|
|
163
|
+
const description = fafContent.project?.description || fafContent.description;
|
|
164
|
+
if (description) {
|
|
165
|
+
lines.push(description);
|
|
166
|
+
lines.push('');
|
|
167
|
+
}
|
|
168
|
+
// General Instructions section
|
|
169
|
+
const guidelineItems = fafContent.project?.guidelines || fafContent.guidelines || [];
|
|
170
|
+
const ruleItems = fafContent.project?.rules || fafContent.rules || [];
|
|
171
|
+
const generalInstructions = [...guidelineItems, ...ruleItems];
|
|
172
|
+
if (generalInstructions.length > 0) {
|
|
173
|
+
lines.push('## General Instructions');
|
|
174
|
+
lines.push('');
|
|
175
|
+
for (const item of generalInstructions) {
|
|
176
|
+
lines.push(`- ${item}`);
|
|
177
|
+
}
|
|
178
|
+
lines.push('');
|
|
179
|
+
}
|
|
180
|
+
// Coding Style section
|
|
181
|
+
const codingStyleItems = fafContent.project?.codingStyle || fafContent.codingStyle || [];
|
|
182
|
+
const stack = fafContent.project?.stack || {};
|
|
183
|
+
// Add languages/frameworks to coding style context
|
|
184
|
+
const styleItems = [...codingStyleItems];
|
|
185
|
+
if (stack.languages?.length > 0) {
|
|
186
|
+
styleItems.push(`Languages: ${stack.languages.join(', ')}`);
|
|
187
|
+
}
|
|
188
|
+
if (stack.frameworks?.length > 0) {
|
|
189
|
+
styleItems.push(`Frameworks: ${stack.frameworks.join(', ')}`);
|
|
190
|
+
}
|
|
191
|
+
if (styleItems.length > 0) {
|
|
192
|
+
lines.push('## Coding Style');
|
|
193
|
+
lines.push('');
|
|
194
|
+
for (const item of styleItems) {
|
|
195
|
+
lines.push(`- ${item}`);
|
|
196
|
+
}
|
|
197
|
+
lines.push('');
|
|
198
|
+
}
|
|
199
|
+
// Tech Stack section (if detailed)
|
|
200
|
+
if (stack.databases?.length > 0 || stack.infrastructure?.length > 0) {
|
|
201
|
+
lines.push('## Tech Stack');
|
|
202
|
+
lines.push('');
|
|
203
|
+
if (stack.databases?.length > 0) {
|
|
204
|
+
lines.push(`- Databases: ${stack.databases.join(', ')}`);
|
|
205
|
+
}
|
|
206
|
+
if (stack.infrastructure?.length > 0) {
|
|
207
|
+
lines.push(`- Infrastructure: ${stack.infrastructure.join(', ')}`);
|
|
208
|
+
}
|
|
209
|
+
lines.push('');
|
|
210
|
+
}
|
|
211
|
+
// Goals section
|
|
212
|
+
const goals = fafContent.project?.goals || [];
|
|
213
|
+
if (goals.length > 0) {
|
|
214
|
+
lines.push('## Project Goals');
|
|
215
|
+
lines.push('');
|
|
216
|
+
for (const goal of goals) {
|
|
217
|
+
lines.push(`- ${goal}`);
|
|
218
|
+
}
|
|
219
|
+
lines.push('');
|
|
220
|
+
}
|
|
221
|
+
// Write file
|
|
222
|
+
const content = lines.join('\n');
|
|
223
|
+
await fs_1.promises.writeFile(outputPath, content);
|
|
224
|
+
return {
|
|
225
|
+
success: true,
|
|
226
|
+
filePath: outputPath,
|
|
227
|
+
warnings,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// ============================================================================
|
|
231
|
+
// Detection
|
|
232
|
+
// ============================================================================
|
|
233
|
+
async function detectGeminiMd(basePath) {
|
|
234
|
+
const possiblePaths = [
|
|
235
|
+
path_1.default.join(basePath, 'GEMINI.md'),
|
|
236
|
+
path_1.default.join(basePath, 'gemini.md'),
|
|
237
|
+
];
|
|
238
|
+
for (const p of possiblePaths) {
|
|
239
|
+
try {
|
|
240
|
+
await fs_1.promises.access(p);
|
|
241
|
+
return p;
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Check for global GEMINI.md
|
|
251
|
+
*/
|
|
252
|
+
async function detectGlobalGeminiMd() {
|
|
253
|
+
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
254
|
+
const globalPath = path_1.default.join(home, '.gemini', 'GEMINI.md');
|
|
255
|
+
try {
|
|
256
|
+
await fs_1.promises.access(globalPath);
|
|
257
|
+
return globalPath;
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=gemini-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-parser.js","sourceRoot":"","sources":["../../../../src/faf-core/parsers/gemini-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Repository Metadata Extractor
|
|
3
|
+
*
|
|
4
|
+
* Fetches rich metadata from GitHub repos without cloning.
|
|
5
|
+
* Uses GitHub API v3 (no auth needed for public repos, 60 req/hr limit).
|
|
6
|
+
*
|
|
7
|
+
* Ported from faf-cli for claude-faf-mcp v4.5.0
|
|
8
|
+
*/
|
|
9
|
+
export interface GitHubMetadata {
|
|
10
|
+
owner: string;
|
|
11
|
+
repo: string;
|
|
12
|
+
url: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
topics?: string[];
|
|
15
|
+
stars?: string;
|
|
16
|
+
forks?: string;
|
|
17
|
+
license?: string;
|
|
18
|
+
languages?: string[];
|
|
19
|
+
lastUpdated?: string;
|
|
20
|
+
defaultBranch?: string;
|
|
21
|
+
openIssues?: number;
|
|
22
|
+
watchers?: number;
|
|
23
|
+
readme?: boolean;
|
|
24
|
+
hasPackageJson?: boolean;
|
|
25
|
+
hasTsConfig?: boolean;
|
|
26
|
+
hasDockerfile?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface GitHubFile {
|
|
29
|
+
path: string;
|
|
30
|
+
type: 'file' | 'dir';
|
|
31
|
+
size?: number;
|
|
32
|
+
url?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parse GitHub URL to extract owner and repo
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseGitHubUrl(url: string): {
|
|
38
|
+
owner: string;
|
|
39
|
+
repo: string;
|
|
40
|
+
} | null;
|
|
41
|
+
/**
|
|
42
|
+
* Fetch repository metadata from GitHub API
|
|
43
|
+
* (No auth required for public repos, 60 requests/hour limit)
|
|
44
|
+
*/
|
|
45
|
+
export declare function fetchGitHubMetadata(owner: string, repo: string, includeFiles?: boolean): Promise<GitHubMetadata>;
|
|
46
|
+
/**
|
|
47
|
+
* Fetch repository file tree
|
|
48
|
+
*/
|
|
49
|
+
export declare function fetchGitHubFileTree(owner: string, repo: string, branch?: string, treePath?: string): Promise<GitHubFile[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Fetch file content from GitHub repository
|
|
52
|
+
*/
|
|
53
|
+
export declare function fetchGitHubFileContent(owner: string, repo: string, filePath: string, branch?: string): Promise<string | null>;
|
|
54
|
+
/**
|
|
55
|
+
* Detect framework/stack from repository metadata
|
|
56
|
+
*/
|
|
57
|
+
export declare function detectStackFromMetadata(metadata: GitHubMetadata): string[];
|
|
58
|
+
/**
|
|
59
|
+
* Generate quality score based on metadata
|
|
60
|
+
*/
|
|
61
|
+
export declare function calculateRepoQualityScore(metadata: GitHubMetadata): number;
|