This commit is contained in:
Egor Isaev 2026-08-06 17:02:53 +03:00
parent bbeb36b2e8
commit af0c247403
12 changed files with 132 additions and 58 deletions

View File

@ -1,5 +1,14 @@
# Memory Index # Memory Index
- [Обзор проекта Bicycle](project_bicycle.md) — текущее состояние фреймворка, реализованные классы, план, ограничения Тематическая память по проекту Bicycle. CLAUDE.md — общая архитектура/команды; здесь — узкие темы, чтобы не читать много текста ради конкретного вопроса.
- [Обновлять CLAUDE.md без напоминаний](feedback_update_claude_md.md) — после каждого изменения кода обновлять CLAUDE.md автоматически
- [Правила именования и PHPDoc](feedback_naming_phpdoc.md) — snake_case переменные, camelCase методы, PascalCase классы, PHPDoc везде - [Именование и 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 для миграций/крона

View File

@ -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-обёрткой).

View File

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

View File

@ -0,0 +1,12 @@
---
name: feedback-less-confirmation
description: Не переспрашивать по мелочам — действовать напрямую на обратимых/некритичных шагах
metadata:
type: feedback
---
Пользователь просил меньше останавливаться на уточнения и подтверждения по некритичным вещам — просто делать, что просят.
**Why:** Прямо сказал: «можно это не спрашивать? и всякую такую ересь тоже просто делай как я прошу» — раздражают лишние паузы на подтверждение очевидных/некритичных шагов.
**How to apply:** Для обычных, обратимых действий (создать папку, перенести файл, применить уже согласованное архитектурное решение) — не спрашивать через AskUserQuestion и не описывать заранее «что сделает команда» ради согласия, если пользователь уже задал направление. Уточнять вопросом стоит только при реально неоднозначном архитектурном выборе, когда пользователь явно не обозначил предпочтение (например: класть Auth в System vs Services — там решение зависит от вкуса пользователя). Системный диалог подтверждения инструмента (permission prompt) — UI харнеса, не мой вызов, на него не влияю, но не нужно самому дублировать эти паузы вопросами.

View File

@ -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-памяти по этому проекту — создавать/обновлять файл в `<repo>/.claude/memory/{topic}.md` (формат: frontmatter `name`/`description`/`metadata.type` + текст с **Why:**/**How to apply:**, как в остальных файлах каталога) и добавлять/обновлять строку в `<repo>/.claude/memory/MEMORY.md`. В глобальный auto-memory каталог (`~/.claude/projects/.../memory/`) для этого проекта больше ничего не писать — там оставлен только редирект в `MEMORY.md`, читать его не нужно, актуальное состояние — в репозитории.

View File

@ -0,0 +1,12 @@
---
name: feedback-no-commit
description: Не коммитить и не пушить — пользователь делает это вручную сам
metadata:
type: feedback
---
Никогда не делать `git commit` / `git push` в проекте Bicycle — пользователь коммитит вручную сам.
**Why:** Пользователь явно сказал, что фиксирует изменения в git самостоятельно.
**How to apply:** Делать правки кода, тесты, обновлять CLAUDE.md — но останавливаться перед коммитом. Не предлагать «закоммитить» как следующий шаг и не выполнять коммит даже если работа завершена. Про коммит вообще не упоминать и не спрашивать про него в конце ответа — просто молча завершать работу на изменённых файлах.

View File

@ -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", "Перенести файл".

View File

@ -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` пишется за полчаса под неё.

View File

@ -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`

20
.claude/memory/roadmap.md Normal file
View File

@ -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-точка входа отложена именно до появления этого слоя (первый реальный потребитель — миграции).

View File

@ -25,12 +25,7 @@ class IndexController extends Controller
*/ */
public function indexAction(): string public function indexAction(): string
{ {
// GET-запрос $todo = [];
$response = (new Curl())->execute(
HttpRequest::factory('https://jsonplaceholder.typicode.com/todos/1')
);
$todo = $response->isSuccess() ? $response->json() : [];
return $this->render('index', ['todo' => $todo]); return $this->render('index', ['todo' => $todo]);
} }

View File

@ -419,3 +419,9 @@ PHPUnit 11 в Docker-контейнере `bicycle`. Bootstrap: `tests/bootstrap
### Frontend dependencies (через Composer) ### Frontend dependencies (через Composer)
Bootstrap 5.3, Bootstrap Icons 1.13, jQuery 3.7.1, jQuery UI 1.12, Select2 4.1 — из `vendor/`. 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`). Этот файл — только
общая архитектура и команды.