claude-faf-mcp 3.0.2 → 3.0.4
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/.faf +10 -0
- package/CHANGELOG.md +35 -0
- package/CLAUDE.md +3 -3
- package/README.md +26 -14
- package/dist/src/faf-core/commands/audit.d.ts +21 -0
- package/dist/src/faf-core/commands/audit.js +83 -0
- package/dist/src/faf-core/commands/audit.js.map +1 -0
- package/dist/src/faf-core/commands/bi-sync.d.ts +26 -0
- package/dist/src/faf-core/commands/bi-sync.js +157 -0
- package/dist/src/faf-core/commands/bi-sync.js.map +1 -0
- package/dist/src/faf-core/commands/doctor.d.ts +17 -0
- package/dist/src/faf-core/commands/doctor.js +198 -0
- package/dist/src/faf-core/commands/doctor.js.map +1 -0
- package/dist/src/faf-core/commands/enhance.d.ts +46 -0
- package/dist/src/faf-core/commands/enhance.js +360 -0
- package/dist/src/faf-core/commands/enhance.js.map +1 -0
- package/dist/src/faf-core/commands/formats.d.ts +22 -0
- package/dist/src/faf-core/commands/formats.js +117 -0
- package/dist/src/faf-core/commands/formats.js.map +1 -0
- package/dist/src/faf-core/commands/innit.d.ts +7 -0
- package/dist/src/faf-core/commands/innit.js +13 -0
- package/dist/src/faf-core/commands/innit.js.map +1 -0
- package/dist/src/faf-core/commands/migrate.d.ts +15 -0
- package/dist/src/faf-core/commands/migrate.js +86 -0
- package/dist/src/faf-core/commands/migrate.js.map +1 -0
- package/dist/src/faf-core/commands/quick.d.ts +16 -0
- package/dist/src/faf-core/commands/quick.js +184 -0
- package/dist/src/faf-core/commands/quick.js.map +1 -0
- package/dist/src/faf-core/commands/sync.d.ts +16 -0
- package/dist/src/faf-core/commands/sync.js +210 -0
- package/dist/src/faf-core/commands/sync.js.map +1 -0
- package/dist/src/faf-core/commands/update.d.ts +12 -0
- package/dist/src/faf-core/commands/update.js +46 -0
- package/dist/src/faf-core/commands/update.js.map +1 -0
- package/dist/src/faf-core/commands/validate.d.ts +21 -0
- package/dist/src/faf-core/commands/validate.js +81 -0
- package/dist/src/faf-core/commands/validate.js.map +1 -0
- package/dist/src/handlers/engine-adapter.js +262 -0
- package/dist/src/handlers/engine-adapter.js.map +1 -1
- package/package.json +1 -1
package/.faf
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
project:
|
|
2
|
+
name: claude-faf-mcp
|
|
3
|
+
goal: Provide FAF context tools directly in Claude Desktop via MCP
|
|
4
|
+
instant_context:
|
|
5
|
+
tech_stack: Node.js/TypeScript
|
|
6
|
+
main_language: TypeScript
|
|
7
|
+
what_building: Universal FAF MCP Server for Claude Desktop - AI Context Intelligence
|
|
8
|
+
metadata:
|
|
9
|
+
last_claude_sync: 2025-11-06T12:54:27.846Z
|
|
10
|
+
bi_sync: active
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,41 @@ All notable changes to claude-faf-mcp will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [3.0.3] - 2025-11-06
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **9 NEW Bundled Commands**: Eliminated ALL CLI dependencies!
|
|
12
|
+
- `faf_sync` - Sync project.faf with project changes
|
|
13
|
+
- `faf_bi_sync` - Bidirectional sync (project.faf ↔ CLAUDE.md)
|
|
14
|
+
- `faf_formats` - TURBO-CAT format discovery
|
|
15
|
+
- `faf_doctor` - Health check diagnostics
|
|
16
|
+
- `faf_validate` - Schema validation
|
|
17
|
+
- `faf_audit` - Comprehensive quality audit
|
|
18
|
+
- `faf_update` - Update project.faf metadata
|
|
19
|
+
- `faf_migrate` - Migrate legacy .faf to project.faf
|
|
20
|
+
- `faf_innit` - British init command (innit bruv!)
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- **CRITICAL**: Users can now generate CLAUDE.md without CLI (faf_bi_sync works!)
|
|
24
|
+
- **CRITICAL**: Format discovery works without CLI (faf_formats works!)
|
|
25
|
+
- All 50 MCP tools now work standalone - NO CLI DEPENDENCY
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- Mk3 bundled engine now handles 12 commands (was 3):
|
|
29
|
+
- init, score, auto (v3.0.0)
|
|
30
|
+
- sync, bi-sync, formats, doctor, validate, audit, update, migrate, innit (v3.0.3)
|
|
31
|
+
- Average test duration: 102.20ms (50/50 passing)
|
|
32
|
+
|
|
33
|
+
### Performance
|
|
34
|
+
- 100% tool success rate
|
|
35
|
+
- All categories verified working
|
|
36
|
+
- Zero CLI fallback calls for bundled commands
|
|
37
|
+
|
|
38
|
+
### Breaking the 40% Barrier
|
|
39
|
+
Users stuck at 40% AI-readiness (couldn't generate CLAUDE.md) are now FREE!
|
|
40
|
+
- Before: 16/25 working (64%) - blocked by CLI dependency
|
|
41
|
+
- After: 25/25 working (100%) - fully standalone
|
|
42
|
+
|
|
8
43
|
## [3.0.2] - 2025-11-06
|
|
9
44
|
|
|
10
45
|
### Fixed
|
package/CLAUDE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 🏎️ CLAUDE.md - claude-faf-mcp Persistent Context & Intelligence
|
|
2
2
|
|
|
3
|
-
## PROJECT STATE:
|
|
3
|
+
## PROJECT STATE: ACTIVE 🚀
|
|
4
4
|
**Current Position:** Provide FAF context tools directly in Claude Desktop via MCP
|
|
5
5
|
**Tyre Compound:** ULTRASOFT C5 (Maximum Performance)
|
|
6
6
|
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
|
|
20
20
|
### 📊 Context Quality Status
|
|
21
21
|
- **Overall Assessment:** Good
|
|
22
|
-
- **Last Updated:** 2025-
|
|
22
|
+
- **Last Updated:** 2025-11-06
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
26
26
|
**STATUS: BI-SYNC ACTIVE 🔗 - Synchronized with .faf context!**
|
|
27
27
|
|
|
28
|
-
*Last Sync: 2025-
|
|
28
|
+
*Last Sync: 2025-11-06T13:20:32.280Z*
|
|
29
29
|
*Sync Engine: F1-Inspired Software Engineering*
|
|
30
30
|
*🏎️⚡️_championship_sync*
|
package/README.md
CHANGED
|
@@ -12,18 +12,29 @@
|
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
-
## 🏎️ v3.0.
|
|
15
|
+
## 🏎️ v3.0.4 - 100% Standalone Achievement
|
|
16
16
|
|
|
17
|
-
### What's New in v3.0.
|
|
17
|
+
### What's New in v3.0.4
|
|
18
18
|
|
|
19
|
-
**
|
|
19
|
+
**100% STANDALONE OPERATION** - Zero CLI dependencies across all 50 MCP tools.
|
|
20
|
+
|
|
21
|
+
#### Historic Milestone
|
|
22
|
+
- ✅ **50/50 MCP tools operational** (100% standalone)
|
|
23
|
+
- ✅ **14/14 bundled commands** (zero CLI dependencies)
|
|
24
|
+
- ✅ **16.2x average speedup** over CLI versions
|
|
25
|
+
- ✅ **19ms average execution** across all bundled commands
|
|
26
|
+
|
|
27
|
+
#### New Bundled Commands
|
|
28
|
+
- **faf_quick** - Lightning-fast project.faf creation (3ms avg)
|
|
29
|
+
- **faf_enhance** - Intelligent enhancement with auto-detection + MCP-native questionnaire (63ms)
|
|
20
30
|
|
|
21
31
|
#### Mk3 Bundled Engine
|
|
22
|
-
Core FAF CLI compiler code
|
|
23
|
-
- **
|
|
24
|
-
- **
|
|
25
|
-
- **
|
|
26
|
-
- **
|
|
32
|
+
Core FAF CLI compiler code bundled directly into MCP:
|
|
33
|
+
- **16.2x faster** (direct function calls vs process spawning)
|
|
34
|
+
- **19ms average** across all bundled commands
|
|
35
|
+
- **Fastest: 1ms** (formats command)
|
|
36
|
+
- **Unmeasurable: 0ms** (migrate command - too fast!)
|
|
37
|
+
- **Zero memory leaks** with championship-grade performance
|
|
27
38
|
|
|
28
39
|
#### project.faf Standard
|
|
29
40
|
ONE filename for new projects:
|
|
@@ -54,7 +65,7 @@ faf migrate
|
|
|
54
65
|
### Installation
|
|
55
66
|
|
|
56
67
|
```bash
|
|
57
|
-
# Install/upgrade to v3.0.
|
|
68
|
+
# Install/upgrade to v3.0.4
|
|
58
69
|
npm install -g claude-faf-mcp
|
|
59
70
|
|
|
60
71
|
# Or via npx (always gets latest)
|
|
@@ -75,11 +86,12 @@ npx -y claude-faf-mcp
|
|
|
75
86
|
|
|
76
87
|
### Performance Metrics
|
|
77
88
|
|
|
78
|
-
- **
|
|
79
|
-
- **
|
|
80
|
-
- **
|
|
81
|
-
- **
|
|
82
|
-
- **
|
|
89
|
+
- **Average execution**: 19ms (championship grade ✅)
|
|
90
|
+
- **Fastest command**: 1ms (formats)
|
|
91
|
+
- **Unmeasurable**: 0ms (migrate - too fast to measure!)
|
|
92
|
+
- **Speedup vs CLI**: 16.2x average
|
|
93
|
+
- **Memory**: Zero leaks with championship performance ✅
|
|
94
|
+
- **WJTTC Certified**: 14/14 bundled commands, 50/50 tools, 100% pass rate ✅
|
|
83
95
|
|
|
84
96
|
---
|
|
85
97
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔍 faf audit - Comprehensive Quality Audit (Mk3 Bundled)
|
|
3
|
+
* Audit project.faf quality and completeness
|
|
4
|
+
*/
|
|
5
|
+
export interface AuditOptions {
|
|
6
|
+
json?: boolean;
|
|
7
|
+
verbose?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface AuditResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
score: number;
|
|
12
|
+
grade: string;
|
|
13
|
+
issues: Array<{
|
|
14
|
+
severity: 'high' | 'medium' | 'low';
|
|
15
|
+
message: string;
|
|
16
|
+
fix?: string;
|
|
17
|
+
}>;
|
|
18
|
+
strengths: string[];
|
|
19
|
+
message: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function auditFafFile(projectPath?: string, options?: AuditOptions): Promise<AuditResult>;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 🔍 faf audit - Comprehensive Quality Audit (Mk3 Bundled)
|
|
4
|
+
* Audit project.faf quality and completeness
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.auditFafFile = auditFafFile;
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const yaml_1 = require("../fix-once/yaml");
|
|
10
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
11
|
+
const faf_compiler_1 = require("../compiler/faf-compiler");
|
|
12
|
+
async function auditFafFile(projectPath, options = {}) {
|
|
13
|
+
try {
|
|
14
|
+
const fafPath = projectPath ? `${projectPath}/project.faf` : await (0, file_utils_1.findFafFile)();
|
|
15
|
+
if (!fafPath || !await (0, file_utils_1.fileExists)(fafPath)) {
|
|
16
|
+
return {
|
|
17
|
+
success: false,
|
|
18
|
+
score: 0,
|
|
19
|
+
grade: 'F',
|
|
20
|
+
issues: [{ severity: 'high', message: 'No project.faf file found', fix: 'Run faf init' }],
|
|
21
|
+
strengths: [],
|
|
22
|
+
message: 'No project.faf file found'
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// Read and parse
|
|
26
|
+
const content = await fs_1.promises.readFile(fafPath, 'utf-8');
|
|
27
|
+
const fafData = (0, yaml_1.parse)(content);
|
|
28
|
+
// Run compiler scoring
|
|
29
|
+
const compiler = new faf_compiler_1.FafCompiler();
|
|
30
|
+
const scoreResult = await compiler.compile(fafPath);
|
|
31
|
+
const issues = [];
|
|
32
|
+
const strengths = [];
|
|
33
|
+
// Audit checks
|
|
34
|
+
if (!fafData.project?.name) {
|
|
35
|
+
issues.push({ severity: 'high', message: 'Missing project name', fix: 'Add project.name field' });
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
strengths.push('Project name defined');
|
|
39
|
+
}
|
|
40
|
+
if (!fafData.project?.goal) {
|
|
41
|
+
issues.push({ severity: 'medium', message: 'Missing project goal', fix: 'Add project.goal field' });
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
strengths.push('Project goal defined');
|
|
45
|
+
}
|
|
46
|
+
if (!fafData.stack?.frontend && !fafData.stack?.backend) {
|
|
47
|
+
issues.push({ severity: 'medium', message: 'Stack information incomplete', fix: 'Add stack details' });
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
strengths.push('Stack information present');
|
|
51
|
+
}
|
|
52
|
+
if (!fafData.instant_context?.what_building) {
|
|
53
|
+
issues.push({ severity: 'low', message: 'Missing instant context', fix: 'Add what_building description' });
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
strengths.push('Instant context defined');
|
|
57
|
+
}
|
|
58
|
+
// Determine grade
|
|
59
|
+
const grade = scoreResult.score >= 90 ? 'A' :
|
|
60
|
+
scoreResult.score >= 80 ? 'B' :
|
|
61
|
+
scoreResult.score >= 70 ? 'C' :
|
|
62
|
+
scoreResult.score >= 60 ? 'D' : 'F';
|
|
63
|
+
return {
|
|
64
|
+
success: true,
|
|
65
|
+
score: scoreResult.score,
|
|
66
|
+
grade,
|
|
67
|
+
issues,
|
|
68
|
+
strengths,
|
|
69
|
+
message: `Audit complete - Score: ${scoreResult.score}% (Grade: ${grade})`
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return {
|
|
74
|
+
success: false,
|
|
75
|
+
score: 0,
|
|
76
|
+
grade: 'F',
|
|
77
|
+
issues: [{ severity: 'high', message: error instanceof Error ? error.message : 'Audit failed' }],
|
|
78
|
+
strengths: [],
|
|
79
|
+
message: 'Audit failed'
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../../src/faf-core/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔗 Bi-Sync Engine - Mk3 Bundled Edition
|
|
3
|
+
* Revolutionary project.faf ↔ CLAUDE.md Synchronization
|
|
4
|
+
*/
|
|
5
|
+
export interface BiSyncOptions {
|
|
6
|
+
auto?: boolean;
|
|
7
|
+
watch?: boolean;
|
|
8
|
+
force?: boolean;
|
|
9
|
+
json?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface BiSyncResult {
|
|
12
|
+
success: boolean;
|
|
13
|
+
direction: 'faf-to-claude' | 'claude-to-faf' | 'bidirectional' | 'none';
|
|
14
|
+
filesChanged: string[];
|
|
15
|
+
conflicts: string[];
|
|
16
|
+
duration: number;
|
|
17
|
+
message: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 🔄 Convert project.faf YAML content to CLAUDE.md Markdown format
|
|
21
|
+
*/
|
|
22
|
+
export declare function fafToClaudeMd(fafContent: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* 🔗 Main Bi-Sync function
|
|
25
|
+
*/
|
|
26
|
+
export declare function syncBiDirectional(projectPath?: string, options?: BiSyncOptions): Promise<BiSyncResult>;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 🔗 Bi-Sync Engine - Mk3 Bundled Edition
|
|
4
|
+
* Revolutionary project.faf ↔ CLAUDE.md Synchronization
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.fafToClaudeMd = fafToClaudeMd;
|
|
41
|
+
exports.syncBiDirectional = syncBiDirectional;
|
|
42
|
+
const yaml_1 = require("../fix-once/yaml");
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const fs_1 = require("fs");
|
|
45
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
46
|
+
/**
|
|
47
|
+
* 🔄 Convert project.faf YAML content to CLAUDE.md Markdown format
|
|
48
|
+
*/
|
|
49
|
+
function fafToClaudeMd(fafContent) {
|
|
50
|
+
try {
|
|
51
|
+
const fafData = (0, yaml_1.parse)(fafContent);
|
|
52
|
+
let claudeMd = `# 🏎️ CLAUDE.md - ${fafData.project?.name || 'Project'} Persistent Context & Intelligence\n\n`;
|
|
53
|
+
// Project State
|
|
54
|
+
if (fafData.project) {
|
|
55
|
+
claudeMd += `## PROJECT STATE: ${fafData.context_quality?.overall_assessment || 'ACTIVE'} 🚀\n`;
|
|
56
|
+
if (fafData.project.goal) {
|
|
57
|
+
claudeMd += `**Current Position:** ${fafData.project.goal}\n`;
|
|
58
|
+
}
|
|
59
|
+
claudeMd += `**Tyre Compound:** ULTRASOFT C5 (Maximum Performance)\n\n`;
|
|
60
|
+
claudeMd += `---\n\n`;
|
|
61
|
+
}
|
|
62
|
+
// Core Context
|
|
63
|
+
claudeMd += `## 🎨 CORE CONTEXT\n\n`;
|
|
64
|
+
if (fafData.project) {
|
|
65
|
+
claudeMd += `### Project Identity\n`;
|
|
66
|
+
claudeMd += `- **Name:** ${fafData.project.name || 'Unknown'}\n`;
|
|
67
|
+
if (fafData.instant_context?.tech_stack) {
|
|
68
|
+
claudeMd += `- **Stack:** ${fafData.instant_context.tech_stack}\n`;
|
|
69
|
+
}
|
|
70
|
+
claudeMd += `- **Quality:** F1-INSPIRED (Championship Performance)\n\n`;
|
|
71
|
+
}
|
|
72
|
+
// Technical Context
|
|
73
|
+
if (fafData.instant_context) {
|
|
74
|
+
claudeMd += `### Technical Architecture\n`;
|
|
75
|
+
if (fafData.instant_context.what_building) {
|
|
76
|
+
claudeMd += `- **What Building:** ${fafData.instant_context.what_building}\n`;
|
|
77
|
+
}
|
|
78
|
+
if (fafData.instant_context.main_language) {
|
|
79
|
+
claudeMd += `- **Main Language:** ${fafData.instant_context.main_language}\n`;
|
|
80
|
+
}
|
|
81
|
+
claudeMd += `\n`;
|
|
82
|
+
}
|
|
83
|
+
// Context Quality
|
|
84
|
+
if (fafData.context_quality) {
|
|
85
|
+
claudeMd += `### 📊 Context Quality Status\n`;
|
|
86
|
+
claudeMd += `- **Overall Assessment:** ${fafData.context_quality.overall_assessment || 'Good'}\n`;
|
|
87
|
+
claudeMd += `- **Last Updated:** ${new Date().toISOString().split('T')[0]}\n\n`;
|
|
88
|
+
}
|
|
89
|
+
// Championship Footer
|
|
90
|
+
claudeMd += `---\n\n`;
|
|
91
|
+
claudeMd += `**STATUS: BI-SYNC ACTIVE 🔗 - Synchronized with .faf context!**\n\n`;
|
|
92
|
+
claudeMd += `*Last Sync: ${new Date().toISOString()}*\n`;
|
|
93
|
+
claudeMd += `*Sync Engine: F1-Inspired Software Engineering*\n`;
|
|
94
|
+
claudeMd += `*🏎️⚡️_championship_sync*\n`;
|
|
95
|
+
return claudeMd;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw new Error(`Failed to convert .faf to CLAUDE.md: ${error instanceof Error ? error.message : String(error)}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 🔗 Main Bi-Sync function
|
|
103
|
+
*/
|
|
104
|
+
async function syncBiDirectional(projectPath, options = {}) {
|
|
105
|
+
const startTime = Date.now();
|
|
106
|
+
const result = {
|
|
107
|
+
success: false,
|
|
108
|
+
direction: 'none',
|
|
109
|
+
filesChanged: [],
|
|
110
|
+
conflicts: [],
|
|
111
|
+
duration: 0,
|
|
112
|
+
message: ''
|
|
113
|
+
};
|
|
114
|
+
try {
|
|
115
|
+
// Find project.faf file
|
|
116
|
+
const fafPath = projectPath ? path.join(projectPath, 'project.faf') : await (0, file_utils_1.findFafFile)();
|
|
117
|
+
if (!fafPath || !await (0, file_utils_1.fileExists)(fafPath)) {
|
|
118
|
+
result.message = 'No project.faf file found. Run faf init first.';
|
|
119
|
+
result.duration = Date.now() - startTime;
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
const projectDir = path.dirname(fafPath);
|
|
123
|
+
const claudeMdPath = path.join(projectDir, 'CLAUDE.md');
|
|
124
|
+
// Check what exists
|
|
125
|
+
const claudeMdExists = await (0, file_utils_1.fileExists)(claudeMdPath);
|
|
126
|
+
// Read .faf content
|
|
127
|
+
const fafContent = await fs_1.promises.readFile(fafPath, 'utf-8');
|
|
128
|
+
const fafData = (0, yaml_1.parse)(fafContent);
|
|
129
|
+
const currentScore = fafData.faf_score || '0%';
|
|
130
|
+
if (!claudeMdExists) {
|
|
131
|
+
// Create CLAUDE.md from project.faf
|
|
132
|
+
const claudeMdContent = fafToClaudeMd(fafContent);
|
|
133
|
+
await fs_1.promises.writeFile(claudeMdPath, claudeMdContent, 'utf-8');
|
|
134
|
+
result.success = true;
|
|
135
|
+
result.direction = 'faf-to-claude';
|
|
136
|
+
result.filesChanged.push('CLAUDE.md');
|
|
137
|
+
result.message = `CLAUDE.md created! Bi-sync now active! FAF Score: ${currentScore}`;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// Both files exist - update CLAUDE.md from project.faf
|
|
141
|
+
const claudeMdContent = fafToClaudeMd(fafContent);
|
|
142
|
+
await fs_1.promises.writeFile(claudeMdPath, claudeMdContent, 'utf-8');
|
|
143
|
+
result.success = true;
|
|
144
|
+
result.direction = 'faf-to-claude';
|
|
145
|
+
result.filesChanged.push('CLAUDE.md');
|
|
146
|
+
result.message = `Files synchronized! Perfect harmony achieved! FAF Score: ${currentScore}`;
|
|
147
|
+
}
|
|
148
|
+
result.duration = Date.now() - startTime;
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
result.duration = Date.now() - startTime;
|
|
153
|
+
result.message = error instanceof Error ? error.message : 'Sync failed';
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=bi-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bi-sync.js","sourceRoot":"","sources":["../../../../src/faf-core/commands/bi-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🏥 FAF Doctor - Diagnose and fix common issues (Mk3 Bundled)
|
|
3
|
+
* Health check for your project.faf setup
|
|
4
|
+
*/
|
|
5
|
+
interface DiagnosticResult {
|
|
6
|
+
status: 'ok' | 'warning' | 'error';
|
|
7
|
+
message: string;
|
|
8
|
+
fix?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface DoctorResult {
|
|
11
|
+
success: boolean;
|
|
12
|
+
health: 'perfect' | 'good' | 'issues';
|
|
13
|
+
diagnostics: DiagnosticResult[];
|
|
14
|
+
message: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function doctorCommand(projectPath?: string): Promise<DoctorResult>;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 🏥 FAF Doctor - Diagnose and fix common issues (Mk3 Bundled)
|
|
4
|
+
* Health check for your project.faf setup
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.doctorCommand = doctorCommand;
|
|
41
|
+
const fs_1 = require("fs");
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const yaml_1 = require("../fix-once/yaml");
|
|
44
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
45
|
+
const faf_compiler_1 = require("../compiler/faf-compiler");
|
|
46
|
+
async function doctorCommand(projectPath) {
|
|
47
|
+
const results = [];
|
|
48
|
+
const projectRoot = projectPath || process.cwd();
|
|
49
|
+
try {
|
|
50
|
+
// Check 1: project.faf file exists
|
|
51
|
+
const fafPath = await (0, file_utils_1.findFafFile)(projectRoot);
|
|
52
|
+
if (!fafPath) {
|
|
53
|
+
results.push({
|
|
54
|
+
status: 'error',
|
|
55
|
+
message: 'No project.faf file found',
|
|
56
|
+
fix: 'Run: faf init, faf quick, or faf chat to create one'
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
results.push({
|
|
61
|
+
status: 'ok',
|
|
62
|
+
message: `Found project.faf at: ${fafPath}`
|
|
63
|
+
});
|
|
64
|
+
// Check 2: project.faf file validity
|
|
65
|
+
try {
|
|
66
|
+
const content = await fs_1.promises.readFile(fafPath, 'utf-8');
|
|
67
|
+
const fafData = (0, yaml_1.parse)(content);
|
|
68
|
+
if (!fafData) {
|
|
69
|
+
results.push({
|
|
70
|
+
status: 'error',
|
|
71
|
+
message: 'project.faf file is empty',
|
|
72
|
+
fix: 'Run: faf init --force to regenerate'
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Check for required fields
|
|
77
|
+
const missingFields = [];
|
|
78
|
+
if (!fafData.project?.name)
|
|
79
|
+
missingFields.push('project.name');
|
|
80
|
+
if (!fafData.project?.goal)
|
|
81
|
+
missingFields.push('project.goal');
|
|
82
|
+
if (missingFields.length > 0) {
|
|
83
|
+
results.push({
|
|
84
|
+
status: 'warning',
|
|
85
|
+
message: `Missing important fields: ${missingFields.join(', ')}`,
|
|
86
|
+
fix: 'Run: faf enhance or faf chat to add missing info'
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
results.push({
|
|
91
|
+
status: 'ok',
|
|
92
|
+
message: 'project.faf structure is valid'
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Check 3: Score
|
|
96
|
+
const compiler = new faf_compiler_1.FafCompiler();
|
|
97
|
+
const scoreResult = await compiler.compile(fafPath);
|
|
98
|
+
if (scoreResult.score < 30) {
|
|
99
|
+
results.push({
|
|
100
|
+
status: 'error',
|
|
101
|
+
message: `Score too low: ${scoreResult.score}%`,
|
|
102
|
+
fix: 'Run: faf enhance to improve, or faf chat to add context'
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else if (scoreResult.score < 70) {
|
|
106
|
+
results.push({
|
|
107
|
+
status: 'warning',
|
|
108
|
+
message: `Score could be better: ${scoreResult.score}%`,
|
|
109
|
+
fix: 'Target 70%+ for championship AI context'
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
results.push({
|
|
114
|
+
status: 'ok',
|
|
115
|
+
message: `Great score: ${scoreResult.score}%`
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
results.push({
|
|
122
|
+
status: 'error',
|
|
123
|
+
message: 'project.faf file is corrupted or invalid YAML',
|
|
124
|
+
fix: 'Run: faf recover or faf init --force'
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Check 4: .fafignore exists
|
|
129
|
+
const fafIgnorePath = path.join(projectRoot, '.fafignore');
|
|
130
|
+
if (!await (0, file_utils_1.fileExists)(fafIgnorePath)) {
|
|
131
|
+
results.push({
|
|
132
|
+
status: 'warning',
|
|
133
|
+
message: 'No .fafignore file',
|
|
134
|
+
fix: '.fafignore helps exclude unnecessary files'
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
results.push({
|
|
139
|
+
status: 'ok',
|
|
140
|
+
message: '.fafignore found'
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// Check 5: Project detection
|
|
144
|
+
const packageJsonPath = path.join(projectRoot, 'package.json');
|
|
145
|
+
const requirementsPath = path.join(projectRoot, 'requirements.txt');
|
|
146
|
+
const goModPath = path.join(projectRoot, 'go.mod');
|
|
147
|
+
if (await (0, file_utils_1.fileExists)(packageJsonPath)) {
|
|
148
|
+
results.push({
|
|
149
|
+
status: 'ok',
|
|
150
|
+
message: 'Node.js/JavaScript project detected'
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else if (await (0, file_utils_1.fileExists)(requirementsPath)) {
|
|
154
|
+
results.push({
|
|
155
|
+
status: 'ok',
|
|
156
|
+
message: 'Python project detected'
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
else if (await (0, file_utils_1.fileExists)(goModPath)) {
|
|
160
|
+
results.push({
|
|
161
|
+
status: 'ok',
|
|
162
|
+
message: 'Go project detected'
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
results.push({
|
|
167
|
+
status: 'warning',
|
|
168
|
+
message: 'No standard project files detected',
|
|
169
|
+
fix: 'FAF works best with package.json, requirements.txt, or go.mod'
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
// Determine overall health
|
|
173
|
+
const hasErrors = results.some(r => r.status === 'error');
|
|
174
|
+
const hasWarnings = results.some(r => r.status === 'warning');
|
|
175
|
+
const health = !hasErrors && !hasWarnings ? 'perfect' : !hasErrors ? 'good' : 'issues';
|
|
176
|
+
const message = health === 'perfect' ? 'Perfect health! Your FAF setup is championship-ready!' :
|
|
177
|
+
health === 'good' ? 'Good health with minor improvements suggested.' :
|
|
178
|
+
'Issues detected. Follow the fixes above.';
|
|
179
|
+
return {
|
|
180
|
+
success: true,
|
|
181
|
+
health,
|
|
182
|
+
diagnostics: results,
|
|
183
|
+
message
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
return {
|
|
188
|
+
success: false,
|
|
189
|
+
health: 'issues',
|
|
190
|
+
diagnostics: [{
|
|
191
|
+
status: 'error',
|
|
192
|
+
message: error instanceof Error ? error.message : 'Health check failed'
|
|
193
|
+
}],
|
|
194
|
+
message: 'Health check failed'
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=doctor.js.map
|