php artisan boost:add-skill php-concept/core-2
Save this content to: AGENTS.md
# Concept Core 2 — інструкції для агента
> Цей repo — **тонке ядро**. Повний контекст (skeleton, extensions, symlink) — у
> [`/var/www/concept-skeleton-dev-2/AGENTS.md`](/var/www/concept-skeleton-dev-2/AGENTS.md).
## Швидкий контекст
- **Active code**: `src/`
- **Old reference (не видаляти поки мігруємо)**: `storage/src/`
- **Old configs (reference, не підключені)**: `storage/config/`
- **Namespace**: `Concept\Core\`
- **PHP**: 8.4, PHPStan level 9
Skeleton підключає цей проєкт через symlink:
```
/var/www/concept-skeleton-dev-2/vendor/php-concept/core-2 → /var/www/concept-core-2/
```
## Що входить у тонке ядро
| Компонент | Файл |
|-----------|------|
| Application | `src/App.php` |
| HTTP runner | `src/Http/HttpRunner.php` |
| HTTP kernel provider | `src/Providers/Http/HttpKernelServiceProvider.php` |
| Route strategy | `src/Http/Routing/RouteStrategy.php` |
| Resolver contract | `src/Http/Contracts/ArgumentResolverInterface.php` |
| Interceptor contract | `src/Http/Contracts/RouteInterceptorInterface.php` |
## Що НЕ входить у ядро (→ extensions у skeleton)
- FormRequest / Validation
- Caster / Valinor
- Session, View, Database, Telemetry, Console, …
- **Config** — extension на фінальному етапі (зараз **без ConfigInterface**)
Див. `storage/src/` та `storage/config/` як reference для міграції.
## Конфігурація — без ConfigInterface
Під час міграції **ядро не використовує ConfigInterface**. Усі налаштування передаються skeleton-ом явно (масиви, параметри конструкторів providers).
`storage/config/` — PHP-файли старого додатку (`app.php`, `db.php`, `routes.php`, …). Reference only; не autoload, не bootstrap.
Config extension (пізніше) читатиме конфіги і прокидатиме значення в glue — ядро лишається без Config.
## RequestContext lifetime
- `App::requestFromGlobals` — FPM/FrankenPHP entry: `fromGlobals` + `reset`/`set` RequestContext.
- `HttpRunner::handle` — `set($request)` на вході; `reset()` **лише після успішного** dispatch (fail лишає context для Whoops). RoadRunner може передати готовий PSR-7 прямо в `handle`.
- `RouteStrategy` — оновлює context на enriched request перед handler; **не** скидає.
- Whoops `RenderHttpErrorHandler` — читає `RequestContext::current()`; наступний `requestFromGlobals` / `handle` затирає context.
## Enriched request — без container refresh
`RouteStrategy::prepareRequest()` додає route vars у PSR-7 attributes і повертає enriched request для resolvers/handler.
Entrypoint: `$app->requestFromGlobals(...)` → `$app->handle($request)`. У контейнері `ServerRequestInterface` **не** реєструється.
Extensions отримують request явно (resolver args, method params) або через `RequestContext` під час HTTP lifecycle.
## Argument resolvers — core (implemented)
`src/Http/Routing/Resolvers/`:
1. **ServerRequestArgumentResolver** — type hint `ServerRequestInterface`
2. **RouteParameterArgumentResolver** — param name ∈ route `$vars`, raw value
Registered by skeleton via `HttpKernelServiceProvider` constructor (`$resolvers` chain).
## Залежності (composer.json)
- `league/container`, `league/route`
- `laminas/laminas-diactoros`, `laminas/laminas-httphandlerrunner`
Без Valinor, без validator, без twig/plates.
## Перевірка
```bash
cd /var/www/concept-core-2
vendor/bin/phpstan
```
---
*Детальний roadmap і поточний стан — у skeleton AGENTS.md.*
Цей repo — тонке ядро. Повний контекст (skeleton, extensions, symlink) — у
/var/www/concept-skeleton-dev-2/AGENTS.md.
src/storage/src/storage/config/Concept\Core\Skeleton підключає цей проєкт через symlink:
/var/www/concept-skeleton-dev-2/vendor/php-concept/core-2 → /var/www/concept-core-2/
| Компонент | Файл |
|---|---|
| Application | src/App.php |
| HTTP runner | src/Http/HttpRunner.php |
| HTTP kernel provider | src/Providers/Http/HttpKernelServiceProvider.php |
| Route strategy | src/Http/Routing/RouteStrategy.php |
| Resolver contract | src/Http/Contracts/ArgumentResolverInterface.php |
| Interceptor contract | src/Http/Contracts/RouteInterceptorInterface.php |
Див. storage/src/ та storage/config/ як reference для міграції.
Під час міграції ядро не використовує ConfigInterface. Усі налаштування передаються skeleton-ом явно (масиви, параметри конструкторів providers).
storage/config/ — PHP-файли старого додатку (app.php, db.php, routes.php, …). Reference only; не autoload, не bootstrap.
Config extension (пізніше) читатиме конфіги і прокидатиме значення в glue — ядро лишається без Config.
App::requestFromGlobals — FPM/FrankenPHP entry: fromGlobals + reset/set RequestContext.HttpRunner::handle — set($request) на вході; reset() лише після успішного dispatch (fail лишає context для Whoops). RoadRunner може передати готовий PSR-7 прямо в handle.RouteStrategy — оновлює context на enriched request перед handler; не скидає.RenderHttpErrorHandler — читає RequestContext::current(); наступний requestFromGlobals / handle затирає context.RouteStrategy::prepareRequest() додає route vars у PSR-7 attributes і повертає enriched request для resolvers/handler.
Entrypoint: $app->requestFromGlobals(...) → $app->handle($request). У контейнері ServerRequestInterface не реєструється.
Extensions отримують request явно (resolver args, method params) або через RequestContext під час HTTP lifecycle.
src/Http/Routing/Resolvers/:
ServerRequestInterface$vars, raw valueRegistered by skeleton via HttpKernelServiceProvider constructor ($resolvers chain).
league/container, league/routelaminas/laminas-diactoros, laminas/laminas-httphandlerrunnerБез Valinor, без validator, без twig/plates.
cd /var/www/concept-core-2
vendor/bin/phpstan
Детальний roadmap і поточний стан — у skeleton AGENTS.md.
How can I help you explore Laravel packages today?