Skip to main content
Glama
Kawai-Senpai

Infinite Code Next

by Kawai-Senpai

MCP-сервер с нулевой настройкой, который даёт ИИ-агентам программирования постоянную, проверяемую память о кодовой базе — о решениях, стоящих за ней, о том, что уже было испробовано и отвергнуто, и о том, что никогда не должно сломаться, — привязанную к коду и переносимую вместе с ним по мере того, как код развивается.

tests python mcp no llm

Быстрый старт · Обозреватель · Обмен знаниями · Агентам · Как это работает · Бренд


Git blame говорит вам, кто изменил строку. Этот сервер говорит агенту, зачем существует код, что уже было испробовано и отвергнуто, и что должно оставаться неизменным — и он знает, когда его собственные знания устарели.


Проблема

Каждая сессия начинается с того, что ИИ-агент приходит без памяти. Он читает файлы, чтобы заново вывести то, что уже знал предыдущий агент. Затем он заново предлагает исправление, которое было отвергнуто три месяца назад, потому что ничто в репозитории не фиксирует, что оно уже было испробовано.

Дорогостоящее знание никогда не содержится в коде:

Код говорит

Он никогда не говорит

stdin=subprocess.DEVNULL

почему — что git наследует MCP-канал и задерживает каждый вызов на 20 секунд

if touched:

что or None здесь означает «разрешить всё» и стоит минут

Класс-координатор

что сначала был испробован 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 graph

Markdown — это каноническая форма для обмена, и он читается сам по себе — в редакторе, в диффе, в вики, в 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 и возвращает компактные капсулы в рамках бюджета токенов. Он ищет по коду и знаниям вместе, так что предупреждение найдёт вас, даже если вы никогда не называли файл, в котором оно живёт.

Аргумент

Используйте для

intent=

locate, understand, modify, debug, audit — определяется автоматически, если опущен

budget=

приблизительный потолок токенов (по умолчанию 9000)

cross_repos=True

следовать контрактам в другие репозитории

find_problems=

целевая диагностика по суженному подграфу

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.

Поле

Записывает

invariants

то, что должно оставаться неизменным

warnings

то, чего будущий агент не должен делать

failed_attempts

что было испробовано и отвергнуто, и почему

decisions

принятые решения и отвергнутые альтернативы

contracts

допущения, на которые полагается другой код

security

факты, относящиеся к безопасности

performance

измеренные факты производительности

bugs

ошибки, которые этот код уже вызывал раньше

migrations

шаги миграции или ограничения порядка

conventions

местные соглашения, которым стоит следовать

rationale

почему код устроен именно так

tests

тесты, покрывающие это — создаёт ребро GUARDED_BY

contracts_with

межрепозиторные зависимости

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

Тот же отпечаток, то же место

ACTIVE · 1.0

2

Тот же отпечаток в другом месте, подтверждено git blame -C -M

ACTIVE · 0.9, перемещён

3a

То же место, скелет идентичен — переименование

ACTIVE · 0.8

3b

То же место, структура изменилась

NEEDS_REVIEW

4

Символ исчез, сильное совпадение по сходству

DRIFTED, повторно привязан

5

Ничто не проходит порог

ORPHANED — сохранён, никогда не удаляется

Два правила делают это надёжным:

  • Проверка срабатывает на правке, вызвавшей дрейф, а не по таймеру.

  • Каскад может только понижать доверие, но никогда не повышать его. После DRIFTED или NEEDS_REVIEW только явный memory(action="verify") возвращает якорь в ACTIVE — иначе следующий проход нашёл бы его свежеперепривязанный отпечаток совпадающим, сообщил бы «без изменений» и тихо вернул бы доверие памяти, которую никто никогда не подтверждал.

Обнаружение проблем

investigate() сначала сужает область до подграфа, а затем задаёт целенаправленные вопросы по нему — никакого сканирования всего рабочего пространства. Отличие от линтеров в том, что эти проверки осведомлены о знаниях: линтер видит, что у функции нет теста; только этот граф знает, что функция подчиняется инварианту, записанному после инцидента на производстве.

Находка

На какой вопрос отвечает

stale_knowledge

какие памяти отклонились от кода, который они описывают

bypassed_wrapper

обходит ли вызывающий код координатор или защиту

untested_invariant

достижимо ли управляемое правило каким-либо тестом

deprecated_with_callers

есть ли у устаревшего символа живые вызывающие

unguarded_equivalent

есть ли у структурно идентичного собрата отсутствующее правило

implementation_drifted_from_decision

разошёлся ли код с принятым решением

knowledge_conflict

противоречат ли две памяти друг другу

historical_implementation

указывает ли активное знание на удалённый код

unverifiable_contract

можно ли в данный момент проверить межрепозиторную зависимость

unreviewed_caller

появился ли вызывающий после проверки памяти

migration_candidate

переместился ли код туда, куда каскад не последует

Сбой детектора никогда не прерывает поиск: диагностика дополняет ответ, а не является его обязательным условием.

Без 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

Значение

#8b5cf6

память, привязка — знание

#34d399

символы, тесты — проверенный код

#4d7cfe

файлы — структура

#fbbf24

репозиторий, осторожность

#f4677c

критическое, причинные цепочки

#1c2340

поверхность карточки

#151a2e

фон

Одно правило управляет всем интерфейсом: структура тиха, знание громко. 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, а не строковые литералы, чтобы редактор воспринимал их как то, чем они являются. Они встраиваются во время рендеринга, потому что опубликованная страница должна оставаться одним самодостаточным файлом.


Инструменты

Инструмент

Действия

workspace

open · status · list · reindex · health · reconcile · archive · detach · forget_checkout · purge

investigate

search · why · expand · verify

record

одно событие → много привязанных фактов

memory

get · list · verify · guard · correct · supersede · resolve · reanchor

agit

status · diff · commit · log · branches · switch · restore · reset · show

agit хранит контрольные точки агента в .agit/, полностью отдельно от пользовательского .git. Сохраняйте контрольную точку рискованной работы, восстанавливайте её, никогда не трогайте их историю.


Тестирование

python -m pytest

172 теста, включая живой набор 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 — почему причинность утверждается и никогда не выводится.

Заметки по планированию хранятся локально и не входят в поставляемый артефакт.


Создано Ранитом Бхоумиком

Если агенту пришлось читать вашу кодовую базу, чтобы понять её, эти знания умерли вместе с сессией. Это исправление.

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • -
    license
    B
    quality
    Not graded
    maintenance
    A 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.
    27
    27
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
    7
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Gives AI coding agents persistent, evolving knowledge about a codebase, enabling them to store and retrieve observations about architecture, conventions, gotchas, and recent work context.
    10
    29
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides 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.
    1
    MIT

View all related MCP servers

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).

View all MCP Connectors

Latest Blog Posts

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