claude-faf-mcp 2.7.2 β 2.8.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 +34 -0
- package/README.md +78 -13
- package/dist/src/compiler/index.d.ts +7 -0
- package/dist/src/compiler/index.js +24 -0
- package/dist/src/compiler/index.js.map +1 -0
- package/dist/src/compiler/scorer.d.ts +53 -0
- package/dist/src/compiler/scorer.js +189 -0
- package/dist/src/compiler/scorer.js.map +1 -0
- package/dist/src/compiler/slot-validator.d.ts +32 -0
- package/dist/src/compiler/slot-validator.js +293 -0
- package/dist/src/compiler/slot-validator.js.map +1 -0
- package/dist/src/compiler/type-detector.d.ts +62 -0
- package/dist/src/compiler/type-detector.js +388 -0
- package/dist/src/compiler/type-detector.js.map +1 -0
- package/dist/src/config/visibility.d.ts +41 -0
- package/dist/src/config/visibility.js +158 -0
- package/dist/src/config/visibility.js.map +1 -0
- package/dist/src/handlers/championship-tools.d.ts +14 -1
- package/dist/src/handlers/championship-tools.js +728 -562
- package/dist/src/handlers/championship-tools.js.map +1 -1
- package/dist/src/handlers/tool-registry.d.ts +23 -0
- package/dist/src/handlers/tool-registry.js +68 -0
- package/dist/src/handlers/tool-registry.js.map +1 -0
- package/dist/src/handlers/tool-types.d.ts +36 -1
- package/dist/src/handlers/tools.d.ts +1 -0
- package/dist/src/handlers/tools.js +47 -2
- package/dist/src/handlers/tools.js.map +1 -1
- package/dist/src/server.js +5 -4
- package/dist/src/server.js.map +1 -1
- package/dist/src/types/mcp-tools.d.ts +53 -0
- package/dist/src/types/mcp-tools.js +77 -0
- package/dist/src/types/mcp-tools.js.map +1 -0
- package/dist/src/types/project-types.d.ts +22 -0
- package/dist/src/types/project-types.js +85 -0
- package/dist/src/types/project-types.js.map +1 -0
- package/dist/src/types/slots.d.ts +39 -0
- package/dist/src/types/slots.js +162 -0
- package/dist/src/types/slots.js.map +1 -0
- package/dist/src/types/tool-visibility.d.ts +36 -0
- package/dist/src/types/tool-visibility.js +512 -0
- package/dist/src/types/tool-visibility.js.map +1 -0
- package/dist/src/utils/display-protocol.d.ts +1 -1
- package/dist/src/utils/display-protocol.js +1 -1
- package/dist/src/version.d.ts +9 -0
- package/dist/src/version.js +37 -0
- package/dist/src/version.js.map +1 -0
- package/package.json +2 -1
- package/skill/SKILL.md +385 -0
- package/dist/test-file-finder.js +0 -20
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,40 @@ 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
|
+
## [2.8.0] - 2025-11-05
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Tool Visibility System - Intelligent filtering to reduce cognitive load
|
|
12
|
+
- 21 Core Tools (default) - Essential workflow tools shown by default
|
|
13
|
+
- 30+ Advanced Tools (opt-in) - Expert-level tools via FAF_MCP_SHOW_ADVANCED env var
|
|
14
|
+
- Tool categorization system (workflow, quality, intelligence, sync, ai, help, trust, file, utility, display)
|
|
15
|
+
- Configuration priority system (ENV > config file > default)
|
|
16
|
+
- Support for ~/.fafrc config file (JSON and key=value formats)
|
|
17
|
+
- Claude Code skill (faf-expert) bundled with package
|
|
18
|
+
- Comprehensive visibility test suite (22 new tests)
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
- Default tool count reduced from 51 to 21 (59% reduction in cognitive load)
|
|
22
|
+
- Tool filtering performance <10ms (5x better than 50ms target)
|
|
23
|
+
- Professional console output (silent operation, no clutter)
|
|
24
|
+
- README updated with v2.8.0 features and Claude Code skill installation
|
|
25
|
+
|
|
26
|
+
### Performance
|
|
27
|
+
- Sub-10ms tool filtering for 56 tools
|
|
28
|
+
- Zero regressions in existing functionality
|
|
29
|
+
- 79 total tests passing (57 existing + 22 new)
|
|
30
|
+
|
|
31
|
+
### Testing
|
|
32
|
+
- WJTTC Gold Certified
|
|
33
|
+
- F1-inspired testing standards applied
|
|
34
|
+
- Complete test report available
|
|
35
|
+
|
|
36
|
+
## [2.7.3] - 2025-11-02
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
- Corrected project.faf screenshot CDN URL to use claude-faf-mcp package asset
|
|
40
|
+
- Image now displays correctly on npmjs.com README
|
|
41
|
+
|
|
8
42
|
## [2.7.2] - 2025-10-31
|
|
9
43
|
|
|
10
44
|
### Changed
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **π IANA-Registered Format** - .FAF is now an Internet-standard format.
|
|
4
4
|
> MCP server for creating official `application/vnd.faf+yaml` files in Claude Desktop
|
|
5
|
-
> Official MCP server for FAF (Foundational AI-context Format) with
|
|
5
|
+
> Official MCP server for FAF (Foundational AI-context Format) with 50+ tools -
|
|
6
6
|
> Persistent project context that integrates seamlessly with Claude Desktop workflows
|
|
7
7
|
|
|
8
8
|
[](https://www.npmjs.com/package/claude-faf-mcp)
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
**Problem:** AI needs persistent project contextβnot just md docs or tools, but foundational infrastructure.
|
|
16
16
|
|
|
17
|
-
**Solution:** The .faf format is a structured, machine-readable context layer. This MCP server gives Claude
|
|
17
|
+
**Solution:** The .faf format is a structured, machine-readable context layer. This MCP server gives Claude 50+ tools to create, score, and improve your project's persistent context through format-driven architecture.
|
|
18
18
|
|
|
19
19
|
**How it works:** Get a score (0-100%) showing how well AI understands your project. Higher scores = AI more in-tune with your codebase. Use tools to improve your score and context quality. Your .faf context persists across sessions.
|
|
20
20
|
|
|
@@ -56,7 +56,7 @@ Use CLI for raw speed and local development; use MCP for AI-integrated workflows
|
|
|
56
56
|
### πΈ See It In Action
|
|
57
57
|
|
|
58
58
|
<div align="center">
|
|
59
|
-
<img src="https://cdn.jsdelivr.net/npm/faf-
|
|
59
|
+
<img src="https://cdn.jsdelivr.net/npm/claude-faf-mcp@latest/assets/project-faf-screenshot.png" alt="project.faf sits between package.json and README.md" width="500" />
|
|
60
60
|
|
|
61
61
|
**`project.faf` sits right between `package.json` and `README.md`** - exactly where it belongs.
|
|
62
62
|
|
|
@@ -88,16 +88,59 @@ Published to official Anthropic MCP registry with validation by Anthropic engine
|
|
|
88
88
|
|
|
89
89
|
---
|
|
90
90
|
|
|
91
|
-
## What's New in v2.
|
|
91
|
+
## What's New in v2.8.0 - Tool Visibility System
|
|
92
92
|
|
|
93
|
-
**v2.
|
|
93
|
+
**v2.8.0 introduces intelligent tool filtering to reduce cognitive load.**
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
### New Features
|
|
96
96
|
|
|
97
|
-
**
|
|
98
|
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
97
|
+
**21 Core Tools (Default)**
|
|
98
|
+
Essential workflow tools shown by default:
|
|
99
|
+
- Workflow: `faf`, `faf_auto`, `faf_init`, `faf_innit`, `faf_status`
|
|
100
|
+
- Quality: `faf_score`, `faf_validate`, `faf_doctor`, `faf_audit`
|
|
101
|
+
- Intelligence: `faf_formats`, `faf_stacks`, `faf_skills`
|
|
102
|
+
- Sync: `faf_sync`, `faf_bi_sync`, `faf_update`, `faf_migrate`
|
|
103
|
+
- AI: `faf_chat`, `faf_enhance`
|
|
104
|
+
- Help: `faf_index`, `faf_faq`, `faf_about`
|
|
105
|
+
|
|
106
|
+
**30+ Advanced Tools (Opt-in)**
|
|
107
|
+
Expert-level tools available via environment variable:
|
|
108
|
+
- Display variants: `faf_display`, `faf_show`, `faf_check`
|
|
109
|
+
- Trust system: `faf_trust`, `faf_trust_confidence`, `faf_trust_garage`
|
|
110
|
+
- File operations: `faf_read`, `faf_write`, `faf_list`, `faf_exists`
|
|
111
|
+
- DNA tracking: `faf_dna`, `faf_log`, `faf_auth`, `faf_recover`
|
|
112
|
+
- Utilities: `faf_choose`, `faf_clear`, `faf_share`, `faf_credit`
|
|
113
|
+
|
|
114
|
+
**Enable Advanced Tools:**
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"mcpServers": {
|
|
118
|
+
"claude-faf-mcp": {
|
|
119
|
+
"command": "claude-faf-mcp",
|
|
120
|
+
"env": {
|
|
121
|
+
"FAF_MCP_SHOW_ADVANCED": "true"
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**New! Claude Code Skill**
|
|
129
|
+
The `faf-expert` skill is now available - your on-hand 24/7 FAF specialist:
|
|
130
|
+
- Expert guidance on .faf files and project DNA
|
|
131
|
+
- Tool Visibility System documentation
|
|
132
|
+
- MCP server configuration help
|
|
133
|
+
- AI-readiness scoring assistance
|
|
134
|
+
|
|
135
|
+
### Performance
|
|
136
|
+
- **<10ms tool filtering** (5x better than 50ms championship target)
|
|
137
|
+
- **79 tests passing** (57 existing + 22 new visibility tests)
|
|
138
|
+
- **Zero regressions** - All existing functionality preserved
|
|
139
|
+
- **WJTTC Gold Certified** - F1-inspired testing standards
|
|
140
|
+
|
|
141
|
+
### Previous: v2.7.2 - IANA Registration
|
|
142
|
+
|
|
143
|
+
On **October 31, 2025**, IANA officially registered `.faf` as `application/vnd.faf+yaml` - making it an Internet-standard format alongside PDF, JSON, and XML
|
|
101
144
|
- API standardization across platforms
|
|
102
145
|
|
|
103
146
|
This documentation update adds IANA information throughout the README to reflect this major infrastructure-level achievement.
|
|
@@ -205,7 +248,7 @@ Format-driven means the architecture is built on data structure first, not tooli
|
|
|
205
248
|
- Email client support
|
|
206
249
|
- API standardization across platforms
|
|
207
250
|
|
|
208
|
-
- **
|
|
251
|
+
- **50+ MCP Tools** - Complete project context management
|
|
209
252
|
- Project DNA generation and scoring
|
|
210
253
|
- Bi-directional CLAUDE.md sync
|
|
211
254
|
- Format validation and conversion
|
|
@@ -297,7 +340,7 @@ Full tool documentation available at https://faf.one/docs/tools.
|
|
|
297
340
|
1. Drop any project file into Claude Desktop
|
|
298
341
|
2. Type: "Run faf_auto to analyze this project"
|
|
299
342
|
3. Get instant context - Claude understands your codebase
|
|
300
|
-
4. Access
|
|
343
|
+
4. Access 50+ commands naturally in conversation
|
|
301
344
|
|
|
302
345
|
The .faf file persists across conversations - no need to re-explain your project each time.
|
|
303
346
|
|
|
@@ -341,9 +384,31 @@ Node.js 18 or later. Claude Desktop (latest version). Operating system: macOS, L
|
|
|
341
384
|
|
|
342
385
|
---
|
|
343
386
|
|
|
387
|
+
## Claude Code Skill Installation
|
|
388
|
+
|
|
389
|
+
**NEW**: Install the `faf-expert` skill for enhanced FAF support in Claude Code:
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
# Install from npm package
|
|
393
|
+
mkdir -p ~/.claude/skills/faf-expert
|
|
394
|
+
cp node_modules/claude-faf-mcp/skill/SKILL.md ~/.claude/skills/faf-expert/
|
|
395
|
+
|
|
396
|
+
# Or download directly
|
|
397
|
+
curl -o ~/.claude/skills/faf-expert/SKILL.md \
|
|
398
|
+
https://cdn.jsdelivr.net/npm/claude-faf-mcp@latest/skill/SKILL.md
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
Restart Claude Code to activate. The skill provides:
|
|
402
|
+
- Expert guidance on .faf files and project DNA
|
|
403
|
+
- v2.8.0 Tool Visibility System documentation
|
|
404
|
+
- MCP server configuration help
|
|
405
|
+
- AI-readiness scoring assistance
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
344
409
|
## The FAF Ecosystem
|
|
345
410
|
|
|
346
|
-
faf-cli (npm) - Command line tool for local context management. claude-faf-mcp - This MCP server for Claude Desktop integration. faf.one - Documentation and guides. Chrome Extension - Browser integration for context collection.
|
|
411
|
+
faf-cli (npm) - Command line tool for local context management. claude-faf-mcp - This MCP server for Claude Desktop integration. faf.one - Documentation and guides. Chrome Extension - Browser integration for context collection. faf-expert skill - Claude Code integration for FAF expertise.
|
|
347
412
|
|
|
348
413
|
---
|
|
349
414
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* FAF Compiler Engine MK3
|
|
4
|
+
* Championship-grade project type detection and scoring
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
18
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
__exportStar(require("./type-detector"), exports);
|
|
22
|
+
__exportStar(require("./slot-validator"), exports);
|
|
23
|
+
__exportStar(require("./scorer"), exports);
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/compiler/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,kDAAgC;AAChC,mDAAiC;AACjC,2CAAyB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compiler Engine Scorer - FAF Compiler Engine MK3
|
|
3
|
+
* Championship-grade scoring with context-aware metrics
|
|
4
|
+
*/
|
|
5
|
+
export interface ScoringResult {
|
|
6
|
+
score: number;
|
|
7
|
+
medal: 'trophy' | 'gold' | 'silver' | 'bronze' | 'red' | 'white';
|
|
8
|
+
emoji: string;
|
|
9
|
+
message: string;
|
|
10
|
+
breakdown: {
|
|
11
|
+
totalSlots: 21;
|
|
12
|
+
relevantSlots: number;
|
|
13
|
+
filledSlots: number;
|
|
14
|
+
ignoredSlots: number;
|
|
15
|
+
};
|
|
16
|
+
nextMilestone: {
|
|
17
|
+
targetScore: number;
|
|
18
|
+
medal: string;
|
|
19
|
+
emoji: string;
|
|
20
|
+
slotsNeeded: number;
|
|
21
|
+
message: string;
|
|
22
|
+
} | null;
|
|
23
|
+
}
|
|
24
|
+
export declare class CompilerEngineScorer {
|
|
25
|
+
/**
|
|
26
|
+
* Calculate score with slotignore support
|
|
27
|
+
*/
|
|
28
|
+
calculateScore(filledSlots: number, relevantSlots: number, slotignore: string[]): ScoringResult;
|
|
29
|
+
/**
|
|
30
|
+
* Determine medal from score
|
|
31
|
+
*/
|
|
32
|
+
private getMedal;
|
|
33
|
+
/**
|
|
34
|
+
* Get medal emoji
|
|
35
|
+
*/
|
|
36
|
+
private getMedalEmoji;
|
|
37
|
+
/**
|
|
38
|
+
* Generate contextual message
|
|
39
|
+
*/
|
|
40
|
+
private getMessage;
|
|
41
|
+
/**
|
|
42
|
+
* Calculate next milestone
|
|
43
|
+
*/
|
|
44
|
+
private getNextMilestone;
|
|
45
|
+
/**
|
|
46
|
+
* Format scoring result as human-readable text
|
|
47
|
+
*/
|
|
48
|
+
formatResult(result: ScoringResult, projectType?: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Generate actionable suggestions based on score
|
|
51
|
+
*/
|
|
52
|
+
generateSuggestions(score: number, _medal: string, _missingSlots: string[]): string[];
|
|
53
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Compiler Engine Scorer - FAF Compiler Engine MK3
|
|
4
|
+
* Championship-grade scoring with context-aware metrics
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.CompilerEngineScorer = void 0;
|
|
8
|
+
class CompilerEngineScorer {
|
|
9
|
+
/**
|
|
10
|
+
* Calculate score with slotignore support
|
|
11
|
+
*/
|
|
12
|
+
calculateScore(filledSlots, relevantSlots, slotignore) {
|
|
13
|
+
// Calculate score: (filled / relevant) * 100
|
|
14
|
+
const score = Math.round((filledSlots / relevantSlots) * 100);
|
|
15
|
+
// Determine medal
|
|
16
|
+
const medal = this.getMedal(score);
|
|
17
|
+
const emoji = this.getMedalEmoji(medal);
|
|
18
|
+
// Generate message
|
|
19
|
+
const message = this.getMessage(score, filledSlots, relevantSlots, medal);
|
|
20
|
+
// Calculate next milestone
|
|
21
|
+
const nextMilestone = this.getNextMilestone(score, filledSlots, relevantSlots);
|
|
22
|
+
return {
|
|
23
|
+
score,
|
|
24
|
+
medal,
|
|
25
|
+
emoji,
|
|
26
|
+
message,
|
|
27
|
+
breakdown: {
|
|
28
|
+
totalSlots: 21,
|
|
29
|
+
relevantSlots,
|
|
30
|
+
filledSlots,
|
|
31
|
+
ignoredSlots: slotignore.length,
|
|
32
|
+
},
|
|
33
|
+
nextMilestone,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Determine medal from score
|
|
38
|
+
*/
|
|
39
|
+
getMedal(score) {
|
|
40
|
+
if (score >= 85)
|
|
41
|
+
return 'trophy'; // Championship grade
|
|
42
|
+
if (score >= 70)
|
|
43
|
+
return 'gold'; // Podium grade
|
|
44
|
+
if (score >= 55)
|
|
45
|
+
return 'silver'; // Strong
|
|
46
|
+
if (score >= 40)
|
|
47
|
+
return 'bronze'; // Decent
|
|
48
|
+
if (score >= 20)
|
|
49
|
+
return 'red'; // Needs work
|
|
50
|
+
return 'white'; // Just started
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get medal emoji
|
|
54
|
+
*/
|
|
55
|
+
getMedalEmoji(medal) {
|
|
56
|
+
switch (medal) {
|
|
57
|
+
case 'trophy': return 'π';
|
|
58
|
+
case 'gold': return 'π₯';
|
|
59
|
+
case 'silver': return 'π₯';
|
|
60
|
+
case 'bronze': return 'π₯';
|
|
61
|
+
case 'red': return 'π΄';
|
|
62
|
+
case 'white': return 'π€';
|
|
63
|
+
default: return 'βͺ';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Generate contextual message
|
|
68
|
+
*/
|
|
69
|
+
getMessage(score, filled, relevant, medal) {
|
|
70
|
+
if (score === 100) {
|
|
71
|
+
return `Perfect ${medal === 'trophy' ? 'Championship' : 'Project'} DNA! All ${filled}/${relevant} relevant slots filled.`;
|
|
72
|
+
}
|
|
73
|
+
if (score >= 85) {
|
|
74
|
+
return `Championship grade! ${filled}/${relevant} slots filled. Podium performance!`;
|
|
75
|
+
}
|
|
76
|
+
if (score >= 70) {
|
|
77
|
+
return `Podium grade! ${filled}/${relevant} slots filled. Strong AI context.`;
|
|
78
|
+
}
|
|
79
|
+
if (score >= 55) {
|
|
80
|
+
return `Solid foundation. ${filled}/${relevant} slots filled. Keep going!`;
|
|
81
|
+
}
|
|
82
|
+
if (score >= 40) {
|
|
83
|
+
return `Decent start. ${filled}/${relevant} slots filled. Room for improvement.`;
|
|
84
|
+
}
|
|
85
|
+
if (score >= 20) {
|
|
86
|
+
return `Getting started. ${filled}/${relevant} slots filled. Focus on core context.`;
|
|
87
|
+
}
|
|
88
|
+
return `Just beginning. ${filled}/${relevant} slots filled. Add project basics first.`;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Calculate next milestone
|
|
92
|
+
*/
|
|
93
|
+
getNextMilestone(score, filled, relevant) {
|
|
94
|
+
// Already at 100%
|
|
95
|
+
if (score === 100) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// Define milestones
|
|
99
|
+
const milestones = [
|
|
100
|
+
{ threshold: 85, name: 'trophy', emoji: 'π', label: 'Championship Grade' },
|
|
101
|
+
{ threshold: 70, name: 'gold', emoji: 'π₯', label: 'Podium Grade' },
|
|
102
|
+
{ threshold: 55, name: 'silver', emoji: 'π₯', label: 'Solid Foundation' },
|
|
103
|
+
{ threshold: 40, name: 'bronze', emoji: 'π₯', label: 'Decent Start' },
|
|
104
|
+
{ threshold: 20, name: 'red', emoji: 'π΄', label: 'Getting Started' },
|
|
105
|
+
];
|
|
106
|
+
// Find next milestone
|
|
107
|
+
const nextMilestone = milestones.find(m => score < m.threshold);
|
|
108
|
+
if (!nextMilestone) {
|
|
109
|
+
// Already above all milestones, aim for 100%
|
|
110
|
+
const slotsNeeded = relevant - filled;
|
|
111
|
+
return {
|
|
112
|
+
targetScore: 100,
|
|
113
|
+
medal: 'trophy',
|
|
114
|
+
emoji: 'π',
|
|
115
|
+
slotsNeeded,
|
|
116
|
+
message: `Fill ${slotsNeeded} more slot${slotsNeeded === 1 ? '' : 's'} to reach 100% (Perfect!)`,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// Calculate slots needed
|
|
120
|
+
const targetFilled = Math.ceil((nextMilestone.threshold / 100) * relevant);
|
|
121
|
+
const slotsNeeded = Math.max(1, targetFilled - filled);
|
|
122
|
+
return {
|
|
123
|
+
targetScore: nextMilestone.threshold,
|
|
124
|
+
medal: nextMilestone.name,
|
|
125
|
+
emoji: nextMilestone.emoji,
|
|
126
|
+
slotsNeeded,
|
|
127
|
+
message: `Fill ${slotsNeeded} more slot${slotsNeeded === 1 ? '' : 's'} to reach ${nextMilestone.threshold}% (${nextMilestone.label})`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Format scoring result as human-readable text
|
|
132
|
+
*/
|
|
133
|
+
formatResult(result, projectType) {
|
|
134
|
+
const lines = [];
|
|
135
|
+
// Header
|
|
136
|
+
lines.push(`${result.emoji} Score: ${result.score}%`);
|
|
137
|
+
lines.push('');
|
|
138
|
+
// Message
|
|
139
|
+
lines.push(result.message);
|
|
140
|
+
lines.push('');
|
|
141
|
+
// Breakdown
|
|
142
|
+
lines.push('Breakdown:');
|
|
143
|
+
lines.push(` Total Slots: ${result.breakdown.totalSlots}`);
|
|
144
|
+
if (projectType) {
|
|
145
|
+
lines.push(` Project Type: ${projectType}`);
|
|
146
|
+
}
|
|
147
|
+
lines.push(` Relevant Slots: ${result.breakdown.relevantSlots}`);
|
|
148
|
+
lines.push(` Filled Slots: ${result.breakdown.filledSlots}`);
|
|
149
|
+
if (result.breakdown.ignoredSlots > 0) {
|
|
150
|
+
lines.push(` Ignored Slots: ${result.breakdown.ignoredSlots} (not applicable to this project type)`);
|
|
151
|
+
}
|
|
152
|
+
// Next milestone
|
|
153
|
+
if (result.nextMilestone) {
|
|
154
|
+
lines.push('');
|
|
155
|
+
lines.push('Next Milestone:');
|
|
156
|
+
lines.push(` ${result.nextMilestone.emoji} ${result.nextMilestone.message}`);
|
|
157
|
+
}
|
|
158
|
+
return lines.join('\n');
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Generate actionable suggestions based on score
|
|
162
|
+
*/
|
|
163
|
+
generateSuggestions(score, _medal, _missingSlots) {
|
|
164
|
+
const suggestions = [];
|
|
165
|
+
if (score < 40) {
|
|
166
|
+
suggestions.push('Start with core slots: project_identity, language, human_context');
|
|
167
|
+
suggestions.push('Add basic documentation: README.md, CLAUDE.md');
|
|
168
|
+
}
|
|
169
|
+
if (score >= 40 && score < 70) {
|
|
170
|
+
suggestions.push('Fill in your tech stack details (frontend, backend, database)');
|
|
171
|
+
suggestions.push('Add build and deployment information');
|
|
172
|
+
}
|
|
173
|
+
if (score >= 70 && score < 85) {
|
|
174
|
+
suggestions.push('Complete architecture details (auth, storage, caching)');
|
|
175
|
+
suggestions.push('Add team workflow and CI/CD information');
|
|
176
|
+
}
|
|
177
|
+
if (score >= 85 && score < 100) {
|
|
178
|
+
suggestions.push('Polish remaining slots for championship grade');
|
|
179
|
+
suggestions.push('Ensure all documentation is up to date');
|
|
180
|
+
}
|
|
181
|
+
if (score === 100) {
|
|
182
|
+
suggestions.push('Perfect! Consider sharing your .faf with the community');
|
|
183
|
+
suggestions.push('Keep it updated as your project evolves');
|
|
184
|
+
}
|
|
185
|
+
return suggestions;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.CompilerEngineScorer = CompilerEngineScorer;
|
|
189
|
+
//# sourceMappingURL=scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../../../src/compiler/scorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slot Validator - FAF Compiler Engine MK3
|
|
3
|
+
* Championship-grade slot validation with .faf content analysis
|
|
4
|
+
*/
|
|
5
|
+
import { ValidationResult } from '../types/slots';
|
|
6
|
+
import { ProjectType } from '../types/project-types';
|
|
7
|
+
export declare class SlotValidator {
|
|
8
|
+
/**
|
|
9
|
+
* Validate all slots against project type
|
|
10
|
+
*/
|
|
11
|
+
validate(fafContent: any, projectType: ProjectType): ValidationResult;
|
|
12
|
+
/**
|
|
13
|
+
* Check if a specific slot is filled in .faf content
|
|
14
|
+
*/
|
|
15
|
+
private isSlotFilled;
|
|
16
|
+
/**
|
|
17
|
+
* Get the value of a slot from .faf content
|
|
18
|
+
*/
|
|
19
|
+
private getSlotValue;
|
|
20
|
+
/**
|
|
21
|
+
* Helper: Check if fafContent has a specific framework
|
|
22
|
+
*/
|
|
23
|
+
private hasFramework;
|
|
24
|
+
/**
|
|
25
|
+
* Determine medal from score
|
|
26
|
+
*/
|
|
27
|
+
private getMedal;
|
|
28
|
+
/**
|
|
29
|
+
* Load and parse .faf file from directory
|
|
30
|
+
*/
|
|
31
|
+
static loadFafFile(projectPath: string): Promise<any | null>;
|
|
32
|
+
}
|