todo2code
Enables analysis of Git commit history to extract intent evidence and build DSL graphs.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@todo2coderun pipeline on /path/to/repo with TODO.md and docs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
todo2code (t2c)
todo2code buduje wspólny Intent Evidence DSL z poleceń, historii Git, aktualnego kodu, list zadań, changelogu i dokumentacji. Następnie łączy rekordy w graf przepływu wiedzy, wykrywa rozbieżności i generuje raport dla zespołu.
Projekt działa na Node.js/TypeScript. Python i Go są używane wyłącznie jako małe adaptery do swoich standardowych parserów (ast oraz go/ast); żaden z nich nie ma zewnętrznych zależności. Oba toolchainy są opcjonalne — ich brak degraduje się do ostrzeżenia. Integracje są dostępne przez CLI, MCP/stdio i A2A v1.0/JSON-RPC.
Reality vs Intent
Related MCP server: graphmemory
GUI

Granica LLM
Etap | Mechanizm | LLM |
NL → DSL | reguły, słowniki, heurystyki; opcjonalny lokalny TensorFlow | nie |
10 commitów Git → DSL |
| nie |
TypeScript/JavaScript/Python/Go AST → DSL | TypeScript Compiler API, Python | nie |
TODO + CHANGELOG → DSL | deterministyczny parser Markdown | nie |
Dokumentacja → DSL | OpenRouter structured outputs | tak |
Linkowanie i diagnostyka | deterministyczny graf relacji | nie |
Graf DSL → raport NL | OpenRouter; wejściem jest tylko graf i diagnostyka | tak |
Moduły deterministyczne nie importują klienta OpenRouter. Sprawdza to npm run verify:no-llm.
Szybki start
Wymagania: Node.js 20+, npm, Git i opcjonalnie Python 3.10+.
cp .env.example .env
npm install
npm run build
node dist/src/cli.js doctorPełny pipeline bez połączeń LLM:
node dist/src/cli.js pipeline examples \
--task task.md \
--todo TODO.md \
--changelog CHANGELOG.md \
--docs 'docs/**/*.md' \
--no-docs-llm \
--out .intent-demoPełny pipeline z OpenRouter:
# w .env:
# OPENROUTER_API_KEY=...
# OPENROUTER_DOC_MODEL=openrouter/auto-beta
# OPENROUTER_SUMMARY_MODEL=openrouter/auto-beta
node dist/src/cli.js pipeline /ścieżka/do/repo \
--task project/ticket-014/README.md \
--todo TODO.md \
--changelog CHANGELOG.md \
--docs 'README.md,docs/**/*.md,project/**/*.md'Tryb ciągły skanuje repozytorium deterministycznie i generuje raport najwyżej raz na wskazany interwał:
node dist/src/cli.js watch . \
--interval 60 \
--scan-interval 2 \
--no-docs-llm \
--out .intentWatcher scala reguły z .gitignore, .dockerignore i .intentignore, pomija
symlinki oraz po raporcie odświeża snapshot, więc własne artefakty nie tworzą
pętli. t2c init instaluje bazowy .intentignore; --no-initial-report
pozwala czekać na pierwszą rzeczywistą zmianę.
CLI
t2c init [root]
t2c doctor
t2c extract nl <file> [--root .] [--out nl.intent.jsonl]
t2c extract git [--root .] [--count 10] [--out git.intent.jsonl]
t2c extract ast [root] [--out ast.intent.jsonl]
t2c extract markdown [--todo TODO.md] [--changelog CHANGELOG.md]
t2c extract docs [--patterns 'README.md,docs/**/*.md']
t2c link <*.intent.jsonl>... --out intent.graph.json
t2c diagnose intent.graph.json --out diagnostics.json
t2c diff before.graph.json after.graph.json --out graph.diff.json --svg graph.diff.svg
t2c diff --mode files before.ts after.ts --svg files.diff.svg --html files.diff.html
t2c diff --mode git . --rev HEAD --svg worktree.diff.svg
t2c reality intent.graph.json --diagnostics diagnostics.json --svg reality.svg --md reality.md
t2c summarize intent.graph.json --diagnostics diagnostics.json --out team-summary.md
t2c watch [root] [--interval 60] [--scan-interval 2] [--no-initial-report]
t2c pipeline [root] --task TASK.md --todo TODO.md --changelog CHANGELOG.md
t2c mcp
t2c a2aextract docs i summarize wymagają OPENROUTER_API_KEY. Pipeline może działać bez klucza: dokumentacja LLM zostaje jawnie pominięta, a raport może użyć oznaczonego fallbacku deterministycznego.
Tryb obserwowania
t2c watch pilnuje lokalnych zmian i generuje świeży raport najwyżej raz na minutę:
node dist/src/cli.js watch . --task TASK.md --no-docs-llmObowiązują dwa niezależne czasy:
Opcja | Domyślnie | Znaczenie |
| 2 s | jak szybko zmiana zostaje zauważona |
| 60 s | minimalny odstęp między dwoma raportami |
Zmiany napływające częściej niż --interval są kumulowane, a nie kolejkowane: po
upływie progu powstaje jeden raport obejmujący wszystko, co się zmieniło. Raport
nigdy nie startuje, gdy poprzedni jeszcze trwa, więc wolny pipeline nie tworzy
nakładających się runów. --no-initial-report pomija raport startowy i czeka na
pierwszą realną zmianę.
Detekcja opiera się na cyklicznym skanowaniu (rozmiar + mtime), a nie na
fs.watch, który zależy od platformy i gubi zdarzenia pod obciążeniem. Skan jest
tani, bo katalogi wykluczone są odcinane przed odczytem — node_modules nigdy
nie jest czytane.
Pliki ignorowane
Watch pomija ścieżki wymienione w trzech plikach, czytanych w tej kolejności:
.gitignore.dockerignore.intentignore
Późniejszy plik wygrywa, więc .intentignore może przywrócić ścieżkę przez !wzorzec.
.intentignore jest zakładany przez t2c init i wyklucza m.in. wszystkie katalogi
kropkowe (.*/ — .git, .idea, .venv, .github, .cache), katalog .intent/
z własnymi raportami, wyjścia buildu (node_modules/, dist/, target/,
__pycache__/), lockfile'e oraz logi i pliki tymczasowe.
Składnia jest zgodna z gitignore: komentarze #, negacja !, końcowy /
ogranicza regułę do katalogów, wzorzec bez ukośnika dopasowuje się na dowolnej
głębokości, a ** przechodzi przez katalogi. Reguły .dockerignore są
interpretowane tą samą semantyką, czyli nieco szerzej niż robi to Docker
(kotwiczący wzorce do korzenia kontekstu) — wpisy w tym pliku nazywają wyjścia
buildu, więc wykluczenie zagnieżdżonej kopii jest zamierzone.
Artefakty runu
.intent/
├── latest.json
└── runs/<run-id>/
├── nl.intent.jsonl
├── git.intent.jsonl
├── ast.intent.jsonl
├── todo.intent.jsonl
├── changelog.intent.jsonl
├── document.intent.jsonl
├── intent.graph.json
├── diagnostics.json
├── team-summary.md
└── manifest.jsonKażdy rekord zawiera identyfikator, statement, lifecycle, dokładne źródło, hash treści, klasę epistemiczną, confidence i podstawy wnioskowania. Fakty AST mają confidence 1.0; rekordy z dokumentacji LLM są oznaczone jako llm_inference i mają confidence maksymalnie 0.85.
MCP
Uruchomienie serwera stdio:
node dist/src/interfaces/mcp.jsPrzykładowa konfiguracja hosta MCP:
{
"mcpServers": {
"todo2code": {
"command": "node",
"args": ["/absolute/path/todo2code/dist/src/interfaces/mcp.js"],
"env": {
"T2C_ROOT": "/absolute/path/workspace",
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
}
}
}
}Dostępne narzędzia: extract_nl, extract_git, extract_ast, extract_markdown, extract_docs, link, diagnose, diff, diff_files, diff_git, reality, summarize, pipeline. Serwer udostępnia też zasoby t2c://latest/*.
Diff DSL, SVG i SDK
Porównanie dwóch grafów zwraca kanoniczny t2c.diff/v1 z rekordami added, removed, changed i liczbą elementów bez zmian. --mode files tworzy deterministyczny diff linii t2c.filediff/v1, a --mode git stosuje ten sam silnik do rewizji, indeksu lub drzewa roboczego. Dostępne są widoki SVG, HTML oraz unified diff; nie wymagają bibliotek renderujących i nie wykonują treści pochodzącej z plików.
Polecenie t2c reality projektuje pojedynczy graf do t2c.reality/v1: zestawia deklaracje z taska, TODO i dokumentacji z faktami Git/AST, a rozbieżności pokazuje jako SVG albo tabelę Markdown.
Po uruchomieniu A2A dostępne są:
frontend:
http://localhost:8787/ui— pobiera historię z.intent/runs, domyślnie wybiera dwa najnowsze kompletne runy i automatycznie pokazuje ich diff SVG;historia runów:
GET http://localhost:8787/api/runs;REST diff:
POST http://localhost:8787/api/diff;A2A/MCP action:
diff.
POST /api/diff domyślnie zwraca pełny t2c.diff/v1. Ustawienie compact: true
zwraca projekcję przeznaczoną dla UI: fingerprinty, liczniki summary i opcjonalny
SVG, bez pełnych tablic rekordów oraz relacji.
SDK TypeScript/JavaScript:
import { Todo2CodeClient } from 'todo2code/sdk';
const client = new Todo2CodeClient({ baseUrl: 'http://localhost:8787' });
const result = await client.diffGraphs(beforeGraph, afterGraph);
console.log(result.diff.summary, result.svg);
const files = await client.diffTextFiles('before.ts', 'after.ts', { includeHtml: true });
const reality = await client.reality(afterGraph);SDK Python nie ma zewnętrznych zależności:
from sdk.python import Todo2CodeClient
client = Todo2CodeClient("http://localhost:8787")
result = client.diff_graphs(before_graph, after_graph)
print(result["diff"]["summary"])
files = client.diff_text_files("before.ts", "after.ts", include_html=True)
reality = client.reality(after_graph)Można go także zainstalować przez python3 -m pip install ./sdk/python i importować jako todo2code_sdk.
Uruchamialne przykłady znajdują się w examples/sdk/typescript.mjs i examples/sdk/python.py.
Pomiary oraz bezpieczne i semantycznie istotne dalsze optymalizacje opisuje docs/OPTIMIZATION.md.
SDK dla pięciu języków
Katalog sdk/ zawiera pełne klienty A2A v1.0 udostępniające wszystkie akcje runtime'u (nie tylko diff), wraz z typami Intent DSL:
Język | Katalog | Zależności | Klasa |
TypeScript / Node | brak |
| |
Python 3.10+ | brak |
| |
Go 1.21+ | brak |
| |
Rust 1.70+ |
|
| |
PHP 8.1+ | brak |
|
Każdy język ma uruchamialny przykład w sdk/<język>/examples/. Wszystkie przepuszczają ten sam zbiór rekordów przez link i muszą otrzymać identyczny fingerprint grafu — to test wierności round-tripu typów. Szczegóły: sdk/README.md.
Python udostępnia także lokalny TypeScriptRuntime. Nie kopiuje implementacji
DSL do Pythona, tylko uruchamia przez Node.js skompilowany dist/src/cli.js:
make python-wheel
python3 -m pip install .intent-packages/python/todo2code_sdk-*.whl
T2C_TYPESCRIPT_CLI="$PWD/dist/src/cli.js" python3 sdk/python/examples/local_runtime.pyMost obsługuje pipeline, diagnose, graph diff oraz reality bez serwera
A2A. Szczegóły i przykład API: sdk/python/README.md.
Przykładowe repozytoria
examples/backend (HTTP API bez zależności) i examples/frontend (panel DOM bez frameworka) to gotowe wejścia dla runtime'u DSL. Każde ma task.md, TODO.md, CHANGELOG.md, README.md i src/, i celowo zawiera rozbieżności plan↔kod, żeby t2c reality miał co pokazać:
node dist/src/cli.js pipeline examples/backend \
--task task.md --todo TODO.md --changelog CHANGELOG.md \
--docs 'README.md' --no-docs-llm --out .intent
node dist/src/cli.js reality examples/backend/.intent/runs/<run-id>/intent.graph.json \
--diagnostics examples/backend/.intent/runs/<run-id>/diagnostics.json \
--svg reality.svg --md reality.mdA2A v1.0
node dist/src/interfaces/a2a.jsAgent Card:
curl http://localhost:8787/.well-known/agent-card.jsonUruchomienie pipeline przez SendMessage:
curl -s http://localhost:8787/a2a \
-H 'Content-Type: application/json' \
-H 'A2A-Version: 1.0' \
-d '{
"jsonrpc":"2.0",
"id":"req-1",
"method":"SendMessage",
"params":{
"message":{
"messageId":"msg-1",
"role":"ROLE_USER",
"parts":[{
"data":{
"action":"pipeline",
"input":{
"root":".",
"task":"TASK.md",
"includeDocsLlm":false
}
},
"mediaType":"application/json"
}]
}
}
}'Interfejs A2A jest v1-only: nagłówek A2A-Version: 1.0 (albo parametr zapytania o tej nazwie) jest wymagany. Brak nagłówka oznacza protokół 0.3 i jest odrzucany kodem -32009; aliasy metod v0.3 nie są przyjmowane. GetTask i CancelTask zwracają task bez wrappera, a ListTasks obsługuje filtry, cursor pagination, historyLength oraz includeArtifacts (domyślnie false).
Ustawienie T2C_A2A_TOKEN włącza Bearer authentication i izolację tasków według principalu. Domyślnie MCP i A2A nie mogą analizować ścieżek poza T2C_ROOT; wyjątek wymaga jawnego T2C_ALLOW_OUTSIDE_ROOT=true.
Domyślny task store A2A pozostaje pamięciowy. Aby zachować taski po restarcie i współdzielić je między replikami używającymi tego samego wolumenu, ustaw:
T2C_A2A_TASK_STORE=.intent/a2a-tasks.jsonSnapshot jest zapisywany atomowo z uprawnieniami 0600. Blokada katalogowa
chroni idempotency i aktualizacje między procesami; ścieżka podlega tym samym
ograniczeniom T2C_ROOT co pozostałe operacje runtime'u.
OpenRouter
Runtime używa POST /api/v1/chat/completions. Ekstraktor dokumentacji prosi o response_format: json_schema, wymusza provider.require_parameters, a przy braku wsparcia endpointu próbuje kontrolowanego fallbacku json_object. Opcjonalny plugin response-healing jest sterowany przez .env.
Klucz nie jest zapisywany do artefaktów, logów ani odpowiedzi MCP/A2A. doctor pokazuje jedynie status configured/not configured.
Opcjonalny TensorFlow
NL i Git zawsze mają deterministyczny klasyfikator słownikowy. Lokalny model TensorFlow można włączyć przez:
T2C_ENABLE_TF=true
T2C_TF_MODEL_PATH=/models/action/model.json
T2C_TF_LABELS=add,fix,remove,refactor,test,document,configure,analyze,unknownObok model.json musi znajdować się vocabulary.json, czyli mapa token → indeks. Model powinien przyjmować tensor [1, vocabulary_size] i zwracać rozkład klas. Przy błędzie modelu runtime wraca do heurystyk i zapisuje podstawę fallbacku w rekordzie.
Docker i Makefile
make setup
make verify
make demo
make docker-build
make docker-updocker compose montuje repozytorium pod /workspace, uruchamia A2A na porcie 8787 i zachowuje .intent w analizowanym workspace.
Diagnostyka
Wbudowane klasy obejmują m.in.:
PLANNED_NOT_IMPLEMENTED;IMPLEMENTED_NOT_PLANNED;IMPLEMENTED_NOT_DOCUMENTED;CHANGELOG_WITHOUT_IMPLEMENTATION;CONFLICTING_INTENT;AMBIGUOUS_REQUIREMENT;UNLINKED_RECORD.
ALIGNED oznacza wyłącznie brak wykrytej blokującej rozbieżności w dostępnych źródłach. Nie nadaje automatycznie statusu DONE i nie zastępuje decyzji człowieka.
Dokumentacja projektu
docs/ARCHITECTURE.md— komponenty i przepływ;docs/DSL.md— model danych i relacje;docs/REQUIREMENTS.md— śledzenie wymagań;docs/PROTOCOLS.md— MCP, A2A i OpenRouter;docs/SECURITY.md— granice dostępu i sekretów;docs/VALIDATION.md— zakres oraz wynik walidacji paczki;docs/OPTIMIZATION.md— zmierzone wąskie gardła runtime'u i zastosowane usprawnienia;sdk/README.md— SDK dla TypeScript, Pythona, Go, Rusta i PHP;docs/reference/original-monitoring-design.md— materiał wejściowy dostarczony do projektu.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseAqualityDmaintenanceAn MCP server that transforms repositories into queryable knowledge by combining static code analysis with git history tracking. It allows users to investigate codebase structure, identify fragile files based on churn, and receive risk assessments through natural language queries.Last updated7
- Alicense-qualityBmaintenanceAn MCP server that builds a semantic graph memory from a project directory, indexing documentation and code into graph structures and exposing 70+ MCP tools for search, knowledge management, task management, and more.Last updated13614Elastic 2.0
- Alicense-qualityDmaintenanceA comprehensive MCP server that provides a graph database for tracking software codebase components, their relationships, and associated tasks/goals.Last updated1MIT
- Alicense-qualityBmaintenanceMCP server that builds a deterministic, source-traceable knowledge index of any codebase, enabling glossary lookup, code graphs, and exact-token search with every fact linked to its source file and line.Last updated241MIT
Related MCP Connectors
A MCP server built for developers enabling Git based project management with project and personal…
MCP server for generating rough-draft project plans from natural-language prompts.
An MCP server that gives your AI access to the source code and docs of all public github repos
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/semcod/todo2code'
If you have feedback or need assistance with the MCP directory API, please join our Discord server