From 47aa80a379a6133a4adcb58783cbf5bd76502cd1 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 6 Feb 2026 17:42:33 +0100 Subject: [PATCH 1/3] Initial commit with task details Adding CLAUDE.md with task information for AI processing. This file will be removed when the task is complete. Issue: https://github.com/netkeep80/avm/issues/16 --- CLAUDE.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..3ce1324 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,7 @@ +Issue to solve: https://github.com/netkeep80/avm/issues/16 +Your prepared branch: issue-16-2aaeb6ccfc53 +Your prepared working directory: /tmp/gh-issue-solver-1770396148142 +Your forked repository: konard/netkeep80-avm +Original repository (upstream): netkeep80/avm + +Proceed. From 7acbc2781a1b1154e1c57b3c8b726fb2fd56a0e4 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 6 Feb 2026 17:50:17 +0100 Subject: [PATCH 2/3] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D1=82=D0=B0=D1=82=D0=BE=D1=80=D0=B0=20=D0=B2=D1=8B=D1=80?= =?UTF-8?q?=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B8=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8=20=D0=B4=D0=BE=20?= =?UTF-8?q?0.0.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлен интерпретатор логических выражений interpret() для вычисления выражений из JSON в МАО с поддержкой NOT, AND, OR и вложенных выражений. Co-Authored-By: Claude Opus 4.6 --- CMakeLists.txt | 2 +- README.md | 30 ++++++++--- analysis.md | 28 +++++----- plan.md | 7 +-- src/main.cpp | 95 +++++++++++++++++++++++++++++++--- test/expr_and.json | 1 + test/expr_nested.json | 1 + test/expr_not.json | 1 + test/expr_or.json | 1 + test/unit_test.cpp | 116 ++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 252 insertions(+), 30 deletions(-) create mode 100644 test/expr_and.json create mode 100644 test/expr_nested.json create mode 100644 test/expr_not.json create mode 100644 test/expr_or.json diff --git a/CMakeLists.txt b/CMakeLists.txt index e90d3a7..5df1f6d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.20 FATAL_ERROR) message( "Configuring: ${CMAKE_CURRENT_SOURCE_DIR}") -set(CMAKE_PROJECT_VERSION 0.0.2 ) +set(CMAKE_PROJECT_VERSION 0.0.3 ) # Project name project( avm diff --git a/README.md b/README.md index 5bd7fb0..4eaba25 100644 --- a/README.md +++ b/README.md @@ -45,22 +45,24 @@ The Associative Relations Model (ARM) is a mathematical model for storing and pr - Logical operations (NOT, AND, OR) defined as truth tables in entity maps - Relative addressing operator `[]` for evaluating functions via `eval()` - Multi-dimensional relative addressing for passing arguments +- Expression interpreter `interpret()` for evaluating logical expressions from JSON ### Current Status -**Version: 0.0.2** (Alpha) +**Version: 0.0.3** (Alpha) Implemented: - JSON null, boolean, array, number (unsigned, integer, float), string, object serialization/deserialization - Base vocabulary initialization (R, E, True, False, Unsigned, Integer, Float, String, Object, Not, And, Or) - Logical operations NOT, AND, OR with truth tables via entity map - Relative addressing operator `[]` via `eval()` function for computing logical functions -- 99 unit tests + 16 JSON roundtrip tests +- Expression interpreter for evaluating logical expressions from JSON (e.g. `{"Not": [true]}` → `false`) +- 125 unit tests + 16 JSON roundtrip tests - CI/CD pipeline (GitHub Actions) for Linux, macOS, Windows In Progress: -- Expression interpreter for evaluating logical expressions in ARM - Persistent storage integration with LinksPlatform +- CRUD API for programmatic use ### Documentation @@ -99,6 +101,13 @@ cmake --build . The application reads a JSON file, converts it to ARM representation, and saves the result to `res.json`. +If the input JSON is a logical expression (e.g. `{"Not": [true]}`), the expression interpreter evaluates it and saves the result: +```bash +echo '{"Not": [{"And": [true, false]}]}' > expr.json +./avm expr.json +cat res.json # true +``` + ### Dependencies - C++20 compatible compiler @@ -147,22 +156,24 @@ AVM (Associative Virtual Machine) — проект, реализующий ви - Логические операции (NOT, AND, OR), определённые как таблицы истинности в entity map - Оператор относительной адресации `[]` для вычисления функций через `eval()` - Многомерная относительная адресация для передачи аргументов +- Интерпретатор выражений `interpret()` для вычисления логических выражений из JSON ### Текущее состояние -**Версия: 0.0.2** (Альфа) +**Версия: 0.0.3** (Альфа) Реализовано: - Сериализация/десериализация JSON null, boolean, array, number (unsigned, integer, float), string, object - Инициализация базового словаря (R, E, True, False, Unsigned, Integer, Float, String, Object, Not, And, Or) - Логические операции NOT, AND, OR с таблицами истинности через entity map - Оператор относительной адресации `[]` через функцию `eval()` для вычисления логических функций -- 99 модульных тестов + 16 JSON roundtrip тестов +- Интерпретатор выражений для вычисления логических выражений из JSON (например `{"Not": [true]}` → `false`) +- 125 модульных тестов + 16 JSON roundtrip тестов - CI/CD пайплайн (GitHub Actions) для Linux, macOS, Windows В разработке: -- Интерпретатор выражений для выполнения логических выражений в МАО - Персистентное хранение — интеграция с LinksPlatform +- CRUD API для программного использования ### Документация @@ -201,6 +212,13 @@ cmake --build . Приложение читает JSON файл, преобразует его в представление МАО и сохраняет результат в `res.json`. +Если входной JSON является логическим выражением (например `{"Not": [true]}`), интерпретатор вычисляет его и сохраняет результат: +```bash +echo '{"Not": [{"And": [true, false]}]}' > expr.json +./avm expr.json +cat res.json # true +``` + ### Зависимости - Компилятор с поддержкой C++20 diff --git a/analysis.md b/analysis.md index 6baa3ac..7e6ff7f 100644 --- a/analysis.md +++ b/analysis.md @@ -71,7 +71,7 @@ AVM (Associative Virtual Machine) — это проект, реализующи ### 1. Функциональные недостатки #### 1.1. Незавершённые направления -- **Интерпретатор выражений** — выполнение логических выражений из JSON в МАО ещё не реализовано +- ~~**Интерпретатор выражений**~~ ✅ — реализован `interpret()` для вычисления логических выражений из JSON - **Персистентное хранение** — интеграция с LinksPlatform не завершена - Нет CRUD API для программного использования @@ -99,7 +99,7 @@ AVM (Associative Virtual Machine) — это проект, реализующи - Жёстко закодированные пути файлов (`"res.json"`) #### 2.3. Тестирование -- ~~Нет автоматических unit-тестов~~ ✅ 99 модульных тестов +- ~~Нет автоматических unit-тестов~~ ✅ 125 модульных тестов - ~~Нет интеграционных тестов~~ ✅ 16 JSON roundtrip тестов через CTest - ~~CMake настроен с `enable_testing()`, но тесты не определены~~ ✅ 17 тестов в CTest - ~~Нет CI/CD конфигурации (GitHub Actions)~~ ✅ GitHub Actions для 3 платформ @@ -128,12 +128,12 @@ AVM (Associative Virtual Machine) — это проект, реализующи |---------|----------| | Язык программирования | C++ (стандарт C++20) | | Система сборки | CMake 3.20+ | -| Основной файл кода | ~550 строк (main.cpp) | -| Заголовочный файл | ~406 строк (avm.h) | +| Основной файл кода | ~562 строки (main.cpp) | +| Заголовочный файл | ~463 строки (avm.h) | | Внешние зависимости | nlohmann/json, LinksPlatform, str_switch | | Лицензия | MIT | -| Unit-тесты | 99 модульных тестов | -| Тестовые файлы | 17 JSON файлов | +| Unit-тесты | 125 модульных тестов | +| Тестовые файлы | 21 JSON файл | --- @@ -142,9 +142,9 @@ AVM (Associative Virtual Machine) — это проект, реализующи Проект находится на стадии альфа-версии: - **Концепция**: Хорошо проработана теоретически -- **Реализация**: JSON roundtrip полностью работает, логические операции реализованы +- **Реализация**: JSON roundtrip полностью работает, логические операции реализованы, интерпретатор выражений работает - **Документация**: Двуязычная документация, описание алгоритма сериализации -- **Тестирование**: 99 модульных тестов + 16 интеграционных, CI/CD на 3 платформах +- **Тестирование**: 125 модульных тестов + 16 интеграционных, CI/CD на 3 платформах - **Готовность к использованию**: Прототип с работающей базовой функциональностью --- @@ -154,14 +154,14 @@ AVM (Associative Virtual Machine) — это проект, реализующи AVM представляет собой интересный исследовательский проект, демонстрирующий применение Модели Ассоциативных Отношений для представления и обработки данных. Проект имеет солидную теоретическую базу и работающий прототип, однако требует значительной доработки для достижения production-ready состояния. Основные направления для дальнейшего улучшения: -1. Создание интерпретатора выражений для МАО -2. Интеграция персистентного хранения (LinksPlatform) -3. Создание публичного API для CRUD операций -4. Примеры использования и руководства -5. Пакеты для менеджеров зависимостей (vcpkg, Conan) +1. Интеграция персистентного хранения (LinksPlatform) +2. Создание публичного API для CRUD операций +3. Примеры использования и руководства +4. Пакеты для менеджеров зависимостей (vcpkg, Conan) +5. Условные конструкции и рекурсия в интерпретаторе --- *Дата анализа: январь 2026* *Последнее обновление: февраль 2026* -*Версия проекта: 0.0.2* +*Версия проекта: 0.0.3* diff --git a/plan.md b/plan.md index 65f9889..4781914 100644 --- a/plan.md +++ b/plan.md @@ -50,7 +50,7 @@ #### Высокий приоритет 1. ~~**Реализовать логические операции**~~ ✅ — NOT, AND, OR реализованы в базовом словаре через entity map (PR #19) 2. ~~**Добавить механизм вычисления функций**~~ ✅ — относительная адресация через функцию `eval()` (PR #19) -3. **Создать интерпретатор выражений** — выполнение логических выражений в МАО +3. ~~**Создать интерпретатор выражений**~~ ✅ — интерпретация логических выражений из JSON в МАО (PR #20) #### Средний приоритет 4. **Реализовать условные конструкции** — if-then-else через ассоциативные структуры @@ -135,7 +135,7 @@ ### Задачи по приоритетам #### Критический приоритет (сделать в первую очередь) -1. ~~**Добавить unit-тесты**~~ ✅ — 99 модульных тестов (PR #9, #19) +1. ~~**Добавить unit-тесты**~~ ✅ — 125 модульных тестов (PR #9, #19, #20) 2. ~~**Настроить CI/CD**~~ ✅ — GitHub Actions для Ubuntu, Windows, macOS (PR #6) 3. ~~**Обеспечить кроссплатформенность**~~ ✅ — сборка для Linux, macOS, Windows (PR #6, #14) 4. ~~**Улучшить README**~~ ✅ — двуязычная документация (PR #2) @@ -179,6 +179,7 @@ ### Фаза 2: Функциональность (текущая) - ~~Логические операции и вычисления~~ ✅ NOT, AND, OR + оператор `eval()` (PR #19) +- ~~Интерпретатор выражений~~ ✅ вычисление логических выражений из JSON через `interpret()` (PR #20) - Персистентное хранение - API для программного использования - Примеры и руководства @@ -207,4 +208,4 @@ *Дата создания: январь 2026* *Последнее обновление: февраль 2026* -*Версия плана: 1.1* +*Версия плана: 1.2* diff --git a/src/main.cpp b/src/main.cpp index 507f2e6..e42023f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -181,6 +181,79 @@ rel_t *import_json(const json &j) } } +// Интерпретатор выражений / Expression interpreter +// Вычисляет логические выражения, представленные как JSON, в МАО +// Формат выражений: +// true, false, null — примитивные значения +// {"Not": [expr]} — логическое НЕ +// {"And": [expr1, expr2]} — логическое И +// {"Or": [expr1, expr2]} — логическое ИЛИ +// Вложенные выражения: {"Not": [{"And": [true, false]}]} = NOT[AND[True][False]] = True +// +// Поиск оператора по имени в базовом словаре +rel_t *resolve_operator(const string &name) +{ + if (name == "Not") + return rel_t::Not; + if (name == "And") + return rel_t::And; + if (name == "Or") + return rel_t::Or; + return nullptr; +} + +// Рекурсивная интерпретация JSON-выражения +// Возвращает результат вычисления как ARM-сущность +rel_t *interpret(const json &expr) +{ + switch (expr.type()) + { + case json::value_t::null: + return rel_t::E; + + case json::value_t::boolean: + return expr.get() ? rel_t::True : rel_t::False; + + case json::value_t::object: + { + // Объект с одним ключом — оператор с аргументами + // {"Not": [true]} или {"And": [true, false]} + if (expr.size() != 1) + return rel_t::E; // некорректное выражение + + auto it = expr.begin(); + const string &op_name = it.key(); + const json &args = it.value(); + + rel_t *op = resolve_operator(op_name); + if (!op) + return rel_t::E; // неизвестный оператор + + if (!args.is_array() || args.empty()) + return rel_t::E; // аргументы должны быть непустым массивом + + // Вычисляем аргументы рекурсивно и применяем оператор + // Унарный оператор: func[arg] + if (args.size() == 1) + return eval(op, interpret(args[0])); + + // Бинарный оператор: func[arg1][arg2] + if (args.size() == 2) + return eval(op, interpret(args[0]), interpret(args[1])); + + // N-арный оператор: последовательное применение func[a1][a2]...[aN] + rel_t *result = eval(op, interpret(args[0])); + for (size_t i = 1; i < args.size(); ++i) + result = eval(result, interpret(args[i])); + return result; + } + + default: + // Для остальных типов (числа, строки, массивы) — импортируем как данные + return import_json(expr); + } +} + void export_json(const rel_t *ent, json &j); void export_object_chain(const rel_t *node, json &j) @@ -411,7 +484,7 @@ int main(int argc, char *argv[]) break; default: cout << R"(https://github.com/netkeep80/avm - Associative Virtual Machine [Version 0.0.2] + Associative Virtual Machine [Version 0.0.3] _____________ / \ / \ @@ -449,13 +522,23 @@ Copyright (c) 2022 Vertushkin Roman Pavlovich get_json(root, entry_point); res = json::object(); // parse_json(root, res); - // импортируем в корневой контекст - auto root_ent = import_json(root); - // cout << root.dump() << endl; + // Проверяем, является ли вход выражением для интерпретации + // Выражение — JSON объект с одним ключом-оператором (Not, And, Or) + bool is_expression = root.is_object() && root.size() == 1 && + resolve_operator(root.begin().key()) != nullptr; + rel_t *root_ent; + if (is_expression) + { + // Интерпретируем выражение + root_ent = interpret(root); + } + else + { + // Импортируем как данные + root_ent = import_json(root); + } export_json(root_ent, res); - // cout << res.dump() << endl; add_json(res, "res.json"s); - //add_json(json(export_string(root_ent)), "res.txt"s); std::cout << "rel_t::created() = " << rel_t::created() << std::endl; return 0; // ok } diff --git a/test/expr_and.json b/test/expr_and.json new file mode 100644 index 0000000..9ad6af9 --- /dev/null +++ b/test/expr_and.json @@ -0,0 +1 @@ +{"And": [true, false]} \ No newline at end of file diff --git a/test/expr_nested.json b/test/expr_nested.json new file mode 100644 index 0000000..f989466 --- /dev/null +++ b/test/expr_nested.json @@ -0,0 +1 @@ +{"Not": [{"And": [true, false]}]} \ No newline at end of file diff --git a/test/expr_not.json b/test/expr_not.json new file mode 100644 index 0000000..3dbd7cd --- /dev/null +++ b/test/expr_not.json @@ -0,0 +1 @@ +{"Not": [true]} \ No newline at end of file diff --git a/test/expr_or.json b/test/expr_or.json new file mode 100644 index 0000000..2a44ef3 --- /dev/null +++ b/test/expr_or.json @@ -0,0 +1 @@ +{"Or": [false, true]} \ No newline at end of file diff --git a/test/unit_test.cpp b/test/unit_test.cpp index e115b15..c265fed 100644 --- a/test/unit_test.cpp +++ b/test/unit_test.cpp @@ -13,6 +13,7 @@ rel_t *import_json(const json &j); void export_json(const rel_t *ent, json &j); rel_t *eval(rel_t *func, rel_t *arg); rel_t *eval(rel_t *func, rel_t *arg1, rel_t *arg2); +rel_t *interpret(const json &expr); static int tests_passed = 0; static int tests_failed = 0; @@ -359,6 +360,114 @@ void test_eval_null_safety() check(eval(nullptr, nullptr) == rel_t::E, "eval(nullptr, nullptr) = E"); } +// === Тесты интерпретатора выражений === + +void test_interpret_primitives() +{ + // Примитивные значения + check(interpret(json(true)) == rel_t::True, "interpret(true) = True"); + check(interpret(json(false)) == rel_t::False, "interpret(false) = False"); + check(interpret(json(nullptr)) == rel_t::E, "interpret(null) = E"); +} + +void test_interpret_not() +{ + // NOT: {"Not": [true]} = False, {"Not": [false]} = True + json not_true = {{"Not", json::array({true})}}; + json not_false = {{"Not", json::array({false})}}; + + check(interpret(not_true) == rel_t::False, "interpret({Not: [true]}) = False"); + check(interpret(not_false) == rel_t::True, "interpret({Not: [false]}) = True"); +} + +void test_interpret_and() +{ + // AND: {"And": [arg1, arg2]} + json and_tt = {{"And", json::array({true, true})}}; + json and_tf = {{"And", json::array({true, false})}}; + json and_ft = {{"And", json::array({false, true})}}; + json and_ff = {{"And", json::array({false, false})}}; + + check(interpret(and_tt) == rel_t::True, "interpret({And: [true, true]}) = True"); + check(interpret(and_tf) == rel_t::False, "interpret({And: [true, false]}) = False"); + check(interpret(and_ft) == rel_t::False, "interpret({And: [false, true]}) = False"); + check(interpret(and_ff) == rel_t::False, "interpret({And: [false, false]}) = False"); +} + +void test_interpret_or() +{ + // OR: {"Or": [arg1, arg2]} + json or_tt = {{"Or", json::array({true, true})}}; + json or_tf = {{"Or", json::array({true, false})}}; + json or_ft = {{"Or", json::array({false, true})}}; + json or_ff = {{"Or", json::array({false, false})}}; + + check(interpret(or_tt) == rel_t::True, "interpret({Or: [true, true]}) = True"); + check(interpret(or_tf) == rel_t::True, "interpret({Or: [true, false]}) = True"); + check(interpret(or_ft) == rel_t::True, "interpret({Or: [false, true]}) = True"); + check(interpret(or_ff) == rel_t::False, "interpret({Or: [false, false]}) = False"); +} + +void test_interpret_nested() +{ + // NOT[AND[True, False]] = NOT[False] = True + json not_and = {{"Not", json::array({{{"And", json::array({true, false})}}})}}; + check(interpret(not_and) == rel_t::True, "interpret({Not: [{And: [true, false]}]}) = True"); + + // NOT[OR[False, False]] = NOT[False] = True + json not_or = {{"Not", json::array({{{"Or", json::array({false, false})}}})}}; + check(interpret(not_or) == rel_t::True, "interpret({Not: [{Or: [false, false]}]}) = True"); + + // AND[NOT[False], NOT[True]] = AND[True, False] = False + json and_nots = {{"And", json::array({{{"Not", json::array({false})}}, {{"Not", json::array({true})}}})}}; + check(interpret(and_nots) == rel_t::False, "interpret({And: [{Not: [false]}, {Not: [true]}]}) = False"); + + // OR[NOT[True], NOT[False]] = OR[False, True] = True + json or_nots = {{"Or", json::array({{{"Not", json::array({true})}}, {{"Not", json::array({false})}}})}}; + check(interpret(or_nots) == rel_t::True, "interpret({Or: [{Not: [true]}, {Not: [false]}]}) = True"); +} + +void test_interpret_deeply_nested() +{ + // NOT[NOT[True]] = NOT[False] = True + json not_not_true = {{"Not", json::array({{{"Not", json::array({true})}}})}}; + check(interpret(not_not_true) == rel_t::True, "interpret({Not: [{Not: [true]}]}) = True"); + + // NOT[NOT[False]] = NOT[True] = False + json not_not_false = {{"Not", json::array({{{"Not", json::array({false})}}})}}; + check(interpret(not_not_false) == rel_t::False, "interpret({Not: [{Not: [false]}]}) = False"); + + // AND[OR[True, False], AND[True, True]] = AND[True, True] = True + json complex = {{"And", json::array({{{"Or", json::array({true, false})}}, {{"And", json::array({true, true})}}})}}; + check(interpret(complex) == rel_t::True, "interpret({And: [{Or: [true, false]}, {And: [true, true]}]}) = True"); + + // OR[AND[False, True], AND[True, True]] = OR[False, True] = True + json complex2 = {{"Or", json::array({{{"And", json::array({false, true})}}, {{"And", json::array({true, true})}}})}}; + check(interpret(complex2) == rel_t::True, "interpret({Or: [{And: [false, true]}, {And: [true, true]}]}) = True"); +} + +void test_interpret_error_cases() +{ + // Пустой объект — некорректное выражение + check(interpret(json::object()) == rel_t::E, "interpret({}) = E"); + + // Объект с несколькими ключами — некорректное выражение + json multi_key = {{"Not", json::array({true})}, {"And", json::array({true, true})}}; + check(interpret(multi_key) == rel_t::E, "interpret(multi-key object) = E"); + + // Неизвестный оператор + json unknown = {{"Xor", json::array({true, false})}}; + check(interpret(unknown) == rel_t::E, "interpret({Xor: [...]}) = E"); + + // Пустой массив аргументов + json empty_args = {{"Not", json::array()}}; + check(interpret(empty_args) == rel_t::E, "interpret({Not: []}) = E"); + + // Аргументы не массив + json non_array_args = {{"Not", true}}; + check(interpret(non_array_args) == rel_t::E, "interpret({Not: true}) = E"); +} + // === Тесты счётчиков памяти === void test_memory_counters() @@ -402,6 +511,13 @@ int main() test_or(); test_eval_chained(); test_eval_null_safety(); + test_interpret_primitives(); + test_interpret_not(); + test_interpret_and(); + test_interpret_or(); + test_interpret_nested(); + test_interpret_deeply_nested(); + test_interpret_error_cases(); test_memory_counters(); cout << endl; From 466e01c4a87131fbf40089f337d47daa179424c1 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 6 Feb 2026 17:52:36 +0100 Subject: [PATCH 3/3] Revert "Initial commit with task details" This reverts commit 47aa80a379a6133a4adcb58783cbf5bd76502cd1. --- CLAUDE.md | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 3ce1324..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,7 +0,0 @@ -Issue to solve: https://github.com/netkeep80/avm/issues/16 -Your prepared branch: issue-16-2aaeb6ccfc53 -Your prepared working directory: /tmp/gh-issue-solver-1770396148142 -Your forked repository: konard/netkeep80-avm -Original repository (upstream): netkeep80/avm - -Proceed.