Skip to content

v1.2.0 — AST Support

Choose a tag to compare

@Nefrols Nefrols released this 30 Dec 21:04
· 42 commits to main since this release

Release Notes

Language / Язык: English | Русский


What's New

Batch Integration for nts_code_refactor

Refactoring operations now return access tokens for all modified files, enabling seamless chaining with other tools in nts_batch_tools:

{
  "affectedFiles": [
    { "path": "src/User.java", "accessToken": "LAT:...", "crc32c": "A1B2C3D4", "lineCount": 50 },
    { "path": "src/UserService.java", "accessToken": "LAT:...", "crc32c": "E5F6G7H8", "lineCount": 120 }
  ],
  "token": "LAT:..."  // shortcut when single file affected
}

Batch example:

{
  "actions": [
    {"id": "ref", "tool": "nts_code_refactor", "params": {"action": "rename", "path": "User.java", "symbol": "getName", "newName": "getFullName"}},
    {"tool": "nts_edit_file", "params": {"path": "{{ref.affectedFiles[0].path}}", "accessToken": "{{ref.affectedFiles[0].accessToken}}", ...}}
  ]
}

Path Aliasing for Token Persistence

Tokens now remain valid after move/rename operations through transitive path resolution:

A.java → B.java → C.java
         ↓
Token from A.java still valid for C.java!

This eliminates the need to re-read files after renaming them within or outside of batch transactions.

Change Signature Refactoring

New change_signature action for modifying method parameters with automatic call site updates:

{
  "action": "change_signature",
  "path": "UserService.java",
  "symbol": "createUser",
  "params": [
    {"name": "email", "type": "String", "action": "add", "defaultValue": "null"},
    {"name": "oldParam", "action": "remove"},
    {"name": "name", "newName": "fullName", "action": "rename"},
    {"name": "age", "type": "long", "action": "retype"}
  ]
}

Symbol Extraction Architecture

Decomposed SymbolExtractor into 12 language-specific extractors:

  • Java, Kotlin, Python, JavaScript/TypeScript/TSX
  • Go, Rust, C/C++, C#, PHP, HTML

New utilities in SymbolExtractorUtils:

  • extractMethodParameters() - parameter extraction with varargs, defaults, annotations
  • extractMethodCalls() - call site analysis with argument positions
  • extractVariableReferences() - variable usage analysis
  • extractMethodBody() - body extraction for inline/extract operations

SymbolIndex for Fast Lookup

New SymbolIndex class for project-wide symbol indexing:

  • Incremental updates on file changes
  • Cross-file symbol resolution
  • O(1) definition lookup

Bug Fixes

CRC Mismatch in Batch Operations (Critical)

Problem: Tokens from nts_code_refactor failed validation in subsequent nts_edit_file calls with CRC mismatch errors.

Root cause: Inconsistent CRC calculation - FileReadTool/EditFileTool included line numbers in content, while refactoring used raw content.

Fix: Unified CRC calculation using raw content (without line numbers) across all tools.

Off-by-One Error in Single Line Delete

Problem: nts_edit_file delete operation failed when deleting a single line with error "endLine (6) must be >= startLine (7)".

Root cause: SessionLineAccessTracker.updateAfterEdit() calculated newEditEnd = editEnd + lineDelta, resulting in invalid range for single-line deletes.

Fix: Math.max(editStart, editEnd + lineDelta) ensures valid range.

Session Cache Synchronization

Problem: After refactoring, subsequent tools saw stale file metadata causing validation failures.

Fix: All refactoring operations now call SessionContext.externalChanges().updateSnapshot() after writing files.


Documentation & Schema Updates

Tool Descriptions for LLM

Updated getDescription() in tools to document new features:

  • CodeRefactorTool: CHANGE_SIGNATURE usage, BATCH INTEGRATION with affectedFiles
  • FileManageTool: Path aliasing with transitive chain example
  • BatchToolsTool: REFACTOR INTEGRATION section with interpolation examples

Input Schema

Added params array schema for change_signature:

params[]: {name, type, newName, defaultValue, action: add|remove|rename|retype|reorder}

README.md

Both English and Russian sections updated with:

  • Batch integration examples with JSON responses
  • Path aliasing documentation
  • Change signature operation description

Test Coverage

+20 new tests, +6000 lines

  • ChangeSignatureComprehensiveTest - 18 scenarios for all parameter modifications
  • LineAccessTokenPathAliasTest - path aliasing unit tests
  • PathAliasIntegrationTest - move + token integration
  • ParameterExtractionTest - AST-based parameter extraction
  • SymbolIndexTest - symbol indexing
  • Reorganized test packages to mirror main code structure

Breaking Changes

None. All changes are backward compatible.


Upgrade Notes

No action required. Existing tokens remain valid. New features are opt-in.



Примечания к релизу (RU)

Новые возможности

Интеграция nts_code_refactor с batch-операциями

Операции рефакторинга теперь возвращают токены доступа для всех изменённых файлов, что позволяет бесшовно связывать их с другими инструментами в nts_batch_tools:

{
  "affectedFiles": [
    { "path": "src/User.java", "accessToken": "LAT:...", "crc32c": "A1B2C3D4", "lineCount": 50 },
    { "path": "src/UserService.java", "accessToken": "LAT:...", "crc32c": "E5F6G7H8", "lineCount": 120 }
  ],
  "token": "LAT:..."  // сокращение при изменении одного файла
}

Пример batch-цепочки:

{
  "actions": [
    {"id": "ref", "tool": "nts_code_refactor", "params": {"action": "rename", "path": "User.java", "symbol": "getName", "newName": "getFullName"}},
    {"tool": "nts_edit_file", "params": {"path": "{{ref.affectedFiles[0].path}}", "accessToken": "{{ref.affectedFiles[0].accessToken}}", ...}}
  ]
}

Алиасинг путей для сохранения токенов

Токены остаются валидными после операций move/rename благодаря транзитивному разрешению путей:

A.java → B.java → C.java
         ↓
Токен от A.java работает для C.java!

Это устраняет необходимость повторного чтения файлов после их переименования.

Рефакторинг Change Signature

Новая операция change_signature для изменения параметров методов с автоматическим обновлением всех мест вызова:

{
  "action": "change_signature",
  "path": "UserService.java",
  "symbol": "createUser",
  "params": [
    {"name": "email", "type": "String", "action": "add", "defaultValue": "null"},
    {"name": "oldParam", "action": "remove"},
    {"name": "name", "newName": "fullName", "action": "rename"},
    {"name": "age", "type": "long", "action": "retype"}
  ]
}

Архитектура извлечения символов

SymbolExtractor декомпозирован на 12 языковых экстракторов:

  • Java, Kotlin, Python, JavaScript/TypeScript/TSX
  • Go, Rust, C/C++, C#, PHP, HTML

Новые утилиты в SymbolExtractorUtils:

  • extractMethodParameters() - извлечение параметров с varargs, значениями по умолчанию, аннотациями
  • extractMethodCalls() - анализ мест вызова с позициями аргументов
  • extractVariableReferences() - анализ использования переменных
  • extractMethodBody() - извлечение тела метода для inline/extract операций

SymbolIndex для быстрого поиска

Новый класс SymbolIndex для индексации символов проекта:

  • Инкрементальные обновления при изменении файлов
  • Разрешение символов между файлами
  • O(1) поиск определений

Исправления ошибок

Несовпадение CRC в batch-операциях (Критично)

Проблема: Токены от nts_code_refactor не проходили валидацию в последующих вызовах nts_edit_file с ошибкой несовпадения CRC.

Причина: Несогласованность вычисления CRC - FileReadTool/EditFileTool включали номера строк в контент, а рефакторинг использовал чистый контент.

Решение: Унифицировано вычисление CRC с использованием чистого контента (без номеров строк) во всех инструментах.

Ошибка Off-by-One при удалении одной строки

Проблема: Операция delete в nts_edit_file падала при удалении одной строки с ошибкой "endLine (6) must be >= startLine (7)".

Причина: SessionLineAccessTracker.updateAfterEdit() вычислял newEditEnd = editEnd + lineDelta, что давало невалидный диапазон для удаления одной строки.

Решение: Math.max(editStart, editEnd + lineDelta) гарантирует валидный диапазон.

Синхронизация кеша сессии

Проблема: После рефакторинга последующие инструменты видели устаревшие метаданные файлов, что вызывало ошибки валидации.

Решение: Все операции рефакторинга теперь вызывают SessionContext.externalChanges().updateSnapshot() после записи файлов.


Обновления документации и схем

Описания инструментов для LLM

Обновлены getDescription() в инструментах для документирования новых возможностей:

  • CodeRefactorTool: использование CHANGE_SIGNATURE, BATCH INTEGRATION с affectedFiles
  • FileManageTool: алиасинг путей с примером транзитивной цепочки
  • BatchToolsTool: раздел REFACTOR INTEGRATION с примерами интерполяции

Входная схема

Добавлена схема массива params для change_signature:

params[]: {name, type, newName, defaultValue, action: add|remove|rename|retype|reorder}

README.md

Обе версии (EN и RU) обновлены:

  • Примеры batch-интеграции с JSON-ответами
  • Документация алиасинга путей
  • Описание операции change signature

Покрытие тестами

+20 новых тестов, +6000 строк

  • ChangeSignatureComprehensiveTest - 18 сценариев для всех модификаций параметров
  • LineAccessTokenPathAliasTest - unit-тесты алиасинга путей
  • PathAliasIntegrationTest - интеграция move + токены
  • ParameterExtractionTest - извлечение параметров на основе AST
  • SymbolIndexTest - индексация символов
  • Реорганизация тестовых пакетов для соответствия структуре основного кода

Критические изменения

Нет. Все изменения обратно совместимы.


Примечания по обновлению

Действий не требуется. Существующие токены остаются валидными. Новые функции опциональны.