faf-mcp 1.2.2 → 1.2.3
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/README.md +103 -161
- package/dist/index.json +1 -0
- 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/index.js +0 -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/package.json +1 -1
- package/project.faf +1 -1
- package/scripts/discord-sync-curated.js +0 -233
- package/scripts/discord-sync-final.js +0 -218
- package/scripts/discord-sync-simple.js +0 -175
- package/scripts/discord-sync-working.js +0 -187
- package/scripts/discord-sync.js +0 -181
package/README.md
CHANGED
|
@@ -1,247 +1,189 @@
|
|
|
1
1
|
<div style="display: flex; align-items: center; gap: 12px;">
|
|
2
2
|
<img src="https://raw.githubusercontent.com/Wolfe-Jam/faf/main/assets/logos/orange-smiley.svg" alt="FAF" width="40" />
|
|
3
3
|
<div>
|
|
4
|
-
<h1 style="margin: 0; color: #FF8C00;">faf-mcp
|
|
4
|
+
<h1 style="margin: 0; color: #FF8C00;">faf-mcp</h1>
|
|
5
5
|
<p style="margin: 4px 0 0 0;"><strong>IANA-Registered Format for AI Context</strong> · <code>application/vnd.faf+yaml</code></p>
|
|
6
6
|
</div>
|
|
7
7
|
</div>
|
|
8
8
|
|
|
9
|
-
>
|
|
9
|
+
> **.FAF optimizes AI for your codebase.** At 100% (Gold Code), AI stops guessing and starts knowing. Universal MCP server for Cursor, Windsurf, Cline, VS Code, and all MCP-compatible platforms.
|
|
10
10
|
|
|
11
|
-
**Universal version of [claude-faf-mcp](https://github.com/Wolfe-Jam/claude-faf-mcp)** — Anthropic-approved MCP server, now compatible with all platforms.
|
|
11
|
+
**Universal version of [claude-faf-mcp](https://github.com/Wolfe-Jam/claude-faf-mcp)** — Anthropic-approved MCP server, now compatible with all platforms.
|
|
12
12
|
|
|
13
13
|
[](https://www.npmjs.com/package/faf-mcp)
|
|
14
|
-
[](https://discord.com/invite/56fPBUJKfk)
|
|
15
|
-
[](https://chromewebstore.google.com/detail/lnecebepmpjpilldfmndnaofbfjkjlkm)
|
|
16
14
|
[](https://faf.one)
|
|
17
15
|
[](https://opensource.org/licenses/MIT)
|
|
18
16
|
|
|
19
17
|
---
|
|
20
18
|
|
|
21
|
-
##
|
|
22
|
-
|
|
23
|
-
**1. Install:**
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
npm install -g faf-mcp
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
**2. Copy and paste this to your AI:**
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
Install the FAF MCP server: npm install -g faf-mcp, then add this to my MCP config: {"mcpServers": {"faf": {"command": "npx", "args": ["-y", "faf-mcp"]}}} and restart.
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Platform-Specific Setup
|
|
19
|
+
## The Problem: Context-Drift
|
|
36
20
|
|
|
37
|
-
|
|
21
|
+
AI assistants forget. They misunderstand. They drift.
|
|
38
22
|
|
|
39
|
-
|
|
23
|
+
Every new session, every new file, every new developer — AI starts guessing again. Your codebase context leaks away. Yesterday's perfect assistant becomes today's confused intern.
|
|
40
24
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
**VS Code:** Install MCP extension, then add server config
|
|
44
|
-
|
|
45
|
-
**Claude Desktop:** Use the [dedicated claude-faf-mcp package](https://github.com/Wolfe-Jam/claude-faf-mcp) for optimized Claude integration
|
|
25
|
+
**.FAF fixes this permanently.**
|
|
46
26
|
|
|
47
27
|
---
|
|
48
28
|
|
|
49
|
-
##
|
|
50
|
-
|
|
51
|
-
> **"README for the AI era"** — Google Gemini
|
|
52
|
-
|
|
53
|
-
<div align="center">
|
|
54
|
-
<img src="https://raw.githubusercontent.com/Wolfe-Jam/faf-mcp/main/assets/Project-faf-pckg-json-README.png" alt="project.faf file positioning" width="600" />
|
|
55
|
-
<p><em><strong>project.faf is to AI context what package.json is to dependencies</strong></em></p>
|
|
56
|
-
<p><em>Lives at the project root, between package.json and README.md</em></p>
|
|
57
|
-
</div>
|
|
58
|
-
|
|
59
|
-
**The closer you get to 100% the better AI can assist you.**
|
|
60
|
-
|
|
61
|
-
At 55% you are building your project with half a blueprint and basically flipping a coin with AI. .FAF defines, and AI becomes optimized for Context with the project.faf file.
|
|
29
|
+
## The Solution: Gold Code
|
|
62
30
|
|
|
63
31
|
```
|
|
64
32
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
65
|
-
|
|
33
|
+
🏆 FAF AI-READINESS SCORE: 100/100 — GOLD CODE
|
|
66
34
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
67
35
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
├─ Architecture Map [██████] 100% ├─ 17 Native Tools [██████] 100%
|
|
71
|
-
├─ Domain Model [██████] 100% ├─ IANA Format [██████] 100%
|
|
72
|
-
└─ Version Tracking [██████] 100% └─ Universal Context [██████] 100%
|
|
36
|
+
At 100%, AI is optimized. No more guessing.
|
|
37
|
+
Peak AI performance activated.
|
|
73
38
|
|
|
74
|
-
|
|
75
|
-
├─
|
|
76
|
-
├─
|
|
77
|
-
|
|
78
|
-
└─ Zero Memory Leaks [██████] 100% └─ 14 Bundled Cmds [██████] 100%
|
|
39
|
+
├─ Project DNA locked in ├─ Zero context-drift
|
|
40
|
+
├─ Architecture understood ├─ Eternal bi-sync active
|
|
41
|
+
├─ Domain model captured ├─ Team alignment permanent
|
|
42
|
+
└─ Every session starts smart └─ AI works WITH you, not around you
|
|
79
43
|
|
|
80
|
-
🏆 project.faf score: podium
|
|
81
44
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
82
45
|
```
|
|
83
46
|
|
|
84
47
|
---
|
|
85
48
|
|
|
86
|
-
##
|
|
49
|
+
## 💎 Lifecycle Value
|
|
50
|
+
|
|
51
|
+
Setup savings get you started. Lifecycle optimization keeps you ahead.
|
|
87
52
|
|
|
88
|
-
|
|
53
|
+
| When | Without FAF | With FAF |
|
|
54
|
+
|------|-------------|----------|
|
|
55
|
+
| **Day 1** | 20 min setup per dev | 0 min — instant context |
|
|
56
|
+
| **Month 1** | AI forgets between sessions | AI remembers everything |
|
|
57
|
+
| **Year 1** | New devs re-explain everything | New devs inherit full context |
|
|
58
|
+
| **Year 3+** | Institutional knowledge lost | Project DNA preserved forever |
|
|
89
59
|
|
|
90
|
-
|
|
60
|
+
**Setup savings: 20 minutes. Lifecycle savings: Infinite.**
|
|
91
61
|
|
|
92
62
|
---
|
|
93
63
|
|
|
94
|
-
##
|
|
64
|
+
## ⚡ Quick Start
|
|
95
65
|
|
|
96
|
-
**
|
|
66
|
+
**1. Install:**
|
|
97
67
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
Use FAF to initialize my project
|
|
101
|
-
Use FAF to sync my project.faf to all platforms
|
|
102
|
-
Use FAF to score my AI-readiness
|
|
103
|
-
Use FAF to enhance my project context
|
|
104
|
-
Use FAF to create platform sync files
|
|
68
|
+
```bash
|
|
69
|
+
npm install -g faf-mcp
|
|
105
70
|
```
|
|
106
71
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
**Claude Desktop:**
|
|
110
|
-
- ✅ Calls MCP tool instead of searching web
|
|
111
|
-
- ✅ No void container issues
|
|
112
|
-
- ✅ Direct tool invocation
|
|
113
|
-
|
|
114
|
-
**Claude.ai (Web):**
|
|
115
|
-
- ✅ Stops web search addiction immediately
|
|
116
|
-
- ✅ Forces MCP tool usage
|
|
117
|
-
- ✅ No more guessing
|
|
118
|
-
|
|
119
|
-
**Cursor / Windsurf / Cline:**
|
|
120
|
-
- ✅ MCP standard compliance
|
|
121
|
-
- ✅ Tool invocation (not manual file creation)
|
|
122
|
-
- ✅ Consistent behavior
|
|
72
|
+
**2. Add to your MCP config:**
|
|
123
73
|
|
|
124
|
-
|
|
74
|
+
```json
|
|
75
|
+
{"mcpServers": {"faf": {"command": "npx", "args": ["-y", "faf-mcp"]}}}
|
|
76
|
+
```
|
|
125
77
|
|
|
126
|
-
|
|
127
|
-
- ❌ AI searches the web
|
|
128
|
-
- ❌ AI creates files manually
|
|
129
|
-
- ❌ Void containers
|
|
130
|
-
- ❌ Inconsistent results
|
|
78
|
+
### Platform-Specific Setup
|
|
131
79
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
80
|
+
| Platform | Config File |
|
|
81
|
+
|----------|-------------|
|
|
82
|
+
| **Cursor** | `~/.cursor/mcp.json` |
|
|
83
|
+
| **Windsurf** | `~/.codeium/windsurf/mcp_config.json` |
|
|
84
|
+
| **Cline** | Cline MCP settings |
|
|
85
|
+
| **VS Code** | MCP extension config |
|
|
86
|
+
| **Claude Desktop** | Use [claude-faf-mcp](https://github.com/Wolfe-Jam/claude-faf-mcp) |
|
|
136
87
|
|
|
137
88
|
---
|
|
138
89
|
|
|
139
|
-
##
|
|
90
|
+
## 🔄 Eternal Bi-Sync
|
|
140
91
|
|
|
141
|
-
|
|
92
|
+
The magic: `.faf` ↔ `CLAUDE.md` stay synchronized in milliseconds.
|
|
142
93
|
|
|
143
94
|
```
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
Cursor → .faf → MCP
|
|
148
|
-
Windsurf → .faf → MCP
|
|
149
|
-
Cline → .faf → MCP
|
|
150
|
-
VS Code → .faf → MCP
|
|
151
|
-
Claude → .faf → MCP
|
|
152
|
-
Gemini → .faf → MCP
|
|
95
|
+
project.faf ←──── 8ms ────→ CLAUDE.md
|
|
96
|
+
│ │
|
|
97
|
+
└── Single source of truth ──┘
|
|
153
98
|
```
|
|
154
99
|
|
|
155
|
-
|
|
100
|
+
- Update either file → both stay aligned
|
|
101
|
+
- Zero manual maintenance
|
|
102
|
+
- Works across teams, branches, sessions
|
|
103
|
+
- **Context never goes stale**
|
|
156
104
|
|
|
157
105
|
---
|
|
158
106
|
|
|
159
|
-
##
|
|
160
|
-
|
|
161
|
-
### 17 Native MCP Tools
|
|
162
|
-
- **faf_init** - Initialize project.faf with auto-detection
|
|
163
|
-
- **faf_score** - AI-readiness scoring engine
|
|
164
|
-
- **faf_enhance** - Intelligent enhancement with auto-detection
|
|
165
|
-
- **faf_read** - Parse and validate FAF files
|
|
166
|
-
- **faf_write** - Create/update FAF with validation
|
|
167
|
-
- **faf_sync** - Synchronize context across platforms
|
|
168
|
-
- **faf_bi_sync** - Bi-directional CLAUDE.md sync
|
|
169
|
-
|
|
170
|
-
### CLI Fallback (40+ commands)
|
|
171
|
-
- **faf readme** - Smart 6 Ws extraction from README.md
|
|
172
|
-
- **faf human-add** - Non-interactive human context entry
|
|
173
|
-
- **faf git** - GitHub repo extraction (Git CLI, no rate limits)
|
|
174
|
-
- Plus all other faf-cli commands
|
|
175
|
-
|
|
176
|
-
### IANA-Registered Standard
|
|
177
|
-
- Official MIME type: `application/vnd.faf+yaml`
|
|
178
|
-
- W3C-compliant structured format
|
|
179
|
-
- Universal AI context protocol
|
|
180
|
-
- Cross-platform compatibility
|
|
181
|
-
|
|
182
|
-
### Championship Performance
|
|
183
|
-
- **16.2x faster** than CLI versions (direct function calls vs process spawning)
|
|
184
|
-
- **19ms average** execution across all bundled commands
|
|
185
|
-
- **Fastest: 1ms** (formats command)
|
|
186
|
-
- **Zero memory leaks** with F1-grade engineering
|
|
187
|
-
|
|
188
|
-
---
|
|
107
|
+
## Tier System: From Blind to Optimized
|
|
189
108
|
|
|
190
|
-
|
|
109
|
+
| Tier | Score | Status |
|
|
110
|
+
|------|-------|--------|
|
|
111
|
+
| 🏆 **Trophy** | 100% | **AI Optimized** — Gold Code |
|
|
112
|
+
| 🥇 **Gold** | 99%+ | Near-perfect context |
|
|
113
|
+
| 🥈 **Silver** | 95%+ | Excellent |
|
|
114
|
+
| 🥉 **Bronze** | 85%+ | Production ready |
|
|
115
|
+
| 🟢 **Green** | 70%+ | Solid foundation |
|
|
116
|
+
| 🟡 **Yellow** | 55%+ | AI flipping coins |
|
|
117
|
+
| 🔴 **Red** | <55% | AI working blind |
|
|
118
|
+
| 🤍 **White** | 0% | No context at all |
|
|
191
119
|
|
|
192
|
-
|
|
193
|
-
- **[Getting Started](https://github.com/Wolfe-Jam/claude-faf-mcp/blob/main/docs/getting-started.md)** - Installation & setup
|
|
194
|
-
- **[MCP Tools Reference](https://github.com/Wolfe-Jam/claude-faf-mcp/blob/main/docs/mcp-tools.md)** - All 17 native tools
|
|
195
|
-
- **[FAQ](https://github.com/Wolfe-Jam/claude-faf-mcp/blob/main/docs/FAQ.md)** - Common questions
|
|
196
|
-
- **[CHANGELOG](./CHANGELOG.md)** - Version history
|
|
120
|
+
**At 55%, AI is guessing half the time.** At 100%, AI is optimized.
|
|
197
121
|
|
|
198
122
|
---
|
|
199
123
|
|
|
200
|
-
##
|
|
124
|
+
## 💬 use>faf | Prompt Pattern
|
|
125
|
+
|
|
126
|
+
**Start every prompt with "Use FAF"** to invoke MCP tools:
|
|
201
127
|
|
|
202
|
-
|
|
128
|
+
```
|
|
129
|
+
Use FAF to initialize my project
|
|
130
|
+
Use FAF to score my AI-readiness
|
|
131
|
+
Use FAF to sync my context
|
|
132
|
+
Use FAF to enhance my project
|
|
133
|
+
```
|
|
203
134
|
|
|
204
|
-
|
|
205
|
-
**🏅 First & Only** - Persistent Project Context MCP Server approved by Anthropic
|
|
206
|
-
**🏅 Creators of Context-Mirroring** - faf_bi_sync creates native files for all platforms
|
|
207
|
-
**🏅 Google Chrome-Approved** - Published Chrome Extension
|
|
208
|
-
**🏅 15K+ npm Downloads** - Proven adoption across the FAF ecosystem
|
|
135
|
+
Works on all platforms — stops web search, forces tool usage.
|
|
209
136
|
|
|
210
|
-
|
|
137
|
+
---
|
|
211
138
|
|
|
212
|
-
|
|
139
|
+
## 🛠️ 17 Native MCP Tools
|
|
213
140
|
|
|
214
|
-
|
|
141
|
+
| Tool | Purpose |
|
|
142
|
+
|------|---------|
|
|
143
|
+
| `faf_init` | Initialize project.faf |
|
|
144
|
+
| `faf_score` | Check AI-readiness (0-100%) |
|
|
145
|
+
| `faf_sync` | Sync context across platforms |
|
|
146
|
+
| `faf_bi_sync` | Bi-directional .faf ↔ CLAUDE.md |
|
|
147
|
+
| `faf_enhance` | Intelligent enhancement |
|
|
148
|
+
| `faf_read` | Parse and validate FAF files |
|
|
149
|
+
| `faf_write` | Create/update FAF with validation |
|
|
215
150
|
|
|
216
|
-
|
|
151
|
+
Plus CLI fallback with 40+ commands.
|
|
217
152
|
|
|
218
|
-
|
|
153
|
+
---
|
|
219
154
|
|
|
220
|
-
|
|
155
|
+
## 🎯 The .FAF Position
|
|
221
156
|
|
|
222
|
-
|
|
157
|
+
```
|
|
158
|
+
Platform Context Protocol
|
|
159
|
+
──────── ─────── ────────
|
|
160
|
+
Cursor → .faf → MCP
|
|
161
|
+
Windsurf → .faf → MCP
|
|
162
|
+
Cline → .faf → MCP
|
|
163
|
+
VS Code → .faf → MCP
|
|
164
|
+
Claude → .faf → MCP
|
|
165
|
+
Any IDE → .faf → MCP
|
|
166
|
+
```
|
|
223
167
|
|
|
224
|
-
|
|
168
|
+
**.FAF is the foundational layer.** Universal context format. IANA-registered. Works everywhere.
|
|
225
169
|
|
|
226
170
|
---
|
|
227
171
|
|
|
228
172
|
## 📦 Ecosystem
|
|
229
173
|
|
|
230
|
-
- **[
|
|
231
|
-
- **[
|
|
232
|
-
- **[
|
|
233
|
-
- **[
|
|
234
|
-
- **[faf.one](https://faf.one)** - Official website and documentation
|
|
235
|
-
- **[Discord Community](https://discord.com/invite/56fPBUJKfk)** - Join the discussion
|
|
174
|
+
- **[claude-faf-mcp](https://npmjs.com/package/claude-faf-mcp)** — Claude Desktop (52 tools)
|
|
175
|
+
- **[faf-cli](https://npmjs.com/package/faf-cli)** — Terminal CLI (18k+ downloads)
|
|
176
|
+
- **[faf-wasm](https://www.npmjs.com/package/faf-wasm)** — WASM SDK (<5ms scoring)
|
|
177
|
+
- **[faf.one](https://faf.one)** — Official website
|
|
236
178
|
|
|
237
179
|
---
|
|
238
180
|
|
|
239
181
|
## 📄 License
|
|
240
182
|
|
|
241
|
-
MIT License
|
|
183
|
+
MIT License — Free and open source
|
|
242
184
|
|
|
243
185
|
---
|
|
244
186
|
|
|
245
|
-
**
|
|
187
|
+
**Zero drift. Eternal sync. AI optimized.** 🏆
|
|
246
188
|
|
|
247
189
|
*"It's so logical if it didn't exist, AI would have built it itself" — Claude*
|
package/dist/index.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"note":"Placeholder for Vercel build"}
|
|
@@ -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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"}
|