Об этом проекте
Ditto позиционирует себя как «Semantic CI»: дополнительный этап конвейера наряду с компиляцией, тестированием и линтингом, отвечающий на вопрос — не изобретает ли кодовая база заново то, что уже известно? Инструмент нацелен на клоны Type-4 — функции, которые ведут себя одинаково, но написаны по-разному, что обычно не фиксируется детекторами дубликатов на основе токенов или AST.
Принцип работы задокументированного конвейера: бэкенд загружает tar-архив репозитория, обходит его с помощью ts-morph для извлечения всех функций (включая неэкспортируемые), затем создает «отпечаток» каждой функции по отдельности с помощью недорогой модели, игнорируя имена. Эти отпечатки — никогда не исходный код или имена — преобразуются в эмбеддинги и кластеризуются в памяти по косинусному сходству. Только результирующие группы кандидатов передаются более крупной модели для вынесения решения, которая также предлагает состязательные входные данные. Функционально чистые функции затем исполняются параллельно в песочнице worker_threads с таймаутом, и подтвержденное расхождение представляется как исполненное доказательство; нечистые функции также кластеризуются и оцениваются, но помечаются как «предсказанные», а не «исполненные». Результаты записываются в MongoDB и предоставляются через эндпоинты только для чтения и фронтенд на Next.js; путь предоставления данных не вызывает модель.
В README сообщается о запусках в пяти репозиториях (2870, 2654, 336, 31 и 6 функций), перечисляются кластеры дубликатов, поведенческие конфликты и 18 случаев, доказанных путем исполнения, включая семейство реализаций truncateText в cline, где расчет зарезервированного пространства сокращает сохраненный текст до одного символа выше определенного лимита. Утверждается, что jscpd сообщает о нуле клонов в этих файлах. Две небольшие, хорошо поддерживаемые библиотеки получили оценку «чисто», что авторы представляют как доказательство отсутствия избыточного обнаружения.
Заявленные ограничения: только JavaScript/TypeScript, так как слой AST базируется на ts-morph; исполнение требует чистоты функций; большие репозитории должны иметь четко определенную область охвата, а не просто обрезаться, так как случайно пропущенная функция может привести к исчезновению всего кластера; инструмент не рекомендует, какую из двух конфликтующих реализаций оставить, оставляя это на усмотрение человека. Данные по стоимости и времени в README (например, ₹232 за анализ 2870 функций и примерно ₹1 за pull request для планируемой проверки Guard) являются собственными измерениями проекта, а не независимыми бенчмарками. Хостинг-демо ограничивает анализ по запросу до 600 функций из-за лимитов API-кредитов сопровождающих; локальный запуск с собственным ключом снимает это ограничение.
Примечания по настройке охватывают индексацию репозитория без MongoDB или API-ключа, файл .env с MongoDB, OpenAI и опциональными настройками GitHub/модели, развертывание в Cloud Run с таймаутом запроса 1200 секунд, сетевой доступ Atlas и Vercel для фронтенда, где значения NEXT_PUBLIC_* встраиваются во время сборки. Дорожная карта включает Ditto Guard как проверку pull-request в GitHub Action, инструмент MCP, позволяющий кодинг-агентам запрашивать индекс перед созданием дубликатов, поддержку дополнительных языков через tree-sitter и инкрементальную переиндексацию. Контрибьюторам предлагаются задачи с меткой good first issues.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.