diff --git a/.claude/memory/MEMORY.md b/.claude/memory/MEMORY.md index 4c92a15..ed84338 100644 --- a/.claude/memory/MEMORY.md +++ b/.claude/memory/MEMORY.md @@ -1,5 +1,14 @@ # Memory Index -- [Обзор проекта Bicycle](project_bicycle.md) — текущее состояние фреймворка, реализованные классы, план, ограничения -- [Обновлять CLAUDE.md без напоминаний](feedback_update_claude_md.md) — после каждого изменения кода обновлять CLAUDE.md автоматически -- [Правила именования и PHPDoc](feedback_naming_phpdoc.md) — snake_case переменные, camelCase методы, PascalCase классы, PHPDoc везде +Тематическая память по проекту Bicycle. CLAUDE.md — общая архитектура/команды; здесь — узкие темы, чтобы не читать много текста ради конкретного вопроса. + +- [Именование и PHPDoc](feedback_naming_phpdoc.md) — snake_case переменные, camelCase методы, PascalCase классы, PHPDoc везде +- [Обновлять CLAUDE.md без напоминаний](feedback_update_claude_md.md) — после каждого изменения кода обновлять CLAUDE.md самостоятельно +- [Не коммитить самому](feedback_no_commit.md) — git commit/push делает пользователь вручную +- [Общение по-русски](feedback_russian_communication.md) — включая описания Bash-вызовов и подобных tool-call'ов +- [Меньше уточнений](feedback_less_confirmation.md) — не переспрашивать по некритичным/обратимым шагам +- [Auth API — терминология Kohana](feedback_auth_api_naming.md) — login/logout/loggedIn/getUser/checkPassword, Auth::instance(), без слова Provider +- [Учебный проект](feedback_educational_project.md) — не предлагать замену на Laravel/Symfony +- [Место хранения памяти](feedback_memory_location.md) — вся память по Bicycle тут, не в глобальном auto-memory +- [Roadmap: слой БД](roadmap.md) — Model, Database/PdoDriver, Statement, Repository, Profiler +- [Идея: CLI-точка входа](idea_cli_entrypoint.md) — отложенный cli.php для миграций/крона diff --git a/.claude/memory/feedback_auth_api_naming.md b/.claude/memory/feedback_auth_api_naming.md new file mode 100644 index 0000000..897b764 --- /dev/null +++ b/.claude/memory/feedback_auth_api_naming.md @@ -0,0 +1,17 @@ +--- +name: feedback-auth-api-naming +description: Auth API ориентируется на Kohana Auth (login/logout/loggedIn/getUser/checkPassword, Auth::instance()) — без слова Provider +metadata: + type: feedback +--- + +Пользователь знаком с Kohana-подобным Auth-модулем и мыслит его терминами. При работе с `Services\Auth` (и любым похожим кодом в этом проекте) — придерживаться этой семантики, а не изобретать свою. + +**Why:** Изначально я сделал `Services\Auth::provider()` + интерфейс `AuthProvider` — пользователь не понял слово «provider» и explicitно попросил «убери Provider он меня бесит». Показал референс — конфиг и методы Kohana Auth (`driver`, `login`, `logout`, `check_password`, `get_user`, `logged_in`). После переименования — доволен. + +**How to apply:** Итоговая договорённость: +- `Services\Auth::instance(?string $name = null)` — точка входа (как `Auth::instance()` в Kohana), НЕ `provider()`/`getProvider()`. +- Интерфейс — `Services\Auth\AuthDriver` (не `AuthProvider`), реализация по умолчанию — `FileAuthDriver`. +- Методы (camelCase, как везде в проекте — не snake_case, как в самой Kohana): `login($login, $password)`, `logout()`, `loggedIn()`, `getUser()`, `checkPassword($password)`. +- Слово «provider» в новом коде авторизации не использовать вообще — ни в именах классов/методов, ни в комментариях. +- User — не отдельный класс, а обычный `?array` из `getUser()` (осознанное решение: разные бэкенды/драйверы отдают разный набор полей, жёсткий класс был бы либо слишком узким, либо резиновым __get-обёрткой). diff --git a/.claude/memory/feedback_educational_project.md b/.claude/memory/feedback_educational_project.md new file mode 100644 index 0000000..e445daf --- /dev/null +++ b/.claude/memory/feedback_educational_project.md @@ -0,0 +1,12 @@ +--- +name: feedback-educational-project +description: Bicycle — учебный/экспериментальный проект, не предлагать заменить на готовый фреймворк +metadata: + type: feedback +--- + +Bicycle — самописный PHP MVC-фреймворк, сделанный намеренно «с нуля» (имя — от идиомы «изобрести велосипед»). + +**Why:** Это учебный/экспериментальный проект пользователя. Предложение заменить его на Laravel/Symfony/другой готовый фреймворк противоречит самой цели проекта. + +**How to apply:** При обсуждении архитектуры ориентироваться на стиль уже существующих классов (см. CLAUDE.md), не предлагать миграцию на сторонний фреймворк или крупные сторонние библиотеки там, где можно реализовать просто самому (пример — CLI-точка входа: `symfony/console` признан оверкиллом, см. `idea_cli_entrypoint.md`). diff --git a/.claude/memory/feedback_less_confirmation.md b/.claude/memory/feedback_less_confirmation.md new file mode 100644 index 0000000..021a49c --- /dev/null +++ b/.claude/memory/feedback_less_confirmation.md @@ -0,0 +1,12 @@ +--- +name: feedback-less-confirmation +description: Не переспрашивать по мелочам — действовать напрямую на обратимых/некритичных шагах +metadata: + type: feedback +--- + +Пользователь просил меньше останавливаться на уточнения и подтверждения по некритичным вещам — просто делать, что просят. + +**Why:** Прямо сказал: «можно это не спрашивать? и всякую такую ересь тоже просто делай как я прошу» — раздражают лишние паузы на подтверждение очевидных/некритичных шагов. + +**How to apply:** Для обычных, обратимых действий (создать папку, перенести файл, применить уже согласованное архитектурное решение) — не спрашивать через AskUserQuestion и не описывать заранее «что сделает команда» ради согласия, если пользователь уже задал направление. Уточнять вопросом стоит только при реально неоднозначном архитектурном выборе, когда пользователь явно не обозначил предпочтение (например: класть Auth в System vs Services — там решение зависит от вкуса пользователя). Системный диалог подтверждения инструмента (permission prompt) — UI харнеса, не мой вызов, на него не влияю, но не нужно самому дублировать эти паузы вопросами. diff --git a/.claude/memory/feedback_memory_location.md b/.claude/memory/feedback_memory_location.md new file mode 100644 index 0000000..6fc50d0 --- /dev/null +++ b/.claude/memory/feedback_memory_location.md @@ -0,0 +1,12 @@ +--- +name: feedback-memory-location +description: Память по проекту Bicycle сохранять ТОЛЬКО в .claude/memory/ этого репозитория, не в глобальном auto-memory +metadata: + type: feedback +--- + +Для проекта Bicycle вся память (feedback/project/reference) сохраняется в файлах внутри репозитория — `/home/isaevea/http/Bicycle/.claude/memory/` (по темам, один файл — одна тема, плюс индекс `MEMORY.md`), а не в глобальном auto-memory сторе (`~/.claude/projects/-home-isaevea-http-Bicycle/memory/`). + +**Why:** Пользователь явно сказал: «в /home/isaevea/http/Bicycle/.claude/memory разбей по темам чтобы не читать много текста а искать конкретное и запомни что память сохранять только так». CLAUDE.md — общий/обзорный файл (архитектура, команды), а не место для мелких тематических заметок; `.claude/memory/` — для узких, легко находимых по имени файла тем. Такой каталог в проекте уже существовал (закоммичен ранее), просто не использовался в последних сессиях — держали его в актуальном состоянии не полностью. + +**How to apply:** При появлении новой feedback/project/reference-памяти по этому проекту — создавать/обновлять файл в `/.claude/memory/{topic}.md` (формат: frontmatter `name`/`description`/`metadata.type` + текст с **Why:**/**How to apply:**, как в остальных файлах каталога) и добавлять/обновлять строку в `/.claude/memory/MEMORY.md`. В глобальный auto-memory каталог (`~/.claude/projects/.../memory/`) для этого проекта больше ничего не писать — там оставлен только редирект в `MEMORY.md`, читать его не нужно, актуальное состояние — в репозитории. diff --git a/.claude/memory/feedback_no_commit.md b/.claude/memory/feedback_no_commit.md new file mode 100644 index 0000000..8c78c71 --- /dev/null +++ b/.claude/memory/feedback_no_commit.md @@ -0,0 +1,12 @@ +--- +name: feedback-no-commit +description: Не коммитить и не пушить — пользователь делает это вручную сам +metadata: + type: feedback +--- + +Никогда не делать `git commit` / `git push` в проекте Bicycle — пользователь коммитит вручную сам. + +**Why:** Пользователь явно сказал, что фиксирует изменения в git самостоятельно. + +**How to apply:** Делать правки кода, тесты, обновлять CLAUDE.md — но останавливаться перед коммитом. Не предлагать «закоммитить» как следующий шаг и не выполнять коммит даже если работа завершена. Про коммит вообще не упоминать и не спрашивать про него в конце ответа — просто молча завершать работу на изменённых файлах. diff --git a/.claude/memory/feedback_russian_communication.md b/.claude/memory/feedback_russian_communication.md new file mode 100644 index 0000000..e350da7 --- /dev/null +++ b/.claude/memory/feedback_russian_communication.md @@ -0,0 +1,12 @@ +--- +name: feedback-russian-communication +description: Весь текст, включая описания Bash-вызовов и подобных tool-call'ов, писать по-русски +metadata: + type: feedback +--- + +Вся коммуникация в этом проекте — по-русски. Это касается не только основного текста ответов, но и служебных полей: `description` у вызовов Bash-тула и аналогичных коротких подписей к действиям. + +**Why:** Пользователь не понял английские описания команд ("List files...", "Run tests..." и т.п.) и явно попросил писать по-русски. + +**How to apply:** При каждом вызове Bash (и других тулов с полем `description`) писать краткое описание действия по-русски, в духе "Запустить тесты", "Показать статус git", "Перенести файл". diff --git a/.claude/memory/idea_cli_entrypoint.md b/.claude/memory/idea_cli_entrypoint.md new file mode 100644 index 0000000..b46f27d --- /dev/null +++ b/.claude/memory/idea_cli_entrypoint.md @@ -0,0 +1,16 @@ +--- +name: idea-cli-entrypoint +description: Идея на будущее — добавить CLI-точку входа (cli.php) для миграций/крона/скриптов +metadata: + type: project +--- + +Отложенная идея для Bicycle: добавить **CLI-точку входа** — отдельный скрипт `cli.php` в корне (рядом с `index.php`), запускаемый из терминала (`php cli.php <команда>`). + +Назначение: миграции БД, крон-задачи (рассылки/отчёты), обслуживающие скрипты (сидинг, очистка логов) — то, что нельзя/опасно вешать на веб-URL. + +Структура: `cli.php` повторяет «голову» `index.php` (константы, autoload, `Core::init()`), но вместо `Request::factory()->execute()` разбирает `$argv` и запускает команду. Команды — классы в `App/Command/` (аналог контроллеров для консоли), простой роутинг по имени. `symfony/console` — оверкилл для «велосипеда» (см. `feedback_educational_project.md`). + +**Why:** пользователю идея понравилась, но решили отложить — пока нет потребителя (нет слоя БД → нет миграций, нет крон-задач). Делать сейчас = пустая инфраструктура без клиента (как был удалённый `ApiController`). + +**How to apply:** реализовать, когда появится первый реальный потребитель — вероятнее всего слой БД (первый клиент — миграции, см. `roadmap.md`) или конкретная фоновая задача. Тогда `cli.php` пишется за полчаса под неё. diff --git a/.claude/memory/project_bicycle.md b/.claude/memory/project_bicycle.md deleted file mode 100644 index 5b78fea..0000000 --- a/.claude/memory/project_bicycle.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -name: project-bicycle-overview -description: "Текущее состояние проекта Bicycle — PHP MVC micro-framework, реализованные классы и планы" -metadata: - type: project ---- - -Проект Bicycle — самописный PHP MVC micro-framework (PHP >= 8.2), автор Egor Isaev. - -**Why:** Учебный/экспериментальный проект ("изобрести велосипед"). Не предлагать заменить на Laravel/Symfony. - -**How to apply:** При добавлении фич ориентироваться на стиль существующих классов. Всегда обновлять CLAUDE.md после изменений без напоминаний ([[feedback-update-claude-md]]). - -### Уже реализовано (по состоянию на 2026-06-23) - -**Ядро MVC:** -- `Core`, `Route`, `Request`, `Response`, `Controller`, `View`, `MyException` - -**HTTP-инфраструктура:** -- `HTTP` (redirect, request_headers) -- `HTTP\Header` (ArrayObject, send) -- `HTTP\Message` (интерфейс) -- `HTTP\Request` (интерфейс, константы методов) -- `HTTP\HTTPException` (factory, get_response) -- `HTTP\Exception\HTTPException_302/403/404` -- `HTTP\Client\{Request, Curl, Response}` (исходящие запросы) - -**Состояние и конфиг:** -- `Session` (синглтон, именованные сессии) -- `Cookie` (статический хелпер) -- `Config` (lazy-load + merge config.local.php) - -**Приложение:** `IndexController` (`indexAction` GET + `postAction` POST — демо HTTP-клиента к jsonplaceholder), шаблон `App/view/Index/index.html`. - -**Тесты:** 111 тестов, все проходят (`docker exec bicycle vendor/bin/phpunit`). - -### Не реализовано / заготовки - -- `Services/DataBase`, `Services/Mail`, `Services/PDF` — пустые каталоги, кода нет (зависимости PDO/PHPMailer/dompdf в composer.json есть). -- `App/Classes/` — отсутствует. -- Запланировано: `Model`, `BaseController` (before/after), `Database`+`PdoDriver` (PDO singleton с failover), `Statement` (showQuery/sq), `Repository` (CRUD + транзакции/SAVEPOINT), `Profiler`/`ProfilerPDO`. - -### Важные ограничения - -- Переменная окружения среды — `APP_ENV` (раньше была `MMH_ENV`), задаётся в `.htaccess` через `SetEnv`. -- **Никогда не трогать** `/home/isaevea/http/docker-dev/docker/php-apache/8.2.8/Dockerfile` -- Apache config: `/home/isaevea/http/docker-dev/conf/Bicycle/apache2/apache2.conf` -- `Core::init()` не вызывается в тестовом bootstrap (конфликт с PHPUnit handlers) -- PHPStorm: volume `/home/isaevea/http/Bicycle` → `/opt/project`, autoload `/opt/project/vendor/autoload.php` diff --git a/.claude/memory/roadmap.md b/.claude/memory/roadmap.md new file mode 100644 index 0000000..b00e056 --- /dev/null +++ b/.claude/memory/roadmap.md @@ -0,0 +1,20 @@ +--- +name: roadmap +description: Что ещё не реализовано в Bicycle — слой БД и связанные классы +metadata: + type: project +--- + +Запланировано, но пока не реализовано (по состоянию на 2026-08-06): + +- `Model` — лёгкий base-класс с `__get`/`__set`, `toArray()`. +- `Database` + `PdoDriver` — PDO singleton с failover. +- `Statement` — расширение `PDOStatement` (`showQuery()`/`sq()`). +- `Repository` — abstract CRUD с транзакциями/SAVEPOINT. +- `Profiler` + `ProfilerPDO` — тайминги SQL-запросов. + +Также пустые каталоги-заготовки без кода: `Services/DataBase`, `Services/Mail`, `Services/PDF`, `App/Classes/` (см. CLAUDE.md → Directory layout). + +**Why:** Это следующий крупный слой фреймворка (доступ к БД) — под него уже есть заготовка в composer.json/каталогах, но кода ещё нет. + +**How to apply:** При запросах, касающихся БД/моделей/репозиториев — предлагать реализацию в этом стиле (не ORM-фреймворк вроде Doctrine/Eloquent, а лёгкая обёртка в духе остального проекта). См. также `idea_cli_entrypoint.md` — CLI-точка входа отложена именно до появления этого слоя (первый реальный потребитель — миграции). diff --git a/App/Controller/IndexController.php b/App/Controller/IndexController.php index 24425c8..5c01403 100644 --- a/App/Controller/IndexController.php +++ b/App/Controller/IndexController.php @@ -25,12 +25,7 @@ class IndexController extends Controller */ public function indexAction(): string { - // GET-запрос - $response = (new Curl())->execute( - HttpRequest::factory('https://jsonplaceholder.typicode.com/todos/1') - ); - - $todo = $response->isSuccess() ? $response->json() : []; + $todo = []; return $this->render('index', ['todo' => $todo]); } diff --git a/CLAUDE.md b/CLAUDE.md index 19bf052..db1c3bb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -419,3 +419,9 @@ PHPUnit 11 в Docker-контейнере `bicycle`. Bootstrap: `tests/bootstrap ### Frontend dependencies (через Composer) Bootstrap 5.3, Bootstrap Icons 1.13, jQuery 3.7.1, jQuery UI 1.12, Select2 4.1 — из `vendor/`. + +## Дополнительно + +Узкие темы (конвенции именования, правила работы с Claude Code, roadmap и т.п.) — не здесь, а в +`.claude/memory/` (по одному файлу на тему, индекс — `.claude/memory/MEMORY.md`). Этот файл — только +общая архитектура и команды.