TL;DR: faf-cli opened the authoring. .FAF Context
(faf-mcp) stopped carrying copies. One score, the same files, and the claims
on the box are true.
In Plain English
Old state. You had a CLI that authored project.faf, scored
it, and exported AGENTS.md / GEMINI.md / .cursorrules / CLAUDE.md. And you had an IDE MCP server that
did the same jobs with its own copies. The copies drifted. The README described a
hosted door this package does not run. Two authors. Two numbers. A project lying about
itself.
Fix. The CLI made that authoring public. The MCP server composes it
in-process. Nothing ported. Nothing shelled out to whatever faf happens to
be on PATH.
New state. Terminal or editor, same bytes, same number. The CLI is the author. .FAF Context is the door into Cursor, VS Code, Windsurf, Cline — not a second product.
Two packages. One author.
faf-cli is the author. It scores project.faf. It authors the
instruction files. That is the tool.
Authoring is more powerful than writing. That's what we call it.
.FAF Context is the door. faf-mcp is how that same context
shows up in the editor over MCP. Local stdio. The host already has the slot. We fill it.
The adapter is a door. It does not get a second story.
What we told ourselves
A ported renderer would stay in sync with faf export. A local score would
match the CLI. The docs would describe what the binary actually does.
That sentence is the product. It was not what left the function.
What was on disk
Same project. Two authors. Two truths.
| CLI | MCP, before 3.0 | |
|---|---|---|
| Score | the CLI scorer, on the bytes on disk | a local heuristic — 29 points off, on the same file |
| AGENTS.md · GEMINI.md · .cursorrules | faf export | a ported copy of the authoring |
| What the box said | local stdio | a hosted endpoint this package does not run |
The rule
If the terminal and the IDE can disagree about the same project, the project is lying. FAF don't lie has to hold on disk, not in the README.
So the CLI opened, and the door composed
Not a better copy. The same authoring the CLI already uses — public, so a consumer can call it instead of porting it.
- One score. Whatever path you take, the number is the CLI's number on the file on disk.
- Same files. The instruction files the editor authors are the files
faf exportauthors. - One injector. Re-export is one block, every run. A stacked file is repaired on the next export.
That is the whole lesson. The rest is versions.
WITH, not MORE
This is not a fifth format. The format did not grow. Cursor did not get replaced. VS Code did not get replaced. Complementary — we fill the slot the host already has.
.FAF Context runs locally over stdio. There is no hosted endpoint on this package. A door that pretends to be a product is how the copy starts lying again.
The two ships
The release notes are the versions. This is why they exist.
- The Open Renderers Edition — faf-cli 7.12. Consumers compose instead of port.
- The Compose Edition — faf-mcp 3.0, .FAF Context. The door composes that authoring in-process.
faf export --agents bunx faf-mcpFeedback welcome
Questions, nits, suggestions — guide the next version. Tell us what you want to see.
