Infinite Code Next
MCP-сервер с нулевой настройкой, который даёт ИИ-агентам программирования постоянную, проверяемую память о кодовой базе — о решениях, стоящих за ней, о том, что уже было испробовано и отвергнуто, и о том, что никогда не должно сломаться, — привязанную к коду и переносимую вместе с ним по мере того, как код развивается.
Быстрый старт · Обозреватель · Обмен знаниями · Агентам · Как это работает · Бренд
Git blame говорит вам, кто изменил строку. Этот сервер говорит агенту, зачем существует код, что уже было испробовано и отвергнуто, и что должно оставаться неизменным — и он знает, когда его собственные знания устарели.
Проблема
Каждая сессия начинается с того, что ИИ-агент приходит без памяти. Он читает файлы, чтобы заново вывести то, что уже знал предыдущий агент. Затем он заново предлагает исправление, которое было отвергнуто три месяца назад, потому что ничто в репозитории не фиксирует, что оно уже было испробовано.
Дорогостоящее знание никогда не содержится в коде:
Код говорит | Он никогда не говорит |
| почему — что git наследует MCP-канал и задерживает каждый вызов на 20 секунд |
| что |
Класс-координатор | что сначала был испробован Redis-мьютекс и он заходит в тупик при разделении |
Этот сервер хранит этот слой, держит его привязанным к коду и сообщает вам, когда он больше не может за него поручиться.
Related MCP server: lore
Быстрый старт
pip install -e .Зарегистрируйтесь один раз в вашем MCP-клиенте — второго шага нет. Никакой админ-панели, никакого порта, никакого демона, никакой настройки для каждого репозитория.
claude mcp add icn -- infinite-code-next[mcp_servers.icn]
command = 'infinite-code-next'
args = []{ "mcpServers": { "icn": { "command": "infinite-code-next" } } }Сервер сам определяет, в каком репозитории он находится, по своей рабочей директории, и каждый ответ повторяет корень, который он определил, так что неправильное рабочее пространство сразу бросается в глаза.
Цикл
workspace(action="open") → a briefing: rules, prior failures, what is unverified
investigate("what you're doing") → code + rationale + blast radius, budgeted
... do the work ...
record(summary=..., warnings=[...], failed_attempts=[...])Два вызова, чтобы начать продуктивную работу. Один — чтобы оставить следующего агента умнее.
Обозреватель знаний
Всё, что знает сервер — репозиторий, файлы, символы, воспоминания и каждое ребро между ними — в виде одного интерактивного графа.
./explore.sh # macOS / Linux
explore.bat # Windows
icn-explore # if the package is on your PATHВыше: меню экспорта, открытое над полным графом.
Фильтр | по типу узла, серьёзности воспоминания, статусу привязки или типу ребра — счётчики обновляются в реальном времени |
Поиск | любого узла по имени, пути или тексту его тела |
Инспекция | щёлкните узел, чтобы увидеть его полное тело, метаданные и каждую типизированную связь |
Навигация | щёлкните любую связь, чтобы перейти туда — пройдите путь от предупреждения к коду, который оно защищает, к тесту, который его покрывает |
Масштаб и панорама | прокрутка и перетаскивание; размер узла — это степень вызова, так что несущий код выглядит несущим |
Экспорт | markdown, JSON графа, сама страница, PNG или только то, что сейчас на экране |
Автономный: один HTML-файл с встроенными данными. Никакого CDN, никакого этапа сборки, никакого npm. Сохраните его, отправьте по почте, закоммитьте — он всё равно работает.
icn-explore --no-serve -o graph.html # just write the file
icn-explore --port 8080 # pick the port
icn-explore --include-deleted # include tombstoned codeОбмен знаниями
Передайте знания, добытые с трудом в одной кодовой базе, другому человеку — или другому агенту.
Из обозревателя
Кнопка Экспорт предлагает всё нижеперечисленное, не покидая страницу. Всё это работает офлайн в браузере с встроенным графом — никакого вызова сервера, так что сохранённая страница всё равно экспортирует.
Markdown | читается где угодно и может быть повторно импортирован |
JSON графа | узлы и рёбра, в сыром виде |
Эта страница | автономный обозреватель, чтобы отправить кому-то |
Изображение | PNG текущего вида |
Копировать видимое | только то, что на экране — сначала примените фильтр и поиск, и отфильтрованный вид станет доступным для обмена поднабором |
Из CLI
icn-explore export -o knowledge.md # readable markdown, renders anywhere
icn-explore export -o knowledge.icn # bundle: markdown + graph
icn-explore export -o graph.json # raw graphMarkdown — это каноническая форма для обмена, и он читается сам по себе — в редакторе, в диффе, в вики, в pull request. База знаний, которую никто не может прочитать без инструмента, — это база знаний, которую никто не проверяет. JSON-блок в конце делает импорт без потерь.
icn-explore import knowledge.icn # bring it in
icn-explore import ./team-knowledge/ # a whole directory of .md / .icn
icn-explore import shared.md --preview # look first, import nothingИмпорт никогда не перезаписывает. Всё, что приходит извне, хранится с
authority='imported' и указанием источника, и привязывается только там, где
соответствующий символ действительно существует здесь. Воспоминание о коде, которого у вас нет, —
всё равно стоит сохранить — но оно не должно утверждать, что описывает фрагмент, которого никогда не видело.
Руководство для ИИ-агентов
Прочитайте этот раздел перед первым вызовом.
1. Сначала откройте — не читайте файлы для ориентации
workspace(action="open")Возвращает краткую сводку: правила, управляющие этим кодом, что уже было испробовано и
отвергнуто, что в настоящее время не проверено и где сосредоточены знания. Только заголовки
и идентификаторы — тела остаются за кадром, investigate() в одном вызове.
Это существует из-за измеренного сбоя. Каждая сессия по созданию этого сервера
начиналась с чтения файлов, чтобы заново вывести знания, которые уже существовали. open раньше
сообщал количество символов, что ничего не говорит вам о том, во что вы ввязываетесь.
Вы не можете задать правильный вопрос, пока не знаете, что есть на полке.
2. Исследуйте на простом языке — а не с помощью grep
investigate("I need to change refresh token rotation. What will I break?")Один вызов объединяет лексический поиск, поиск символов, обход графа кода, обход графа памяти, статус привязки и историю git и возвращает компактные капсулы в рамках бюджета токенов. Он ищет по коду и знаниям вместе, так что предупреждение найдёт вас, даже если вы никогда не называли файл, в котором оно живёт.
Аргумент | Используйте для |
|
|
| приблизительный потолок токенов (по умолчанию 9000) |
| следовать контрактам в другие репозитории |
| целевая диагностика по суженному подграфу |
3. Прежде чем удалять что-то несущее, спросите почему
investigate(action="why", symbol="RefreshCoordinator.acquire")decision: Use refresh-token rotation
--was followed by--> bug_history: Parallel refresh requests invalidate each other
--was followed by--> failed_attempt: Redis mutex could deadlock during a partition
--was followed by--> * invariant: All refreshes pass through RefreshCoordinator
may reintroduce: Parallel refresh requests invalidate each other
regression tests: test_parallel_refresh_regressionПлоский список из пяти воспоминаний заставляет вас реконструировать историю. Цепочка передаёт её целиком.
4. Записывайте, что вы узнали — особенно неудачи
record(
kind="bug_fix",
summary="Serialize refresh requests per session",
reasoning="Parallel requests rotated the same token.",
invariants=["All refreshes for one session pass through RefreshCoordinator"],
warnings=["Do not bypass RefreshCoordinator for new refresh entry points"],
failed_attempts=["Redis mutex deadlocks during a network partition"],
symbols=["RefreshCoordinator.acquire"],
tests=["test_parallel_refresh_regression"],
caused_by=[previous_memory_id],
)failed_attempts — самое ценное поле во всей системе. Ничто другое
в вашем инструментарии не фиксирует, что было испробовано и отвергнуто, и именно это
будущие агенты находят самым дорогим для повторного открытия.
record() возвращает primary_memory — идентификатор, представляющий это событие. Передайте его
как следующий caused_by.
Поле | Записывает |
| то, что должно оставаться неизменным |
| то, чего будущий агент не должен делать |
| что было испробовано и отвергнуто, и почему |
| принятые решения и отвергнутые альтернативы |
| допущения, на которые полагается другой код |
| факты, относящиеся к безопасности |
| измеренные факты производительности |
| ошибки, которые этот код уже вызывал раньше |
| шаги миграции или ограничения порядка |
| местные соглашения, которым стоит следовать |
| почему код устроен именно так |
| тесты, покрывающие это — создаёт ребро |
| межрепозиторные зависимости |
| идентификаторы воспоминаний, из которых следует это событие |
5. Доверяйте меткам
Каждое воспоминание несёт anchor_status. Всё, что не ACTIVE, не
было проверено на соответствие текущему коду — относитесь к этому как к зацепке, а не
факту.
memory(action="verify", memory_id=..., reason="confirmed it still applies")
memory(action="guard", memory_id=rule_id, body=test_memory_id)
memory(action="supersede", memory_id=..., body="what is true now")Как это работает
Привязки, которые знают, когда они устарели
Воспоминание не хранится в src/auth/oauth.ts:193. Номера строк — это
деталь рендеринга. Каждое воспоминание прикрепляется к семантической привязке: пути символа,
пути AST, отпечатку содержимого (структура + идентификаторы), скелетному
отпечатку (только структура) и его окружающему контексту.
Когда код меняется, каскад перемещает привязку — сначала самый дешёвый тест:
Шаг | Тест | Результат |
1 | Тот же отпечаток, то же место |
|
2 | Тот же отпечаток в другом месте, подтверждено |
|
3a | То же место, скелет идентичен — переименование |
|
3b | То же место, структура изменилась |
|
4 | Символ исчез, сильное совпадение по сходству |
|
5 | Ничто не проходит порог |
|
Два правила делают это надёжным:
Проверка срабатывает на правке, вызвавшей дрейф, а не по таймеру.
Каскад может только понижать доверие, но никогда не повышать его. После
DRIFTEDилиNEEDS_REVIEWтолько явныйmemory(action="verify")возвращает якорь вACTIVE— иначе следующий проход нашёл бы его свежеперепривязанный отпечаток совпадающим, сообщил бы «без изменений» и тихо вернул бы доверие памяти, которую никто никогда не подтверждал.
Обнаружение проблем
investigate() сначала сужает область до подграфа, а затем задаёт
целенаправленные вопросы по нему — никакого сканирования всего рабочего
пространства. Отличие от линтеров в том, что эти проверки осведомлены о
знаниях: линтер видит, что у функции нет теста; только этот граф знает, что
функция подчиняется инварианту, записанному после инцидента на производстве.
Находка | На какой вопрос отвечает |
| какие памяти отклонились от кода, который они описывают |
| обходит ли вызывающий код координатор или защиту |
| достижимо ли управляемое правило каким-либо тестом |
| есть ли у устаревшего символа живые вызывающие |
| есть ли у структурно идентичного собрата отсутствующее правило |
| разошёлся ли код с принятым решением |
| противоречат ли две памяти друг другу |
| указывает ли активное знание на удалённый код |
| можно ли в данный момент проверить межрепозиторную зависимость |
| появился ли вызывающий после проверки памяти |
| переместился ли код туда, куда каскад не последует |
Сбой детектора никогда не прерывает поиск: диагностика дополняет ответ, а не является его обязательным условием.
Без LLM в цикле
record() полностью детерминирован — разрешение сущностей, вывод рёбер и
обнаружение противоречий — это операции над графом, а не вызовы моделей.
Никаких API-ключей, сети или затрат на токены. Ранжирование — это
статическая, проверяемая формула с весами по намерениям, потому что у свежей
локальной установки нет размеченных данных о релевантности для обучения
реранкера.
Поиск, терпимый к тому, как люди печатают
Сначала выполняется точное и префиксное сопоставление; когда оно ничего не
находит, вступает приблизительный проход, так что subproces всё равно находит
предупреждение о subprocess. Дефисы соединяются в обе стороны — reanchor
находит текст с re-anchor и наоборот — потому что токенизатор FTS5 разбивает
по дефисам, и ни одно из написаний иначе не достигло бы другого.
Запасной вариант намеренно является запасным: ранжирование FTS превосходит любые локальные вычисления, когда у него вообще есть совпадения, поэтому включение нечёткого сопоставления по умолчанию позволило бы слабым совпадениям обойти точные.
Ранжирование учится на использовании
Каждая память отслеживает, как часто она показывалась и как часто агент открывал её полностью. Открытие весит значительно больше — быть показанным означает лишь совпадение с запросом, а быть открытым означает, что агент выбрал её из всего, что видел.
Бонус ограничен значением 0.5 и затухает с периодом полураспада 45 дней. Частота — это свидетельство, а не авторитет: без ограничения она приколотила бы популярную память прошлого месяца выше критического предупреждения, записанного вчера.
Хранение
%LOCALAPPDATA%\InfiniteCode\ (Windows)
$XDG_DATA_HOME/infinite-code/ (Linux)
~/Library/Application Support/InfiniteCode/ (macOS)
catalog.db repositories, aliases, checkouts, cross-repo edges
data/repos/<id>/repo.db DURABLE code graph, memories, anchors, events
cache/repos/<id>/ REBUILDABLE safe to delete at any time
<repo>/.agit/ agent git, gitignored
<repo>/.icn.toml optional, committed, tinyПереопределите корень с помощью INFINITE_CODE_HOME.
Идентичность — это никогда не путь и никогда не URL удалённого репозитория: оба
изменяемы. Она выводится из корневого коммита, необязательного зафиксированного
идентификатора проекта и нормализованных удалённых репозиториев, так что
перемещение клона или выполнение git remote set-url повторно привязывает к
существующим знаниям. Форк разделяет корневой коммит вышестоящего
репозитория, поэтому он явно разделяется, а не молча наследует памяти
вышестоящего.
Ничто никогда не уничтожается
Удалённые символы становятся надгробиями с их последним известным путём и коммитом, который их удалил.
Рёбра несут
valid_from_commit/valid_until_commitи становятсяHISTORICAL, а не исчезают.Исчезнувший чек-аут — это
MISSING; отключённый диск —OFFLINE. Ни то, ни другое ничего не удаляет.Исправления версионируют предыдущий текст; замещение сохраняет обе памяти и связь между ними.
Агент не может переписать память, созданную человеком — он должен заместить её, оставив разногласие видимым.
purge— единственная разрушительная операция и требуетconfirm=True.
Поиски идут через резолвер, который никогда не вызывает исключений: «в данный момент не удаётся разрешить» возвращается как данные вместе с последним известным значением.
Бренд
Знак — это одна идея продукта: фрагмент знания (фиолетовый), привязанный к коду (зелёный), который иначе не нёс бы о нём никакой памяти. Кольцо оставлено открытым — знание никогда не завершает проверку.
Толщина штрихов подобрана так, чтобы форма сохранялась до фавиконки 16px: узел памяти остаётся доминирующим, а три якоря читаются как треугольник, даже когда кольцо размывается.
Hex | Значение | |
| память, привязка — знание | |
| символы, тесты — проверенный код | |
| файлы — структура | |
| репозиторий, осторожность | |
| критическое, причинные цепочки | |
| поверхность карточки | |
| фон |
Одно правило управляет всем интерфейсом: структура тиха, знание громко.
CALLS и DEFINES отступают на задний план, чтобы якорные и причинные рёбра —
то, чего не может показать ни один другой инструмент, — несли цвет.
Ассеты живут в assets/; исходный код самого обозревателя —
src/icn/web/:
src/icn/web/
explorer.html shell and markup
explorer.css the design system above, as custom properties
explorer.js force layout, canvas rendering, inspector
mark.svg logo
banner.svg headerНастоящие .html, .css и .js, а не строковые литералы, чтобы редактор
воспринимал их как то, чем они являются. Они встраиваются во время рендеринга,
потому что опубликованная страница должна оставаться одним самодостаточным
файлом.
Инструменты
Инструмент | Действия |
|
|
| search · |
| одно событие → много привязанных фактов |
|
|
|
|
agit хранит контрольные точки агента в .agit/, полностью отдельно от
пользовательского .git. Сохраняйте контрольную точку рискованной работы,
восстанавливайте её, никогда не трогайте их историю.
Тестирование
python -m pytest172 теста, включая живой набор MCP, который запускает реальный сервер через stdio и проводит полный рабочий процесс агента через сетевой протокол, а также оснастку для грязного рабочего дерева, которая проверяет поведение каскада на незакоммиченных правках — переформатирование, переименование, изменение тела, перемещение между файлами, удаление, слабая миграция.
Этот режим не подтверждён опубликованной литературой, которая измеряет только ретроспективный анализ истории коммитов, поэтому здесь он измеряется напрямую.
Живой тест оправдывает себя. Он нашёл ошибку, которую не видит внутрипроцессное тестирование: вызовы подпроцессов наследовали stdin сервера, а это и есть канал протокола MCP. Git блокировался на нём на полный тайм-аут в 20 секунд при каждом вызове инструмента и мог проглотить байты протокола. Исправление снизило задержку инструмента с 20 с до 0.2 с.
Измерено на реальном репозитории из 4 621 файла
Полный индекс | 593 с → 34 747 символов, 58 857 рёбер, 43 038 рёбер вызовов |
Тёплое открытие | 0.77 с |
Запрос | 1.48 с |
Дизайн
Обоснование каждого решения находится рядом с кодом, которым оно управляет:
докстрока каждого модуля описывает, что он делает и, что важнее, какой сбой он
призван предотвратить. anchors.py объясняет, почему каскад может только
понижать доверие, briefing.py — почему open предлагает сводку, causal.py —
почему причинность утверждается и никогда не выводится.
Заметки по планированию хранятся локально и не входят в поставляемый артефакт.
Создано Ранитом Бхоумиком
Если агенту пришлось читать вашу кодовую базу, чтобы понять её, эти знания умерли вместе с сессией. Это исправление.
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
- -licenseBqualityNot gradedmaintenanceA memory system for AI coding tools that stores and retrieves codebase context with project isolation. Enables coding assistants to maintain searchable memory of code snippets, comments, and runtime traces with full source traceability.2727
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to query project memory by linking code changes to the conversations that produced them, allowing retrieval of past decisions and constraints directly from the codebase.7Apache 2.0
- AlicenseAqualityCmaintenanceGives AI coding agents persistent, evolving knowledge about a codebase, enabling them to store and retrieve observations about architecture, conventions, gotchas, and recent work context.10291MIT
- AlicenseNot gradedqualityAmaintenanceProvides persistent, anchored memory for AI coding agents, binding every decision to specific lines of code and delivering relevant context just-in-time via the Model Context Protocol.1MIT
Related MCP Connectors
Shared debugging memory for AI coding agents
Give your AI agent a persistent map of your project's structure, dependencies, and bugs.
Persistent memory and cross-session learning for AI coding assistants (hosted remote MCP).
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/Kawai-Senpai/Infinite-code-next'
If you have feedback or need assistance with the MCP directory API, please join our Discord server