From 04bc9c8461625161a603ee2413d5a570441335f5 Mon Sep 17 00:00:00 2001 From: davidbalbino Date: Thu, 20 Aug 2026 19:20:45 -0300 Subject: [PATCH 1/8] docs: publish expressive PAM API guide --- src/content/docs/packages/api.mdx | 123 +++++++++++++++++++++++++++++- 1 file changed, 119 insertions(+), 4 deletions(-) diff --git a/src/content/docs/packages/api.mdx b/src/content/docs/packages/api.mdx index a4de8fc..e568ac8 100644 --- a/src/content/docs/packages/api.mdx +++ b/src/content/docs/packages/api.mdx @@ -1,9 +1,11 @@ --- title: pushinbr/pam-api -description: Routing, middleware, error boundaries, and package discovery for native PAM applications. +description: Express-like routing with Laravel-style controllers, validation, resources, dependency injection, and production boundaries. --- -`pushinbr/pam-api` is PAM's optional HTTP application layer. It provides static and parameterized routes, `404` and `405` handling, a compiled middleware pipeline, error boundaries, providers, and package discovery. +`pushinbr/pam-api` is PAM's optional HTTP application layer. It combines +Express-like route ergonomics with Laravel-style application boundaries while +keeping the persistent PAM runtime explicit and safe. ```bash pam composer require pushinbr/pam-api @@ -37,6 +39,114 @@ $app->post('/users', static function ($request, $response) { $app->listen(3000); ``` +## Controllers and method mapping + +Routes accept closures, invokable controllers, or an explicit controller and +method pair: + +```php +$app->post('/orders', CreateOrderController::class); +$app->post('/login', [LoginController::class, 'onLogin']); +``` + +Class-and-method handlers are checked when the route is registered. PAM resolves +the controller through its container, injects constructor services, and injects +request, response, container services, and named route parameters into the +action method. + +```php +final readonly class LoginController +{ + public function __construct(private LoginService $login) {} + + public function onLogin(LoginRequest $request): AuthResource + { + return new AuthResource($this->login->handle($request->validated())); + } +} +``` + +## Fluent routes and groups + +```php +use Pam\Api\RouteConstraint; +use Pam\Api\RouteRegistrar; + +$app->prefix('/api/v1') + ->middleware(Authenticate::class) + ->group(function (RouteRegistrar $routes): void { + $routes->apiResource('/users', UserController::class); + + $routes->get('/users/{id}', [UserController::class, 'show']) + ->where('id', RouteConstraint::Integer) + ->name('users.show'); + }); +``` + +Built-in constraints cover integers, UUIDs, ULIDs, slugs, alphabetic values and +alphanumeric values. `where()` also accepts an explicit regular expression. + +## Container and request scope + +```php +$container = $app->container(); +$container->bind(UserRepository::class, DatabaseUserRepository::class); +$container->singleton(Cache::class, RedisCache::class); +$container->scoped(CurrentUser::class); +``` + +Transient bindings create a value for each resolution. Singletons live for the +worker. Scoped values live only for the current request and are discarded in a +`finally` boundary, including exceptional responses. Never place request or +tenant state in a singleton. + +## Form Requests + +```php +use Pam\Api\Validation\FormRequest; +use Pam\Api\Validation\Rule; + +final class LoginRequest extends FormRequest +{ + public function rules(): array + { + return [ + 'email' => ['required', 'string', 'email'], + 'type' => ['required', Rule::enum(UserType::class)], + ]; + } +} + +enum UserType: int +{ + case Regular = 1; + case Administrator = 2; +} +``` + +Validation and authorization stay outside controllers. Validation failures use +Problem Details and stable integer error codes. Status/type/state/kind/category +values should be sequential integer-backed enums. + +## JSON Resources + +Handlers may return `JsonResource` or `ResourceCollection`. PAM converts them +into consistent `data` and optional `meta` envelopes: + +```php +final readonly class UserResource extends JsonResource +{ + public function toArray(Request $request): array + { + return [ + 'id' => $this->resource->id, + 'name' => $this->resource->name, + 'type' => $this->resource->type->value, + ]; + } +} +``` + Convenience methods exist for `GET`, `POST`, `PUT`, `PATCH`, and `DELETE`. Use `route()` for another valid HTTP method. Route paths must be absolute and cannot include a query string. A parameter occupies an entire segment: @@ -113,11 +223,16 @@ Routes, middleware, providers, error handlers, and PSR handlers cannot be change | Type | Public surface | | --- | --- | -| `App` | `get()`, `post()`, `put()`, `patch()`, `delete()`, `route()`, `middleware()`, `handler()`, `provider()`, `onError()`, `listen()`, `handle()` | +| `App` | Route verbs, `prefix()`, `group()`, `container()`, middleware, providers, errors, listener and request handling | | `Router` | `add(method, path, handler)`, `match(method, path)`, `routes()` | +| `RouteRegistrar` | Prefix/group composition and REST resource registration | +| `PendingRoute` | Route names, constraints and route middleware | +| `Container` | Transient, singleton and request-scoped dependency resolution | +| `FormRequest` | Dedicated authorization and input validation | +| `JsonResource` | Domain response transformation and `data` envelopes | | `Pipeline` | Construct with middleware and a destination; execute with `handle()` | | `CallableRequestHandler` | Adapts a callable to `RequestHandlerInterface` | -| `Route` | Readonly method, path, handler closure, compiled pattern and parameter names | +| `Route` | Method, path, compiled handler, matching metadata and route middleware | | `RoutingResult` | Readonly type, matched route, decoded parameters and allowed methods | | `PackageDiscovery` | `providers(projectRoot)` reads Composer package provider metadata | From e4793cc1d20f1e2d3608647f9a63fece1c955fda Mon Sep 17 00:00:00 2001 From: davidbalbino Date: Thu, 20 Aug 2026 19:21:46 -0300 Subject: [PATCH 2/8] docs: surface PAM API in platform introduction --- src/content/docs/introduction.mdx | 5 +++++ src/content/docs/packages/overview.mdx | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/content/docs/introduction.mdx b/src/content/docs/introduction.mdx index d612a0f..28d689d 100644 --- a/src/content/docs/introduction.mdx +++ b/src/content/docs/introduction.mdx @@ -109,6 +109,11 @@ WebSockets, PSR interoperability, testing, native UI, and extension contracts remain ordinary Composer packages with versioned public APIs. PAM expands what PHP can host without replacing the ecosystem that made PHP valuable. +Start a server application with [`pushinbr/pam-api`](../packages/api/), the +Express-like HTTP layer with controller method mapping, Laravel-style route +groups, dependency injection, request-scoped services, dedicated validation, +Resources, middleware and production-safe error boundaries. + ## What PAM is not PAM is not a new programming language, a PHP fork, a framework, or a Composer replacement. A standard `composer.json`, `composer.lock`, PSR-4 autoloader, and `vendor/autoload.php` remain the project contract. diff --git a/src/content/docs/packages/overview.mdx b/src/content/docs/packages/overview.mdx index be04d7f..f906011 100644 --- a/src/content/docs/packages/overview.mdx +++ b/src/content/docs/packages/overview.mdx @@ -26,7 +26,7 @@ custom lockfile, or proprietary package format is required. | Package | Purpose | | --- | --- | -| `pushinbr/pam-api` | Routing, route parameters, middleware, error handling, and package discovery | +| [`pushinbr/pam-api`](/packages/api/) | Express-like routing with controller method mapping, Laravel-style validation, Resources, dependency injection and middleware | | `pushinbr/pam-socket` | WebSocket events, rooms, broadcasts, acknowledgements, adapters, and resume support | | `pushinbr/pam-psr-bridge` | PSR-7, PSR-15, and PSR-17 interoperability using official interfaces | | `pushinbr/pam-testing` | In-memory HTTP client and fluent response assertions | From 1e301dce91107f4a2c41304d8cf8a723074731ce Mon Sep 17 00:00:00 2001 From: davidbalbino Date: Thu, 20 Aug 2026 19:23:48 -0300 Subject: [PATCH 3/8] docs: explain shared API rate limiting --- src/content/docs/packages/api.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/content/docs/packages/api.mdx b/src/content/docs/packages/api.mdx index e568ac8..7b978bc 100644 --- a/src/content/docs/packages/api.mdx +++ b/src/content/docs/packages/api.mdx @@ -264,7 +264,11 @@ $app `CorsMiddleware` handles matching origins and terminates valid preflight requests with `204`. Never combine wildcard origins with credentials. `RateLimitMiddleware` is a per-worker, in-memory token bucket keyed by -`REMOTE_ADDR`; use an upstream or shared limiter when limits must be global. +`REMOTE_ADDR` by default. Pass a `RateLimitStore` backed by Redis or another +atomic shared system when limits must be global across workers, and pass a +custom key resolver for user, token or tenant limits. Proxy-derived client +addresses must only be accepted behind an explicitly trusted proxy boundary. +Limit, remaining and retry headers are emitted with a Problem Details `429`. `SecurityHeadersMiddleware` adds content-type, frame, referrer and permissions policies; HSTS is added only when `HTTPS=on`. From 552ebe17b7bdc83afa1f06be32c4a0a91b24335c Mon Sep 17 00:00:00 2001 From: davidbalbino Date: Thu, 20 Aug 2026 19:45:16 -0300 Subject: [PATCH 4/8] docs: complete PAM API platform reference --- src/content/docs/packages/api.mdx | 48 +++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/content/docs/packages/api.mdx b/src/content/docs/packages/api.mdx index 7b978bc..92a3f89 100644 --- a/src/content/docs/packages/api.mdx +++ b/src/content/docs/packages/api.mdx @@ -128,6 +128,13 @@ Validation and authorization stay outside controllers. Validation failures use Problem Details and stable integer error codes. Status/type/state/kind/category values should be sequential integer-backed enums. +Validated values can be hydrated into a readonly DTO, including backed enum +constructor arguments: + +```php +$data = $request->dto(CreateUserData::class); +``` + ## JSON Resources Handlers may return `JsonResource` or `ResourceCollection`. PAM converts them @@ -272,6 +279,47 @@ Limit, remaining and retry headers are emitted with a Problem Details `429`. `SecurityHeadersMiddleware` adds content-type, frame, referrer and permissions policies; HSTS is added only when `HTTPS=on`. +## Authentication, idempotency, and tenants + +Authentication uses application-provided `Authenticator` and `Principal` +contracts. The authenticated principal and resolved tenant exist only in the +current request scope. Ability checks never retain user state in a worker +singleton. + +`IdempotencyMiddleware` replays an identical request and rejects reuse of the +same key with a different payload. Response caching and idempotency both use +replaceable stores; bounded memory stores are included for development and +tests, while multiworker deployments should provide atomic shared adapters. + +## OpenAPI and clients + +```php +$app->post('/users', [UserController::class, 'store']) + ->name('users.store') + ->summary('Create a user') + ->tags(['Users']) + ->input(StoreUserRequest::class) + ->output(UserResource::class); + +$contract = $app->openApi('My API', '1.0.0'); +$json = $contract->toJson(); +$typescript = $contract->client(ClientLanguage::TypeScript); +``` + +Kotlin and Swift clients use the same OpenAPI 3.1 contract. Compatibility +checks report removed paths and operations through sequential integer codes. + +## Production and testing contracts + +The package includes replaceable contracts for transactions, events, jobs, +cache, retry, circuit breakers, deadlines, health checks, tenant resolution and +request observations. SSE remains in PAM's native response API; WebSocket rooms +and events remain in `pushinbr/pam-socket`. + +`TestClient` executes the real application pipeline without a network socket +and provides status, header, JSON and JSON-path assertions. Container +diagnostics expose request-scope state for leak checks. + :::note[License] `pushinbr/pam-api` uses the Apache License 2.0. ::: From 2229d2099773e2b73d87c556784a3e5f318f08fb Mon Sep 17 00:00:00 2001 From: davidbalbino Date: Fri, 21 Aug 2026 22:49:06 -0300 Subject: [PATCH 5/8] docs: publish Composer-native PAM ecosystem --- README.md | 24 ++++------- astro.config.mjs | 6 +-- public/schemas/pam.schema.json | 17 ++++++-- scripts/check-repository-coverage.mjs | 29 +++++++++---- src/components/PamEcosystem.astro | 14 +++---- src/components/PamHome.astro | 32 +++++++-------- src/content/docs/community/security.mdx | 5 ++- src/content/docs/desktop/overview.mdx | 20 +++++++-- src/content/docs/desktop/stability.mdx | 2 +- .../docs/getting-started/choose-a-target.mdx | 4 +- src/content/docs/getting-started/cli.mdx | 9 ++-- .../docs/getting-started/extending-cli.mdx | 41 ++++++++++++++++--- .../docs/getting-started/first-app.mdx | 16 ++++---- .../docs/getting-started/installation.mdx | 4 +- src/content/docs/introduction.mdx | 21 +++++----- src/content/docs/laravel/overview.mdx | 12 +++++- src/content/docs/laravel/package-matrix.mdx | 6 ++- src/content/docs/native/overview.mdx | 15 ++++--- src/content/docs/native/php-api-index.mdx | 2 +- src/content/docs/packages/api.mdx | 19 +++++++-- src/content/docs/packages/core-api.mdx | 17 +++++--- .../docs/packages/distribution-mirrors.mdx | 10 ++--- .../docs/packages/mobile-ui-architecture.mdx | 8 ++-- .../docs/packages/mobile-ui-catalog.mdx | 4 +- src/content/docs/packages/mobile-ui.mdx | 21 ++++++---- src/content/docs/packages/native-auth.mdx | 15 +++++-- .../packages/native-background-transfer.mdx | 12 +++++- .../docs/packages/native-bluetooth.mdx | 12 +++++- src/content/docs/packages/native-devtools.mdx | 12 +++++- .../docs/packages/native-feature-flags.mdx | 12 +++++- src/content/docs/packages/native-firebase.mdx | 12 +++++- src/content/docs/packages/native-health.mdx | 12 +++++- src/content/docs/packages/native-intents.mdx | 12 +++++- .../docs/packages/native-laravel-sync.mdx | 14 +++++-- .../docs/packages/native-live-activities.mdx | 12 +++++- src/content/docs/packages/native-maps.mdx | 12 +++++- src/content/docs/packages/native-media.mdx | 12 +++++- src/content/docs/packages/native-nfc.mdx | 12 +++++- src/content/docs/packages/native-nitro.mdx | 22 ++++++---- .../docs/packages/native-observability.mdx | 16 +++++--- src/content/docs/packages/native-payments.mdx | 12 +++++- .../docs/packages/native-plugin-kit.mdx | 18 ++++++-- src/content/docs/packages/native-realtime.mdx | 12 +++++- src/content/docs/packages/native-scanner.mdx | 12 +++++- .../docs/packages/native-share-extension.mdx | 12 +++++- .../docs/packages/native-subscriptions.mdx | 12 +++++- src/content/docs/packages/native-sync.mdx | 12 +++++- src/content/docs/packages/native-testing.mdx | 12 +++++- src/content/docs/packages/native-video.mdx | 12 +++++- src/content/docs/packages/native-widgets.mdx | 12 +++++- src/content/docs/packages/overview.mdx | 31 ++++++-------- src/content/docs/packages/psr-bridge.mdx | 17 ++++++-- src/content/docs/packages/skeleton.mdx | 18 +++++--- src/content/docs/packages/socket.mdx | 9 ++++ src/content/docs/packages/testing.mdx | 13 +++++- src/content/docs/project/release-0-1-33.mdx | 4 +- src/content/docs/project/release-0-1-34.mdx | 4 +- src/content/docs/project/release-0-1-35.mdx | 2 +- src/content/docs/project/release-1-0-2.mdx | 6 +-- src/content/docs/project/repository-map.mdx | 38 +++++++++++------ src/content/docs/project/status.mdx | 2 +- src/content/docs/runtime/compatibility.mdx | 2 +- src/content/docs/runtime/composer.mdx | 8 ++-- src/content/docs/runtime/http.mdx | 4 +- src/content/docs/runtime/websockets.mdx | 2 +- src/styles/pam.css | 16 ++++---- 66 files changed, 621 insertions(+), 238 deletions(-) diff --git a/README.md b/README.md index 4399845..142bfa3 100644 --- a/README.md +++ b/README.md @@ -23,35 +23,29 @@ every public component contract—documented in one place.** --- -PAM is not one binary with a few side projects. It is a coherent PHP -application platform spanning persistent servers, Laravel production -operations, real native mobile interfaces, secure desktop applications, and a -PAM-first package ecosystem that remains fully compatible with Composer. +PAM itself is the small persistent PHP runtime and process boundary. HTTP, +Laravel, Native, Desktop, UI and integrations are independent Composer +products built on top of that runtime—like packages around Node.js. ## Source repositories - [PAM runtime](https://github.com/push-in/pam) - [PAM Native core](https://github.com/push-in/pam-native) -- [PAM Mobile UI](https://github.com/push-in/pam-mobile-ui) +- [PAM Native UI](https://github.com/push-in/pam-native-ui) - [PAM Native Nitro](https://github.com/push-in/pam-native-nitro) - [PAM Desktop](https://github.com/push-in/pam-desktop) - [Laravel on PAM](https://github.com/push-in/pam-laravel) -Official capabilities are installed through the PAM CLI: +Install PAM once, then use Composer through its bundled PHP runtime: ```bash -pam packages -pam add auth -pam add maps -pam add observability +curl -fsSL https://push-in.github.io/pam/install.sh | sh pam doctor +pam composer require pushinbr/pam-native-auth ``` -PAM performs package metadata lookup, dependency compatibility preflight, -updates the normal Composer manifest and lockfile, and refreshes native -integration where required. Package authors and advanced interoperability flows -can still use `pam composer`; application documentation should lead with -`pam add ` whenever an official alias exists. +`pam composer` is the canonical ecosystem workflow. Packages use the normal +`composer.json`, `composer.lock`, Packagist metadata and `vendor/bin` tools. This repository explains that platform without hiding the hard parts. The documentation records public APIs, architectural ownership, lifecycle, diff --git a/astro.config.mjs b/astro.config.mjs index 9eff2d9..d3eb3f1 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -202,11 +202,11 @@ export default defineConfig({ label: 'Packages', items: [ { label: 'Package ecosystem', slug: 'packages/overview' }, - { label: 'pushinbr/pam-api', slug: 'packages/api' }, + { label: 'pushinbr/pam-http', slug: 'packages/http' }, { label: 'pushinbr/pam-socket', slug: 'packages/socket' }, - { label: 'pushinbr/pam-psr-bridge', slug: 'packages/psr-bridge' }, + { label: 'pushinbr/pam-psr', slug: 'packages/psr' }, { label: 'pushinbr/pam-testing', slug: 'packages/testing' }, - { label: 'pushinbr/pam-core-api', slug: 'packages/core-api' }, + { label: 'pushinbr/pam-contracts', slug: 'packages/contracts' }, { label: 'PAM Native Nitro', slug: 'packages/native-nitro' }, { label: 'Application skeleton', slug: 'packages/skeleton' }, { label: 'Distribution mirrors', slug: 'packages/distribution-mirrors' }, diff --git a/public/schemas/pam.schema.json b/public/schemas/pam.schema.json index 6610582..2f72516 100644 --- a/public/schemas/pam.schema.json +++ b/public/schemas/pam.schema.json @@ -59,10 +59,19 @@ { "type": "object", "additionalProperties": false, - "required": ["script"], - "properties": { - "script": {"type": "string", "minLength": 1}, - "description": {"type": "string", "maxLength": 240} + "oneOf": [ + {"required": ["script"]}, + {"required": ["bin"]} + ], + "properties": { + "script": {"type": "string", "minLength": 1}, + "bin": {"type": "string", "minLength": 1}, + "arguments": { + "type": "array", + "maxItems": 32, + "items": {"type": "string", "maxLength": 4096} + }, + "description": {"type": "string", "maxLength": 240} } } ] diff --git a/scripts/check-repository-coverage.mjs b/scripts/check-repository-coverage.mjs index 9949181..671efb1 100644 --- a/scripts/check-repository-coverage.mjs +++ b/scripts/check-repository-coverage.mjs @@ -5,13 +5,13 @@ const root = resolve(import.meta.dirname, '..'); const docs = join(root, 'src', 'content', 'docs'); const requiredRepositories = [ 'pam', - 'pam-api', - 'pam-core-api', + 'pam-http', + 'pam-contracts', 'pam-desktop', 'pam-docs', 'pam-laravel', - 'pam-mobile-ui', - 'pam-mobile-ui-php', + 'pam-native-ui', + 'pam-native-ui-php', 'pam-native', 'pam-native-auth', 'pam-native-background-transfer', @@ -21,7 +21,7 @@ const requiredRepositories = [ 'pam-native-firebase', 'pam-native-health', 'pam-native-intents', - 'pam-native-laravel-sync', + 'pam-native-sync-laravel', 'pam-native-live-activities', 'pam-native-maps', 'pam-native-media', @@ -39,11 +39,22 @@ const requiredRepositories = [ 'pam-native-testing', 'pam-native-video', 'pam-native-widgets', - 'pam-psr-bridge', + 'pam-psr', 'pam-skeleton', 'pam-socket', 'pam-testing', ]; +const compatibilityRepositories = [ + 'pam-api', + 'pam-core-api', + 'pam-mobile-ui', + 'pam-native-laravel-sync', + 'pam-psr-bridge', +]; +const documentedRepositories = [ + ...requiredRepositories, + ...compatibilityRepositories, +]; const mapPath = join(docs, 'project', 'repository-map.mdx'); if (!existsSync(mapPath)) { @@ -51,7 +62,7 @@ if (!existsSync(mapPath)) { } const map = readFileSync(mapPath, 'utf8'); -const missing = requiredRepositories.filter( +const missing = documentedRepositories.filter( (repository) => !map.includes(`\`${repository}\``), ); @@ -65,7 +76,7 @@ const allDocs = walk(docs) .map((path) => readFileSync(path, 'utf8')) .join('\n'); -const undocumented = requiredRepositories.filter( +const undocumented = documentedRepositories.filter( (repository) => !allDocs.includes(repository), ); @@ -74,7 +85,7 @@ if (undocumented.length > 0) { process.exit(1); } -console.log(`${requiredRepositories.length} public PAM repositories have documentation ownership.`); +console.log(`${requiredRepositories.length} canonical and ${compatibilityRepositories.length} compatibility repositories have documentation ownership.`); function walk(directory) { return readdirSync(directory, { withFileTypes: true }).flatMap((entry) => { diff --git a/src/components/PamEcosystem.astro b/src/components/PamEcosystem.astro index 5f8e01c..60100ce 100644 --- a/src/components/PamEcosystem.astro +++ b/src/components/PamEcosystem.astro @@ -8,11 +8,11 @@ const capabilities = [ ['firebase', 'Platform services', 'Analytics, Crashlytics, Remote Config, Messaging, and Installations.', 'pam-native-firebase'], ['health', 'Health', 'Health Connect and HealthKit authorization, reads, and writes.', 'pam-native-health'], ['intents', 'Platform integration', 'Android shortcuts and Apple App Intents for named routes.', 'pam-native-intents'], - ['laravel-sync', 'Data & offline', 'Authenticated Laravel delta and mutation APIs for PAM Native Sync.', 'pam-native-laravel-sync'], + ['laravel-sync', 'Data & offline', 'Authenticated Laravel delta and mutation APIs for PAM Native Sync.', 'pam-native-sync-laravel'], ['live-activities', 'Platform integration', 'ActivityKit Live Activities and Android ongoing notifications.', 'pam-native-live-activities'], ['maps', 'Location', 'Declarative Google Maps and MapKit cameras, markers, and overlays.', 'pam-native-maps'], ['media', 'Media', 'Native media inspection, thumbnails, and embedded camera capture.', 'pam-native-media'], - ['mobile-ui', 'Interface', 'Retained Material Design 3 components for Android and iOS.', 'pam-mobile-ui'], + ['mobile-ui', 'Interface', 'Retained Material Design 3 components for Android and iOS.', 'pam-native-ui'], ['nfc', 'Hardware', 'Lifecycle-safe NDEF reading and writing on Android and iOS.', 'pam-native-nfc'], ['nitro', 'Data & offline', 'Typed, reactive, offline-first data built for native workloads.', 'pam-native-nitro'], ['observability', 'Operations', 'Vendor-neutral spans, logs, metrics, crash context, and export.', 'pam-native-observability'], @@ -40,10 +40,8 @@ const categories = [...new Map(

One command between idea and native capability.

Choose what the product needs. PAM resolves compatibility, updates the project, and refreshes native integration through one predictable workflow.

-
$ pam packages
-$ pam add observability
+  
$ pam composer require pushinbr/pam-native-observability
  Compatibility preflight passed
- Native integration refreshed
 $ pam doctor
@@ -67,7 +65,7 @@ const categories = [...new Map(

{alias}

{description}

- pam add {alias} + pam composer require pushinbr/{repository} diff --git a/src/components/PamHome.astro b/src/components/PamHome.astro index 5a63ceb..43ac094 100644 --- a/src/components/PamHome.astro +++ b/src/components/PamHome.astro @@ -32,7 +32,7 @@ const path = (value: string) => `${base}${value}`; ready
-

$ pam init orbit --template mobile

+

$ pam init orbit --template native

Project created

Native runtime ready

$ cd orbit && pam dev

@@ -80,7 +80,7 @@ const path = (value: string) => `${base}${value}`; - PHP 8.4 + PHP 8.5 @@ -127,7 +127,7 @@ const path = (value: string) => `${base}${value}`; Server Persistent APIs & realtime - pam init app --template api + pam init app --template http HTTP · WebSockets · async I/O @@ -139,7 +139,7 @@ const path = (value: string) => `${base}${value}`; Native mobile Real Android & iOS UI from PHP - pam init app --template mobile + pam init app --template native UIKit · Android Views · no JS runtime @@ -155,19 +155,19 @@ const path = (value: string) => `${base}${value}`; @@ -178,7 +178,7 @@ const path = (value: string) => `${base}${value}`;

- PAM embeds PHP 8.4 through the official Embed SAPI and keeps your application alive. + PAM embeds PHP 8.5 through the official Embed SAPI and keeps your application alive. Composer stays familiar while Rust and Tokio own scheduling, native I/O, and process supervision. It is not a workaround for PHP's past — it is a platform for what PHP can build next.

@@ -281,7 +281,7 @@ const path = (value: string) => `${base}${value}`;
-
+
Persistent API hot path 404,150.56 req/s diff --git a/src/content/docs/community/security.mdx b/src/content/docs/community/security.mdx index a568056..a4e242e 100644 --- a/src/content/docs/community/security.mdx +++ b/src/content/docs/community/security.mdx @@ -9,7 +9,9 @@ Security reports should be handled privately so maintainers can investigate and Until PAM reaches `1.0`, security fixes are released only for the latest tagged version. -PHP itself must remain on an upstream-supported PHP 8.4 patch release. A PAM bundle fixes the Embed runtime and extension set, but applications still need a release process for new PAM and PHP security updates. +PHP itself must remain on an upstream-supported PHP 8.5 patch release by +default. A PAM bundle fixes the Embed runtime and extension set, but applications +still need a release process for new PAM and PHP security updates. ## Report a vulnerability @@ -67,4 +69,3 @@ PAM Desktop is alpha. Broader public distribution still requires product-specifi ## Dependencies Run locked dependency audits and the release gates for the relevant repository. An audit result is evidence about known advisories in the exact dependency graph; it is not proof that the application contains no vulnerability. - diff --git a/src/content/docs/desktop/overview.mdx b/src/content/docs/desktop/overview.mdx index 53eb247..70fdde2 100644 --- a/src/content/docs/desktop/overview.mdx +++ b/src/content/docs/desktop/overview.mdx @@ -41,23 +41,35 @@ collects native effects, and returns the result.
Linux x86-64supported target
-## From zero to a real window +## Start here + +PAM Desktop is a Composer ecosystem product running on the PAM runtime. Install +the runtime first; then create the project and install the desktop package with +PAM's Composer passthrough. -1. Create the application. +1. Install and verify PAM. + + ```bash + curl -fsSL https://push-in.github.io/pam/install.sh | sh + pam doctor + ``` + +2. Create the application and install PAM Desktop. ```bash pam init notes --template desktop cd notes + pam composer require pushinbr/pam-desktop ``` -2. Validate the machine and project contract. +3. Validate the machine and project contract. ```bash pam desktop doctor ``` -3. Start the persistent development session. +4. Start the persistent development session. ```bash pam desktop dev diff --git a/src/content/docs/desktop/stability.mdx b/src/content/docs/desktop/stability.mdx index b53b765..f12730c 100644 --- a/src/content/docs/desktop/stability.mdx +++ b/src/content/docs/desktop/stability.mdx @@ -53,7 +53,7 @@ verification and public artifact attestation. - Linux x86-64; - glibc baseline from Ubuntu 22.04; -- PHP 8.4 workers; +- PHP 8.5 workers by default, with PHP 8.4 compatibility certification; - Rust 1.88 for rebuilding the host and SDK; - supported X11 or Wayland environments in the pinned Winit/Servo stack. diff --git a/src/content/docs/getting-started/choose-a-target.mdx b/src/content/docs/getting-started/choose-a-target.mdx index 68cdd12..d52e313 100644 --- a/src/content/docs/getting-started/choose-a-target.mdx +++ b/src/content/docs/getting-started/choose-a-target.mdx @@ -12,10 +12,10 @@ not by fear that PHP can only live behind a request-response server. | You want to build | Start with | Current boundary | | --- | --- | --- | -| API or web service | `pam init my-api --template api` | PAM 1.0 on Linux x86_64/ARM64 | +| HTTP service | `pam init my-api --template http` | PAM 1.0 on Linux x86_64/ARM64 | | Laravel application | `pam init my-app --template laravel` | Laravel 12 and 13 executable matrix | | Real-time server | Add `--socket` to API or Laravel | Native RFC 6455 transport | -| Native application, low-level UI | `pam init my-app --template mobile` | Android API 26–36; generated iOS host and simulator certification | +| Native application, low-level UI | `pam init my-app --template native` | Android API 26–36; generated iOS host and simulator certification | | Desktop application | `pam init my-app --template desktop` | Linux experimental; macOS/Windows planned | ## Server runtime diff --git a/src/content/docs/getting-started/cli.mdx b/src/content/docs/getting-started/cli.mdx index 2b71009..ae126c2 100644 --- a/src/content/docs/getting-started/cli.mdx +++ b/src/content/docs/getting-started/cli.mdx @@ -59,7 +59,8 @@ pam make:model Post --migration ``` Applications and Composer packages can register their own bounded commands. -Inspect the resolved surface with `pam commands`; built-in names cannot be +Inspect the resolved surface with `pam commands`. Product-context commands may +be owned by an installed package; runtime-authority commands cannot be shadowed. ## Machine-readable contracts @@ -67,7 +68,6 @@ shadowed. ```bash pam info --json pam doctor --json -pam packages --json pam commands --json ``` @@ -82,12 +82,9 @@ The core executable always provides these runtime operations: | Command | Purpose | | --- | --- | -| `pam dev [script.php]` | Watch PHP, Composer, and environment files and restart on change. | | `pam start [script.php]` | Run a supervised multi-worker cluster with zero-downtime reloads. | | `pam exec ` | Execute one PHP script explicitly through PAM's Embed SAPI. | -| `pam artisan [args...]` | Run Laravel console work inside the Embed SAPI. | | `pam composer [args...]` | Run the embedded Composer toolchain. | -| `pam test [path]` | Resolve and run Pest or PHPUnit inside PAM. | | `pam [args...]` | Execute a PHP entry directly; if it registers a server, start serving it. | ### Supervised production start @@ -152,7 +149,7 @@ must use the explicit `pam artisan pam:*` form. ## Ship commands ```bash -pam init hello-api --template api +pam init hello-api --template http pam build --entry public/index.php --output dist pam release --check pam package --entry public/index.php --output artifacts diff --git a/src/content/docs/getting-started/extending-cli.mdx b/src/content/docs/getting-started/extending-cli.mdx index 3c09543..9e90952 100644 --- a/src/content/docs/getting-started/extending-cli.mdx +++ b/src/content/docs/getting-started/extending-cli.mdx @@ -3,9 +3,9 @@ title: Extend the PAM CLI description: Register safe application and Composer-package commands in PAM without installing another global executable. --- -Applications and Composer packages can expose PHP commands through the same PAM -Embed lifecycle. PAM validates names, canonicalizes scripts, rejects paths -outside their owner and prevents built-in or duplicate command shadowing. +Applications and Composer packages can expose embedded PHP scripts or native +executables. PAM validates names, canonicalizes targets, rejects paths outside +their owner and prevents built-in or duplicate command shadowing. ## Application commands @@ -40,7 +40,8 @@ Use a string when no custom description is needed: ## Package commands A Composer package registers commands under `extra.pam.commands`. Paths are -relative to the installed package root: +relative to the installed package root. PAM reads Composer's canonical +`install-path` metadata and honors a custom `config.vendor-dir`: ```json { @@ -58,6 +59,34 @@ relative to the installed package root: } ``` +Use `bin` when the package ships a native CLI: + +```json +{ + "extra": { + "pam": { + "commands": { + "inspector:watch": { + "bin": "bin/pam-inspector", + "arguments": ["watch"], + "description": "Watch application diagnostics" + } + } + } + } +} +``` + +`arguments` is an optional bounded prefix added before user arguments. `script` +runs in PAM's embedded PHP runtime. `bin` receives the project as its +working directory, all command arguments, and the absolute PAM executable in +`PAM_BINARY`. A definition must contain exactly one of `script` or `bin`. + +Installed product packages may own contextual commands such as `dev`, `build`, +`package`, `desktop`, and `mobile`. Their command takes precedence over the +runtime's migration adapter. Runtime-authority commands such as `start`, +process supervision, `composer`, `exec`, and `self-update` cannot be shadowed. + Command names contain lowercase ASCII letters, integers, `:`, `-`, or `_`, start with a letter/integer and contain at most 96 bytes. A package cannot shadow PAM or another registered command; `pam doctor` and discovery fail on a @@ -67,8 +96,10 @@ duplicate. ```bash pam commands --json +pam commands --names ``` Use this output for launchers and editor integrations. Do not parse decorated -terminal output. The project manifest follows the public +terminal output. `--names` is the newline-delimited surface used by generated +Bash, Zsh, Fish and PowerShell completion. The project manifest follows the public [`pam.schema.json`](/schemas/pam.schema.json) JSON Schema. diff --git a/src/content/docs/getting-started/first-app.mdx b/src/content/docs/getting-started/first-app.mdx index 5b5a189..c66a3d0 100644 --- a/src/content/docs/getting-started/first-app.mdx +++ b/src/content/docs/getting-started/first-app.mdx @@ -11,7 +11,7 @@ Every initializer and project command below depends on PAM. Complete ::: ```bash -pam init hello-pam --template api +pam init hello-pam --template http cd hello-pam pam dev index.php ``` @@ -35,7 +35,7 @@ The initializer creates a normal Composer project, selects the first-party packa Use `--no-install` when you want source generation without dependency resolution: ```bash -pam init hello-pam --template api --no-install +pam init hello-pam --template http --no-install ``` ## Add WebSockets @@ -43,7 +43,7 @@ pam init hello-pam --template api --no-install The socket preset enables PAM's native WebSocket transport on the same listener: ```bash -pam init realtime-api --template api --socket +pam init realtime-api --template http --socket ``` ## Build the product you came for @@ -52,10 +52,10 @@ The same project workflow drives every PAM target: | Product | Create it | First visible result | | --- | --- | --- | -| Persistent API | `pam init my-api --template api` | JSON endpoint on port 3000 | +| Persistent HTTP | `pam init my-api --template http` | JSON endpoint on port 3000 | | Laravel | `pam init my-app --template laravel` | Warm Laravel route and working Artisan | -| Native mobile | `pam init my-app --template mobile` | Real Android/iOS controls with hot reload | -| Mobile UI | `pam init my-app --template mobile-ui` | Retained Material Design 3 screen | +| Native mobile | `pam init my-app --template native` | Real Android/iOS controls with hot reload | +| Native UI | `pam init my-app --template native-ui` | Retained Material Design 3 screen | | Desktop | `pam init my-app --template desktop` | Capability-secured native window | ```text @@ -66,8 +66,8 @@ Choose one explicitly: ```bash pam init my-laravel-app --template laravel -pam init native-core --template mobile -pam init native-ui --template mobile-ui +pam init native-core --template native +pam init native-ui --template native-ui pam init my-desktop-app --template desktop ``` diff --git a/src/content/docs/getting-started/installation.mdx b/src/content/docs/getting-started/installation.mdx index cdef179..d00df05 100644 --- a/src/content/docs/getting-started/installation.mdx +++ b/src/content/docs/getting-started/installation.mdx @@ -65,11 +65,11 @@ itself. ## Build the runtime from source -Runtime contributors need Rust 1.88 or newer, a C toolchain, PHP 8.4 development +Runtime contributors need Rust 1.88 or newer, a C toolchain, PHP 8.5 development headers, and the matching Embed library. End users do not need this toolchain. ```bash -sudo apt-get install -y build-essential php8.4-dev libphp8.4-embed +sudo apt-get install -y build-essential php8.5-dev libphp8.5-embed cargo build --locked --release ``` diff --git a/src/content/docs/introduction.mdx b/src/content/docs/introduction.mdx index 28d689d..5001ccc 100644 --- a/src/content/docs/introduction.mdx +++ b/src/content/docs/introduction.mdx @@ -38,15 +38,16 @@ request └─ request N ─┘ ## What PAM is -- A PHP Embed runtime with a Rust and Tokio execution boundary; official - server bundles use PHP 8.4 and PAM Native certifies PHP 8.4 and 8.5. -- A server for HTTP, WebSockets, streaming, native asynchronous I/O, and supervised workers. -- A host for unmodified Laravel applications with per-request sandboxing, - native OTLP, managed processes, release operations, autoscaling, and bounded - automation. -- The runtime behind PAM Native, which renders real Android Views from PHP. -- The worker used by PAM Desktop, where Servo displays local web interfaces inside native windows. -- A collection of optional Composer packages for routing, sockets, PSR interoperability, testing, native UI, and extension contracts. +- A small PHP Embed runtime with a Rust and Tokio execution boundary; official + bundles use PHP 8.5 by default and retain PHP 8.4 as a compatibility runtime. +- Persistent processes, request/response transport, Fibers, native asynchronous + I/O, isolation and supervision. +- The runtime underneath independent Composer products such as PAM HTTP, + Laravel on PAM, PAM Native and PAM Desktop. + +PAM itself is not those products and does not own their application APIs. +Composer packages provide routing, frameworks, UI, integrations and package +commands using the same public extension contract as community packages. ## Why PAM is different @@ -109,7 +110,7 @@ WebSockets, PSR interoperability, testing, native UI, and extension contracts remain ordinary Composer packages with versioned public APIs. PAM expands what PHP can host without replacing the ecosystem that made PHP valuable. -Start a server application with [`pushinbr/pam-api`](../packages/api/), the +Start a server application with [`pushinbr/pam-http`](../packages/http/), the Express-like HTTP layer with controller method mapping, Laravel-style route groups, dependency injection, request-scoped services, dedicated validation, Resources, middleware and production-safe error boundaries. diff --git a/src/content/docs/laravel/overview.mdx b/src/content/docs/laravel/overview.mdx index 07ab229..33673bf 100644 --- a/src/content/docs/laravel/overview.mdx +++ b/src/content/docs/laravel/overview.mdx @@ -15,9 +15,18 @@ scale deliberately, and preserve the framework model teams already know. It is Laravel with a purpose-built runtime underneath it — not Laravel rewritten to fit somebody else's ecosystem. +## Start here + +Laravel support is a Composer ecosystem product running on the PAM runtime. +Install and verify PAM first, create the application, and then install the +integration through PAM's Composer passthrough: + ```bash +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor pam init my-laravel-app --template laravel cd my-laravel-app +pam composer require pushinbr/pam-laravel pam dev pam.php ``` @@ -25,7 +34,8 @@ PAM downloads the official Laravel skeleton, installs its Composer dependencies, ## Supported framework versions -The maintained executable contract covers Laravel 12 and current Laravel 13 on PHP 8.4 Embed. +The maintained executable contract covers Laravel 12 and current Laravel 13 on +PHP 8.5 Embed by default, with PHP 8.4 retained in the compatibility matrix. The matrix exercises boot, providers, middleware, routing, validation, exceptions, terminating callbacks, Eloquent, authentication, sessions, CSRF, uploads, streamed responses, binary responses, package discovery, and stable memory behavior. diff --git a/src/content/docs/laravel/package-matrix.mdx b/src/content/docs/laravel/package-matrix.mdx index aee7415..19c3312 100644 --- a/src/content/docs/laravel/package-matrix.mdx +++ b/src/content/docs/laravel/package-matrix.mdx @@ -9,8 +9,10 @@ PAM's Laravel claim is based on a locked executable matrix, not only a successfu | Framework | PHP | Status | | --- | --- | --- | -| Laravel 12 | PHP 8.4 Embed | Maintained and exercised | -| Laravel 13 | PHP 8.4 Embed | Maintained and exercised | +| Laravel 12 | PHP 8.5 Embed | Default, maintained and exercised | +| Laravel 13 | PHP 8.5 Embed | Default, maintained and exercised | +| Laravel 12 | PHP 8.4 Embed | Compatibility line | +| Laravel 13 | PHP 8.4 Embed | Compatibility line | | Future Laravel releases | — | Unsupported until added to the matrix | Use only framework versions that still receive upstream security fixes. diff --git a/src/content/docs/native/overview.mdx b/src/content/docs/native/overview.mdx index 576acac..10891c9 100644 --- a/src/content/docs/native/overview.mdx +++ b/src/content/docs/native/overview.mdx @@ -3,7 +3,7 @@ title: PAM Native description: Build Android and iOS applications in PHP with real native controls and no JavaScript runtime. --- -PAM Native keeps PHP 8.4 alive and renders platform controls directly. Rust owns validation, reconciliation, diffing, and layout. Kotlin applies mutation batches to Android Views; Swift applies the same protocol to UIKit. +PAM Native runs PHP 8.5 by default and renders platform controls directly. Rust owns validation, reconciliation, diffing, and layout. Kotlin applies mutation batches to Android Views; Swift applies the same protocol to UIKit. It is not a WebView and does not ship React's JavaScript runtime. @@ -40,13 +40,18 @@ Every public authoring style resolves to the same `Renderable → Element → PN Templates are parsed once, validated, and kept in memory. Expressions read component or data paths and do not use `eval`. -## Create and prepare an Android app +## Start here -Install PAM once, then let the CLI own the project lifecycle: +Every PAM product runs on the PAM runtime. Install it once, verify the machine, +create the native application, and install the product package through PAM's +Composer passthrough: ```bash -pam init my-app --template mobile-ui --platform android +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native --platform android cd my-app +pam composer require pushinbr/pam-native pam doctor --fix pam doctor pam dev @@ -88,7 +93,7 @@ production updates without adding work to the first native frame. | Requirement | Contract | | --- | --- | -| PHP | 8.4.x and 8.5.x selectable runtimes | +| PHP | 8.5.x default; 8.4.x remains selectable | | Android | API 26–36 | | PAM Native protocol | Version 1 | | iOS | Generated UIKit host; PHP 8.4/8.5 simulator certification and signed IPA tooling | diff --git a/src/content/docs/native/php-api-index.mdx b/src/content/docs/native/php-api-index.mdx index 02c0066..60799f7 100644 --- a/src/content/docs/native/php-api-index.mdx +++ b/src/content/docs/native/php-api-index.mdx @@ -8,7 +8,7 @@ the focused guides for behavior and examples; use this page to discover the exact type responsible for a capability. ```bash -pam add native +pam composer require pushinbr/pam-native pam doctor ``` diff --git a/src/content/docs/packages/api.mdx b/src/content/docs/packages/api.mdx index 92a3f89..1e6eb9c 100644 --- a/src/content/docs/packages/api.mdx +++ b/src/content/docs/packages/api.mdx @@ -1,14 +1,25 @@ --- -title: pushinbr/pam-api +title: pushinbr/pam-http description: Express-like routing with Laravel-style controllers, validation, resources, dependency injection, and production boundaries. --- -`pushinbr/pam-api` is PAM's optional HTTP application layer. It combines +`pushinbr/pam-http` is PAM's optional HTTP application layer. It combines Express-like route ergonomics with Laravel-style application boundaries while keeping the persistent PAM runtime explicit and safe. +## Start here + +Every PAM product runs on the PAM runtime. Install the runtime once, verify the +machine, create the project, and then use PAM's Composer passthrough to add the +HTTP package: + ```bash -pam composer require pushinbr/pam-api +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-api --template http +cd my-api +pam composer require pushinbr/pam-http +pam dev ``` ## Register routes @@ -321,5 +332,5 @@ and provides status, header, JSON and JSON-path assertions. Container diagnostics expose request-scope state for leak checks. :::note[License] -`pushinbr/pam-api` uses the Apache License 2.0. +`pushinbr/pam-http` uses the Apache License 2.0. ::: diff --git a/src/content/docs/packages/core-api.mdx b/src/content/docs/packages/core-api.mdx index 23485c0..88ce577 100644 --- a/src/content/docs/packages/core-api.mdx +++ b/src/content/docs/packages/core-api.mdx @@ -1,12 +1,19 @@ --- -title: pushinbr/pam-core-api +title: pushinbr/pam-contracts description: Stable package contracts for HTTP applications, middleware, providers, and runtime capability checks. --- -`pushinbr/pam-core-api` contains small versioned contracts for packages that extend PAM. It does not include a router, server, or application framework. +`pushinbr/pam-contracts` contains small versioned contracts for packages that extend PAM. It does not include a router, server, or application framework. + +## Start here + +Install and verify the PAM runtime first, then add the contracts package to a +PAM project through PAM's Composer passthrough: ```bash -pam composer require pushinbr/pam-core-api +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam composer require pushinbr/pam-contracts ``` ## HTTP application contract @@ -33,7 +40,7 @@ interface ApplicationInterface } ``` -Packages should depend on this contract when they need to register routes or middleware without requiring `pushinbr/pam-api` directly. +Packages should depend on this contract when they need to register routes or middleware without requiring `pushinbr/pam-http` directly. ## Middleware contract @@ -115,5 +122,5 @@ and capabilities. `assert()` checks exact ABI equality and every requested `Capability` enum; it throws on absence or mismatch. :::note[License] -`pushinbr/pam-core-api` uses the Apache License 2.0. +`pushinbr/pam-contracts` uses the Apache License 2.0. ::: diff --git a/src/content/docs/packages/distribution-mirrors.mdx b/src/content/docs/packages/distribution-mirrors.mdx index 27016a0..22b7333 100644 --- a/src/content/docs/packages/distribution-mirrors.mdx +++ b/src/content/docs/packages/distribution-mirrors.mdx @@ -1,6 +1,6 @@ --- title: PAM distribution mirrors -description: Understand the canonical-source and generated-distribution roles of pam-native-php and pam-mobile-ui-php. +description: Understand the canonical-source and generated-distribution roles of pam-native-php and pam-native-ui-php. --- Two public repositories are intentionally distribution mirrors rather than @@ -9,13 +9,13 @@ independent PAM products: | Distribution repository | Canonical source | Public capability | | --- | --- | --- | | `push-in/pam-native-php` | `push-in/pam-native` | PAM Native PHP API, templates and protocol surface | -| `push-in/pam-mobile-ui-php` | `push-in/pam-mobile-ui` | PAM Mobile UI PHP components, generated maps and resources | +| `push-in/pam-native-ui-php` | `push-in/pam-native-ui` | PAM Native UI PHP components, generated maps and resources | Application developers install the capability through PAM: ```bash -pam add native -pam add mobile-ui +pam composer require pushinbr/pam-native +pam composer require pushinbr/pam-native-ui pam doctor ``` @@ -36,4 +36,4 @@ canonical source. A mirror that drifts from its source is a release failure—no a second supported API. Read [PAM Native](/native/overview/) and -[PAM Mobile UI](/packages/mobile-ui/) for the actual product guides. +[PAM Native UI](/packages/mobile-ui/) for the actual product guides. diff --git a/src/content/docs/packages/mobile-ui-architecture.mdx b/src/content/docs/packages/mobile-ui-architecture.mdx index a57f744..f4ff422 100644 --- a/src/content/docs/packages/mobile-ui-architecture.mdx +++ b/src/content/docs/packages/mobile-ui-architecture.mdx @@ -1,9 +1,9 @@ --- -title: PAM Mobile UI architecture and quality -description: Rendering, threading, accessibility, performance and parity guarantees behind PAM Mobile UI. +title: PAM Native UI architecture and quality +description: Rendering, threading, accessibility, performance and parity guarantees behind PAM Native UI. --- -PAM Mobile UI is designed around a strict boundary: PHP describes state and +PAM Native UI is designed around a strict boundary: PHP describes state and intent; the native UI thread owns drawing, gestures, transient animation and platform controls. @@ -66,6 +66,6 @@ Before shipping: - test light/dark themes, large text and reduced motion; - run `pam doctor`, platform tests and release benchmarks. -See [PAM Mobile UI](/packages/mobile-ui/) for installation and +See [PAM Native UI](/packages/mobile-ui/) for installation and authoring, and the [component catalog](/packages/mobile-ui-catalog/) for the verified public surface. diff --git a/src/content/docs/packages/mobile-ui-catalog.mdx b/src/content/docs/packages/mobile-ui-catalog.mdx index 57918a2..6863395 100644 --- a/src/content/docs/packages/mobile-ui-catalog.mdx +++ b/src/content/docs/packages/mobile-ui-catalog.mdx @@ -1,6 +1,6 @@ --- -title: PAM Mobile UI component catalog -description: Complete verified catalog of PAM Mobile UI retained-native Material 3 tags for Android and iOS. +title: PAM Native UI component catalog +description: Complete verified catalog of PAM Native UI retained-native Material 3 tags for Android and iOS. --- Every tag below creates or configures retained native UI. The release parity diff --git a/src/content/docs/packages/mobile-ui.mdx b/src/content/docs/packages/mobile-ui.mdx index d2c362c..8bf5d82 100644 --- a/src/content/docs/packages/mobile-ui.mdx +++ b/src/content/docs/packages/mobile-ui.mdx @@ -1,22 +1,29 @@ --- -title: PAM Mobile UI +title: PAM Native UI description: Build polished Android and iOS interfaces in PHP with retained native Material 3 components, typed facades, themes and native directives. --- -PAM Mobile UI is the application-grade component system for PAM Native. It +PAM Native UI is the application-grade component system for PAM Native. It renders real Android views and UIKit controls—there is no WebView, JavaScript runtime or CSS engine between your PHP application and the platform. +## Start here + +PAM Native UI depends on both the PAM runtime and PAM Native. Install PAM first, +verify it, create a native project, and add both Composer packages through PAM: + ```bash -pam add mobile-ui +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native-ui --platform android +cd my-app +pam composer require pushinbr/pam-native pushinbr/pam-native-ui pam doctor pam native dev ``` -`pam add mobile-ui` performs compatibility preflight, updates the application -manifests and lockfile, discovers the native plugin, and refreshes the Android -and iOS registries. Use `pam remove mobile-ui` to uninstall it. Application -developers should use PAM rather than invoking Composer directly. +`pam composer` is the canonical package workflow. It preserves normal Composer +semantics while ensuring commands run inside the PAM project environment. ## Build a screen diff --git a/src/content/docs/packages/native-auth.mdx b/src/content/docs/packages/native-auth.mdx index 4b47e05..807bf6c 100644 --- a/src/content/docs/packages/native-auth.mdx +++ b/src/content/docs/packages/native-auth.mdx @@ -3,13 +3,22 @@ title: PAM Native Auth description: Store encrypted mobile credentials and generate OAuth 2.1 PKCE material with Android Keystore and Apple Keychain. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add auth +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-auth pam doctor +pam native dev ``` -`pam add auth` runs compatibility preflight, updates the project manifests, and -refreshes native integration. Use `pam remove auth` to uninstall it. +The package is installed through `pam composer`. Remove it with `pam composer remove`. ## Vault and PKCE diff --git a/src/content/docs/packages/native-background-transfer.mdx b/src/content/docs/packages/native-background-transfer.mdx index 17cc32e..5d725cb 100644 --- a/src/content/docs/packages/native-background-transfer.mdx +++ b/src/content/docs/packages/native-background-transfer.mdx @@ -3,9 +3,19 @@ title: PAM Native Background Transfer description: Run durable HTTPS uploads and downloads outside the PHP runtime with OS scheduling, constraints, progress, and relaunch recovery. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add background-transfer +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-background-transfer pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-bluetooth.mdx b/src/content/docs/packages/native-bluetooth.mdx index ad8b443..5a055a3 100644 --- a/src/content/docs/packages/native-bluetooth.mdx +++ b/src/content/docs/packages/native-bluetooth.mdx @@ -3,9 +3,19 @@ title: PAM Native Bluetooth description: Scan, connect, discover, read, write, and subscribe to Bluetooth LE with opaque IDs and a bounded lifecycle-safe event queue. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add bluetooth +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-bluetooth pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-devtools.mdx b/src/content/docs/packages/native-devtools.mdx index f6ad6b5..406c10f 100644 --- a/src/content/docs/packages/native-devtools.mdx +++ b/src/content/docs/packages/native-devtools.mdx @@ -3,9 +3,19 @@ title: PAM Native DevTools package description: Record bounded events, redacted snapshots, performance measures, errors, and full network transactions for deterministic diagnostics. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add devtools +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-devtools pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-feature-flags.mdx b/src/content/docs/packages/native-feature-flags.mdx index e7e6ffa..2e4e811 100644 --- a/src/content/docs/packages/native-feature-flags.mdx +++ b/src/content/docs/packages/native-feature-flags.mdx @@ -3,9 +3,19 @@ title: PAM Native Feature Flags description: Evaluate typed targeting rules and deterministic percentage rollouts with local overrides, exposure events, and bounded offline snapshots. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add feature-flags +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-feature-flags pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-firebase.mdx b/src/content/docs/packages/native-firebase.mdx index efd134d..99a4a08 100644 --- a/src/content/docs/packages/native-firebase.mdx +++ b/src/content/docs/packages/native-firebase.mdx @@ -3,9 +3,19 @@ title: PAM Native Firebase description: Configure Firebase apps and use Analytics, Remote Config, Messaging tokens, Installations, Crashlytics, and feature-flag adapters. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add firebase +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-firebase pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-health.mdx b/src/content/docs/packages/native-health.mdx index 389b82f..a18d7e6 100644 --- a/src/content/docs/packages/native-health.mdx +++ b/src/content/docs/packages/native-health.mdx @@ -3,9 +3,19 @@ title: PAM Native Health description: Request granular Health Connect and HealthKit access and read or write typed steps, heart rate, weight, calories, and sleep samples. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add health +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-health pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-intents.mdx b/src/content/docs/packages/native-intents.mdx index e69948d..77bb700 100644 --- a/src/content/docs/packages/native-intents.mdx +++ b/src/content/docs/packages/native-intents.mdx @@ -3,9 +3,19 @@ title: PAM Native Intents description: Publish named PAM routes as Android Dynamic Shortcuts and Apple App Intents while preserving one deep-link navigation lifecycle. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add intents +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-intents pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-laravel-sync.mdx b/src/content/docs/packages/native-laravel-sync.mdx index c3fa0d4..97fd58b 100644 --- a/src/content/docs/packages/native-laravel-sync.mdx +++ b/src/content/docs/packages/native-laravel-sync.mdx @@ -3,11 +3,19 @@ title: PAM Native Laravel Sync description: Build authenticated Laravel push/pull sync APIs with idempotency, signed cursors, conflicts, retention, and a PAM Native transport. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add laravel-sync -pam artisan vendor:publish --tag=pam-native-sync-config -pam artisan migrate +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-sync-laravel pam doctor +pam native dev ``` Register every synchronized collection explicitly: diff --git a/src/content/docs/packages/native-live-activities.mdx b/src/content/docs/packages/native-live-activities.mdx index 4f8eb45..e0bd13e 100644 --- a/src/content/docs/packages/native-live-activities.mdx +++ b/src/content/docs/packages/native-live-activities.mdx @@ -3,9 +3,19 @@ title: PAM Native Live Activities description: Start, update, reconcile, and end ActivityKit Live Activities and Android ongoing notifications from bounded PHP state. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add live-activities +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-live-activities pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-maps.mdx b/src/content/docs/packages/native-maps.mdx index e0f69ea..9f06197 100644 --- a/src/content/docs/packages/native-maps.mdx +++ b/src/content/docs/packages/native-maps.mdx @@ -3,9 +3,19 @@ title: PAM Native Maps description: Render declarative Google Maps and MapKit cameras, styles, user location, gestures, markers, overlays, and typed native events. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add maps +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-maps pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-media.mdx b/src/content/docs/packages/native-media.mdx index c8c2480..2f147d0 100644 --- a/src/content/docs/packages/native-media.mdx +++ b/src/content/docs/packages/native-media.mdx @@ -3,9 +3,19 @@ title: PAM Native Media description: Probe sandboxed media, generate correctly oriented thumbnails, and embed lifecycle-aware native photo/video capture. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add media +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-media pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-nfc.mdx b/src/content/docs/packages/native-nfc.mdx index 5fc8461..c1e90cc 100644 --- a/src/content/docs/packages/native-nfc.mdx +++ b/src/content/docs/packages/native-nfc.mdx @@ -3,9 +3,19 @@ title: PAM Native NFC description: Read and write bounded NDEF tags with lifecycle-safe Android reader mode and the iOS system NFC session. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add nfc +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-nfc pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-nitro.mdx b/src/content/docs/packages/native-nitro.mdx index 85009e7..abe7e59 100644 --- a/src/content/docs/packages/native-nitro.mdx +++ b/src/content/docs/packages/native-nitro.mdx @@ -3,18 +3,26 @@ title: PAM Native Nitro description: Build model-driven, offline-first local data flows on PAM Native SQLite workers. --- -PAM Native Nitro is the high-performance local data engine for PAM Native. It -keeps SQLite work outside rendering, selects only bounded rows needed by the -current screen, and moves batches across the native bridge once. +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: ```bash -pam add nitro +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-nitro pam doctor +pam native dev ``` -Nitro 0.3.3 requires PHP 8.4 and PAM Native 0.6.2 or newer. `pam add nitro` -runs compatibility preflight and integrates the package with the Native -project. Use `pam remove nitro` to uninstall it. +PAM Native Nitro is the high-performance local data engine for PAM Native. It +keeps SQLite work outside rendering, selects only bounded rows needed by the +current screen, and moves batches across the native bridge once. + +Nitro 0.3.3 requires PHP 8.4 and PAM Native 0.6.2 or newer. The package is installed through `pam composer`. Remove it with `pam composer remove`. ## Define models diff --git a/src/content/docs/packages/native-observability.mdx b/src/content/docs/packages/native-observability.mdx index d38a41b..302e31e 100644 --- a/src/content/docs/packages/native-observability.mdx +++ b/src/content/docs/packages/native-observability.mdx @@ -3,16 +3,22 @@ title: PAM Native Observability description: Add vendor-neutral spans, structured logs, metrics, crash context, deterministic sampling, bounded batching, and pluggable telemetry export. --- -Install through PAM — not Composer directly: +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: ```bash -pam add observability +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-observability pam doctor +pam native dev ``` -PAM performs the Composer compatibility preflight internally, updates the -project manifests, and refreshes native integration. Remove it with -`pam remove observability`. + ## Trace and flush diff --git a/src/content/docs/packages/native-payments.mdx b/src/content/docs/packages/native-payments.mdx index d9f9628..25d2d02 100644 --- a/src/content/docs/packages/native-payments.mdx +++ b/src/content/docs/packages/native-payments.mdx @@ -3,9 +3,19 @@ title: PAM Native Payments description: Present Stripe PaymentSheet with native wallets and SCA/3DS while keeping secret keys, PaymentIntent creation, and fulfillment server-side. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add payments +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-payments pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-plugin-kit.mdx b/src/content/docs/packages/native-plugin-kit.mdx index 22e8853..eab179c 100644 --- a/src/content/docs/packages/native-plugin-kit.mdx +++ b/src/content/docs/packages/native-plugin-kit.mdx @@ -3,10 +3,22 @@ title: PAM Native Plugin Kit description: Scaffold cross-platform PAM Native packages, validate manifests, and compile one typed IDL into deterministic PHP, Kotlin, and Swift contracts. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add plugin-kit +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-plugin-kit pam doctor +pam native dev +``` +```bash vendor/bin/pam-native-plugin new acme/pam-native-biometric ./pam-native-biometric vendor/bin/pam-native-plugin validate ./pam-native-biometric/pam-native.plugin.json vendor/bin/pam-native-plugin compile ./pam-native-biometric/pam-native.idl.json ./generated @@ -21,8 +33,8 @@ string variants fail compilation. Commit generated output, regenerate into a temporary directory in CI, and require a clean diff. PAM records manifest and IDL digests in `.pam-native/plugins.lock.json`. -The `vendor/bin` commands are package tooling after `pam add plugin-kit`; package -installation itself remains a PAM workflow. +The `vendor/bin` commands are package tooling available after installation +through `pam composer`. Diagnostics use integer-backed `DiagnosticSeverity`; invalid IDL raises `IdlException`. Apple manifest requirements are modeled by diff --git a/src/content/docs/packages/native-realtime.mdx b/src/content/docs/packages/native-realtime.mdx index d196122..4347b8b 100644 --- a/src/content/docs/packages/native-realtime.mdx +++ b/src/content/docs/packages/native-realtime.mdx @@ -3,9 +3,19 @@ title: PAM Native Realtime description: Keep native-owned RFC 6455 WebSockets alive across PHP renders and reloads with bounded frames, polling, state, and cleanup. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add realtime +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-realtime pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-scanner.mdx b/src/content/docs/packages/native-scanner.mdx index 3003f6c..54ad351 100644 --- a/src/content/docs/packages/native-scanner.mdx +++ b/src/content/docs/packages/native-scanner.mdx @@ -3,9 +3,19 @@ title: PAM Native Scanner description: Scan QR and barcodes in real time with native CameraX/ML Kit and AVFoundation/Vision previews and typed results. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add scanner +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-scanner pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-share-extension.mdx b/src/content/docs/packages/native-share-extension.mdx index a7b30c3..c5c8305 100644 --- a/src/content/docs/packages/native-share-extension.mdx +++ b/src/content/docs/packages/native-share-extension.mdx @@ -3,9 +3,19 @@ title: PAM Native Share Extension description: Receive text, URLs, and sandboxed file copies from Android shares and an iOS Share Extension through a process-safe inbox. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add share-extension +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-share-extension pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-subscriptions.mdx b/src/content/docs/packages/native-subscriptions.mdx index bc8dc51..c894391 100644 --- a/src/content/docs/packages/native-subscriptions.mdx +++ b/src/content/docs/packages/native-subscriptions.mdx @@ -3,9 +3,19 @@ title: PAM Native Subscriptions description: Load, purchase, restore, verify, and acknowledge StoreKit 2 and Google Play Billing subscriptions without trusting client entitlement. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add subscriptions +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-subscriptions pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-sync.mdx b/src/content/docs/packages/native-sync.mdx index 102b193..1cd0a79 100644 --- a/src/content/docs/packages/native-sync.mdx +++ b/src/content/docs/packages/native-sync.mdx @@ -3,9 +3,19 @@ title: PAM Native Sync description: Build offline-first synchronization with an idempotent outbox, ordered batches, cursors, tombstones, retry budgets, and deterministic conflicts. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add sync +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-sync pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-testing.mdx b/src/content/docs/packages/native-testing.mdx index cb2373d..321b671 100644 --- a/src/content/docs/packages/native-testing.mdx +++ b/src/content/docs/packages/native-testing.mdx @@ -3,9 +3,19 @@ title: PAM Native Testing description: Replace the native module transport with strict deterministic fakes, immediate or deferred responses, recorded calls, and completion assertions. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add testing +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-testing pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-video.mdx b/src/content/docs/packages/native-video.mdx index bd9d0e1..e1af555 100644 --- a/src/content/docs/packages/native-video.mdx +++ b/src/content/docs/packages/native-video.mdx @@ -3,9 +3,19 @@ title: PAM Native Video description: Play adaptive HLS/DASH and local video with native Media3 and AVPlayer decoding, tracks, controls, seek, and progress events. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add video +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-video pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/native-widgets.mdx b/src/content/docs/packages/native-widgets.mdx index 9322760..46da4d3 100644 --- a/src/content/docs/packages/native-widgets.mdx +++ b/src/content/docs/packages/native-widgets.mdx @@ -3,9 +3,19 @@ title: PAM Native Widgets description: Publish bounded process-safe Android App Widget and WidgetKit timeline state from PHP with stable IDs and deep links. --- +## Start here + +Every PAM Native product runs on the PAM runtime. Install and verify PAM first, +create a Native application, and add this package through PAM Composer: + ```bash -pam add widgets +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-app --template native +cd my-app +pam composer require pushinbr/pam-native-widgets pam doctor +pam native dev ``` ```php diff --git a/src/content/docs/packages/overview.mdx b/src/content/docs/packages/overview.mdx index f906011..96b16bf 100644 --- a/src/content/docs/packages/overview.mdx +++ b/src/content/docs/packages/overview.mdx @@ -3,21 +3,17 @@ title: Package ecosystem description: Add official PAM capabilities while keeping standard Composer contracts. --- -The PAM binary owns runtime-level capabilities. Applications install official -capabilities through the PAM CLI; underneath, they remain ordinary Composer -packages with versioned PHP contracts. +The PAM binary owns only runtime-level capabilities. Applications grow through +ordinary Composer packages with versioned PHP contracts. ```bash -pam packages -pam add auth -pam add observability -pam doctor +pam composer require pushinbr/pam-native-auth +pam composer require pushinbr/pam-native-observability ``` -`pam add` looks up package metadata, performs a non-mutating dependency -compatibility preflight, updates the normal manifest and lockfile, and refreshes -native integration when required. Explore every alias in the -[capability catalog](/ecosystem/). +`pam composer` is the canonical package interface. Explore official packages +in the [capability catalog](/ecosystem/) or discover any compatible package on +Packagist. This is how PAM grows without becoming a monolith. The runtime provides the hard systems boundary; packages provide focused application contracts using @@ -26,14 +22,14 @@ custom lockfile, or proprietary package format is required. | Package | Purpose | | --- | --- | -| [`pushinbr/pam-api`](/packages/api/) | Express-like routing with controller method mapping, Laravel-style validation, Resources, dependency injection and middleware | +| [`pushinbr/pam-http`](/packages/http/) | Express-like routing with controller method mapping, Laravel-style validation, Resources, dependency injection and middleware | | `pushinbr/pam-socket` | WebSocket events, rooms, broadcasts, acknowledgements, adapters, and resume support | -| `pushinbr/pam-psr-bridge` | PSR-7, PSR-15, and PSR-17 interoperability using official interfaces | +| `pushinbr/pam-psr` | PSR-7, PSR-15, and PSR-17 interoperability using official interfaces | | `pushinbr/pam-testing` | In-memory HTTP client and fluent response assertions | -| `pushinbr/pam-core-api` | Small contracts for packages that extend PAM | +| `pushinbr/pam-contracts` | Small contracts for packages that extend PAM | | `pushinbr/pam-native` | PHP authoring and protocol surface for native Android applications | | [`pushinbr/pam-native-nitro`](/packages/native-nitro/) | Offline-first, model-driven local data engine on PAM Native SQLite workers | -| [`pushinbr/pam-mobile-ui`](/packages/mobile-ui/) | Retained-native Material 3 component system for Android and iOS | +| [`pushinbr/pam-native-ui`](/packages/mobile-ui/) | Retained-native Material 3 component system for Android and iOS | | `pushinbr/pam-laravel` | Laravel bridge, Octane integration and framework lifecycle contracts | | `pam/desktop` | Typed PHP API and worker loop for PAM Desktop | | [`push-in/pam-skeleton`](/packages/skeleton/) | Versioned API starter consumed by `pam init` | @@ -42,8 +38,7 @@ custom lockfile, or proprietary package format is required. PAM discovers the normal Composer autoloader, including projects with a custom `config.vendor-dir`. It does not introduce a package wrapper or alternate lockfile. -Use `pam add ` for official ecosystem features. Package authors and -advanced interoperability flows can invoke Composer through PAM's private PHP +Applications and package authors invoke Composer through PAM's private PHP runtime: ```bash @@ -62,7 +57,7 @@ Protocol and enum identifiers are sequential integers and append-only within a p ## Distribution repositories -`pam-native-php` and `pam-mobile-ui-php` are publication mirrors of their +`pam-native-php` and `pam-native-ui-php` are publication mirrors of their canonical source repositories. They exist so generated and packaged PHP artifacts can be distributed independently; they are not separate products or alternative installation paths. See the diff --git a/src/content/docs/packages/psr-bridge.mdx b/src/content/docs/packages/psr-bridge.mdx index 089a90e..a6d56a3 100644 --- a/src/content/docs/packages/psr-bridge.mdx +++ b/src/content/docs/packages/psr-bridge.mdx @@ -1,12 +1,21 @@ --- -title: pushinbr/pam-psr-bridge +title: pushinbr/pam-psr description: Run PSR-7 requests, PSR-15 middleware and handlers, and PSR-17 factories on PAM. --- -`pushinbr/pam-psr-bridge` provides PSR-7, PSR-15, and PSR-17 interoperability using the official PHP-FIG interfaces. +`pushinbr/pam-psr` provides PSR-7, PSR-15, and PSR-17 interoperability using the official PHP-FIG interfaces. + +## Start here + +Install and verify the PAM runtime first, create an HTTP application, and add +the PSR bridge through PAM's Composer passthrough: ```bash -pam composer require pushinbr/pam-psr-bridge +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-api --template http +cd my-api +pam composer require pushinbr/pam-psr ``` ## Use a PSR-15 handler @@ -97,5 +106,5 @@ detached or closed; immutable `with*()` operations clone messages rather than mutating the original. :::note[License] -`pushinbr/pam-psr-bridge` uses the Apache License 2.0. +`pushinbr/pam-psr` uses the Apache License 2.0. ::: diff --git a/src/content/docs/packages/skeleton.mdx b/src/content/docs/packages/skeleton.mdx index 9176cf1..26a33e8 100644 --- a/src/content/docs/packages/skeleton.mdx +++ b/src/content/docs/packages/skeleton.mdx @@ -7,9 +7,17 @@ The `push-in/pam-skeleton` repository is the versioned source used by PAM to generate a clean API application. Do not clone it for normal development; let the CLI select the release compatible with your runtime. +## Start here + +Install and verify PAM first. The runtime then selects the compatible skeleton; +the generated HTTP dependency remains an ordinary Composer package: + ```bash -pam init my-api --template api +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-api --template http cd my-api +pam composer require pushinbr/pam-http pam doctor pam dev index.php ``` @@ -46,13 +54,13 @@ discovery for tooling and CI. ## Add capabilities ```bash -pam init realtime-api --template api --socket -pam add observability +pam init realtime-api --template http --socket +pam composer require pushinbr/pam-native-observability pam doctor ``` -Use `pam packages` to discover official capabilities. PAM performs metadata -lookup and a non-mutating compatibility preflight before changing the project. +Use Packagist to discover packages. PAM exposes Composer without introducing a +second manifest, registry or lockfile. ## Release checklist diff --git a/src/content/docs/packages/socket.mdx b/src/content/docs/packages/socket.mdx index 2d7f741..b8d8a8e 100644 --- a/src/content/docs/packages/socket.mdx +++ b/src/content/docs/packages/socket.mdx @@ -5,7 +5,16 @@ description: Event APIs over PAM's native RFC 6455 WebSocket transport. `pushinbr/pam-socket` adds an event-oriented PHP API above PAM's native WebSocket transport. +## Start here + +Install and verify the PAM runtime first, create an HTTP application, and add +the Socket package through PAM's Composer passthrough: + ```bash +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-api --template http +cd my-api pam composer require pushinbr/pam-socket ``` diff --git a/src/content/docs/packages/testing.mdx b/src/content/docs/packages/testing.mdx index eaa209c..a673ccb 100644 --- a/src/content/docs/packages/testing.mdx +++ b/src/content/docs/packages/testing.mdx @@ -1,11 +1,20 @@ --- title: pushinbr/pam-testing -description: Test pushinbr/pam-api applications in memory with fluent response assertions. +description: Test pushinbr/pam-http applications in memory with fluent response assertions. --- -`pushinbr/pam-testing` invokes a `pushinbr/pam-api` application pipeline without opening a network port. +`pushinbr/pam-testing` invokes a `pushinbr/pam-http` application pipeline without opening a network port. + +## Start here + +Install and verify the PAM runtime first, create an HTTP application, and add +the test helpers as a development dependency through PAM Composer: ```bash +curl -fsSL https://push-in.github.io/pam/install.sh | sh +pam doctor +pam init my-api --template http +cd my-api pam composer require --dev pushinbr/pam-testing ``` diff --git a/src/content/docs/project/release-0-1-33.mdx b/src/content/docs/project/release-0-1-33.mdx index c705154..091fd10 100644 --- a/src/content/docs/project/release-0-1-33.mdx +++ b/src/content/docs/project/release-0-1-33.mdx @@ -161,10 +161,10 @@ is scheduled for the next PAM release gate. - [PAM v0.1.33](https://github.com/push-in/pam/releases/tag/v0.1.33) - [PAM Native v0.2.1](https://github.com/push-in/pam-native/releases/tag/v0.2.1) -- [PamUI v0.2.1](https://github.com/push-in/pam-mobile-ui-php/releases/tag/v0.2.1) +- [PamUI v0.2.1](https://github.com/push-in/pam-native-ui/releases/tag/v0.2.1) - [PAM Desktop v1.1.2](https://github.com/push-in/pam-desktop/releases/tag/v1.1.2) - [`pushinbr/pam-native` on Packagist](https://packagist.org/packages/pushinbr/pam-native) -- [`pushinbr/pam-mobile-ui` on Packagist](https://packagist.org/packages/pushinbr/pam-mobile-ui) +- [`pushinbr/pam-native-ui` on Packagist](https://packagist.org/packages/pushinbr/pam-native-ui) - [`pushinbr/pam-laravel` on Packagist](https://packagist.org/packages/pushinbr/pam-laravel) - [Documentation source](https://github.com/push-in/pam-docs) diff --git a/src/content/docs/project/release-0-1-34.mdx b/src/content/docs/project/release-0-1-34.mdx index 811f716..2dc6b7e 100644 --- a/src/content/docs/project/release-0-1-34.mdx +++ b/src/content/docs/project/release-0-1-34.mdx @@ -81,11 +81,11 @@ upstream Composer constraints. - [PAM v0.1.34](https://github.com/push-in/pam/releases/tag/v0.1.34) - [PAM Native v0.2.1](https://github.com/push-in/pam-native/releases/tag/v0.2.1) -- [PamUI v0.2.1](https://github.com/push-in/pam-mobile-ui-php/releases/tag/v0.2.1) +- [PamUI v0.2.1](https://github.com/push-in/pam-native-ui/releases/tag/v0.2.1) - [PAM Desktop v1.1.2](https://github.com/push-in/pam-desktop/releases/tag/v1.1.2) - [`pushinbr/pam-laravel` on Packagist](https://packagist.org/packages/pushinbr/pam-laravel) - [`pushinbr/pam-native` on Packagist](https://packagist.org/packages/pushinbr/pam-native) -- [`pushinbr/pam-mobile-ui` on Packagist](https://packagist.org/packages/pushinbr/pam-mobile-ui) +- [`pushinbr/pam-native-ui` on Packagist](https://packagist.org/packages/pushinbr/pam-native-ui) - [`pushinbr/pam-desktop` on Packagist](https://packagist.org/packages/pushinbr/pam-desktop) The [0.1.33 record](../release-0-1-33/) remains available for the preceding diff --git a/src/content/docs/project/release-0-1-35.mdx b/src/content/docs/project/release-0-1-35.mdx index 9ca2ede..4f48fe2 100644 --- a/src/content/docs/project/release-0-1-35.mdx +++ b/src/content/docs/project/release-0-1-35.mdx @@ -65,7 +65,7 @@ boundaries. - [PAM v0.1.35](https://github.com/push-in/pam/releases/tag/v0.1.35) - [PAM Native v0.2.1](https://github.com/push-in/pam-native/releases/tag/v0.2.1) -- [PamUI v0.2.1](https://github.com/push-in/pam-mobile-ui-php/releases/tag/v0.2.1) +- [PamUI v0.2.1](https://github.com/push-in/pam-native-ui/releases/tag/v0.2.1) - [PAM Desktop v1.1.2](https://github.com/push-in/pam-desktop/releases/tag/v1.1.2) - [`pushinbr/pam-laravel` on Packagist](https://packagist.org/packages/pushinbr/pam-laravel) diff --git a/src/content/docs/project/release-1-0-2.mdx b/src/content/docs/project/release-1-0-2.mdx index 1281058..a8ae2be 100644 --- a/src/content/docs/project/release-1-0-2.mdx +++ b/src/content/docs/project/release-1-0-2.mdx @@ -46,10 +46,10 @@ artifact has build-provenance attestation. All six server packages are tagged `v1.0.2` and available from Packagist under the organization-owned namespace: -- `pushinbr/pam-core-api`; -- `pushinbr/pam-api`; +- `pushinbr/pam-contracts`; +- `pushinbr/pam-http`; - `pushinbr/pam-socket`; -- `pushinbr/pam-psr-bridge`; +- `pushinbr/pam-psr`; - `pushinbr/pam-testing`; and - `pushinbr/pam-skeleton`. diff --git a/src/content/docs/project/repository-map.mdx b/src/content/docs/project/repository-map.mdx index b90fb0f..63f76c3 100644 --- a/src/content/docs/project/repository-map.mdx +++ b/src/content/docs/project/repository-map.mdx @@ -12,11 +12,11 @@ destination. | Repository | Role | Canonical documentation | | --- | --- | --- | | `pam` | Persistent PHP runtime, CLI, packaging and release system | [Runtime](/runtime/how-pam-works/) and [CLI](/getting-started/cli/) | -| `pam-api` | Optional HTTP application/router layer | [Package guide](/packages/api/) | -| `pam-core-api` | Minimal extension contracts | [Package guide](/packages/core-api/) | +| `pam-http` | Optional HTTP application/router layer | [Package guide](/packages/http/) | +| `pam-contracts` | Minimal extension contracts | [Package guide](/packages/contracts/) | | `pam-laravel` | Laravel lifecycle, operations and production tooling | [Laravel platform](/laravel/production-platform/) and [API reference](/laravel/api-reference/) | | `pam-socket` | Event API over native RFC 6455 WebSockets | [Package guide](/packages/socket/) | -| `pam-psr-bridge` | PSR-7/15/17 interoperability | [Package guide](/packages/psr-bridge/) | +| `pam-psr` | PSR-7/15/17 interoperability | [Package guide](/packages/psr/) | | `pam-testing` | In-memory PAM API test client | [Package guide](/packages/testing/) | | `pam-skeleton` | Versioned API template used by `pam init` | [Skeleton guide](/packages/skeleton/) | | `pam-desktop` | Native desktop shell, worker and PHP API | [Desktop](/desktop/overview/) and [API contracts](/desktop/api-contracts/) | @@ -28,8 +28,8 @@ destination. | --- | --- | --- | | `pam-native` | Native runtime, Android/iOS renderers and PHP authoring API | [Native overview](/native/overview/) and [PHP API index](/native/php-api-index/) | | `pam-native-php` | Generated/distribution mirror of the Native PHP surface | [Distribution mirrors](/packages/distribution-mirrors/) | -| `pam-mobile-ui` | Retained-native Material 3 component system | [Mobile UI](/packages/mobile-ui/) and [catalog](/packages/mobile-ui-catalog/) | -| `pam-mobile-ui-php` | Generated/distribution mirror of Mobile UI | [Distribution mirrors](/packages/distribution-mirrors/) | +| `pam-native-ui` | Retained-native Material 3 component system | [Native UI](/packages/mobile-ui/) and [catalog](/packages/mobile-ui-catalog/) | +| `pam-native-ui-php` | Generated/distribution mirror of Native UI | [Distribution mirrors](/packages/distribution-mirrors/) | | `pam-native-nitro` | Offline-first typed local data engine | [Nitro](/packages/native-nitro/) | ## Official Native integrations @@ -44,7 +44,7 @@ destination. | `pam-native-firebase` | Firebase services and messaging bridge | [Firebase](/packages/native-firebase/) | | `pam-native-health` | Health data permissions and queries | [Health](/packages/native-health/) | | `pam-native-intents` | Android intents and iOS URL activities | [Intents](/packages/native-intents/) | -| `pam-native-laravel-sync` | Laravel-backed native synchronization | [Laravel Sync](/packages/native-laravel-sync/) | +| `pam-native-sync-laravel` | Laravel-backed native synchronization | [Laravel Sync](/packages/native-laravel-sync/) | | `pam-native-live-activities` | iOS Live Activities | [Live Activities](/packages/native-live-activities/) | | `pam-native-maps` | Native maps, markers and camera control | [Maps](/packages/native-maps/) | | `pam-native-media` | Camera, picker and media processing | [Media](/packages/native-media/) | @@ -63,15 +63,27 @@ destination. ## Installation rule -Use PAM aliases for official application capabilities: +Use PAM Composer for every ecosystem package: ```bash -pam packages -pam add observability -pam add mobile-ui +pam composer require pushinbr/pam-native-observability +pam composer require pushinbr/pam-native-ui pam doctor ``` -`pam composer require` remains correct for normal server/framework packages -such as `pushinbr/pam-api` and `pushinbr/pam-laravel`. Distribution mirrors are -not separate installation choices. +The same workflow applies to server, framework, native and desktop products. +Distribution mirrors are not separate installation choices. + +## Compatibility repositories + +These repositories contain migration-only Composer metapackages. They remain +public so existing lockfiles resolve safely, but every package is marked +abandoned on Packagist with its canonical replacement: + +| Compatibility repository | Canonical repository | +| --- | --- | +| `pam-api` | `pam-http` | +| `pam-core-api` | `pam-contracts` | +| `pam-psr-bridge` | `pam-psr` | +| `pam-mobile-ui` | `pam-native-ui` | +| `pam-native-laravel-sync` | `pam-native-sync-laravel` | diff --git a/src/content/docs/project/status.mdx b/src/content/docs/project/status.mdx index 8d72d64..d24664c 100644 --- a/src/content/docs/project/status.mdx +++ b/src/content/docs/project/status.mdx @@ -11,7 +11,7 @@ separates released evidence from application-owner responsibilities. | Surface | PAM 1.0 contract | Application-owner boundary | | --- | --- | --- | | CLI and project lifecycle | Interactive launcher/init; contextual dev, generation, package, quality, doctor, build, and release commands | Project-specific scripts and credentials | -| Server runtime | Linux x86_64/ARM64, PHP 8.4 Embed, HTTP 1.1/2/3, streams, async I/O, supervised workers | Workload soak tests and extension safety | +| Server runtime | Linux x86_64/ARM64, PHP 8.5 Embed by default, HTTP 1.1/2/3, streams, async I/O, supervised workers | Workload soak tests and extension safety | | Laravel host | Laravel 12 and 13 executable matrix; Artisan and request isolation | Package globals and one active request per worker | | PAM Native Android | API 26–36, arm64-v8a/x86_64, PHP 8.4/8.5, signed APK/AAB tooling | Keystore, Play Console, and physical-device QA | | PAM Native iOS | iOS 15 baseline; iOS 18 extension matrix; PHP 8.4/8.5; generated UIKit host; simulator runtime; archive/IPA tooling | Apple team, certificates, profiles, App Store, and physical-device QA | diff --git a/src/content/docs/runtime/compatibility.mdx b/src/content/docs/runtime/compatibility.mdx index 084b533..a13d501 100644 --- a/src/content/docs/runtime/compatibility.mdx +++ b/src/content/docs/runtime/compatibility.mdx @@ -10,7 +10,7 @@ PAM defines compatibility through executable contracts and pinned protocol rules | Surface | Supported contract | Unsupported or incomplete | | --- | --- | --- | | Server releases | Linux x86_64 and ARM64, glibc 2.35+; macOS CLI/runtime bundles | Windows server releases | -| PHP | PHP 8.4 Embed for servers; PHP 8.4 and 8.5 for PAM Native | Other PHP minor or major versions unless separately tested | +| PHP | PHP 8.5 Embed by default; PHP 8.4 remains a tested compatibility runtime | Other PHP minor or major versions unless separately tested | | Laravel | Laravel 12 and 13 | Future Laravel versions until added to the matrix | | PAM Native | Android API 26–36; generated UIKit host on iOS 15/18; protocol 1; signed Android and iOS package tooling | Application-owned signing, stores, and physical-device qualification | | PAM Desktop | Experimental Linux distribution | Windows and macOS distribution | diff --git a/src/content/docs/runtime/composer.mdx b/src/content/docs/runtime/composer.mdx index 3397520..2d5d347 100644 --- a/src/content/docs/runtime/composer.mdx +++ b/src/content/docs/runtime/composer.mdx @@ -9,14 +9,16 @@ PAM uses Composer without a package wrapper or alternate lockfile. It discovers ```bash pam composer install -pam composer require pushinbr/pam-api +pam composer require pushinbr/pam-http pam composer update pam composer audit --locked ``` PAM caches a verified Composer PHAR in the user's XDG cache. On the first automatic download, it verifies Composer's official SHA-384 installer signature. Set `PAM_COMPOSER` to use a specific trusted PHAR. -The official PAM release does not require a system PHP CLI. Composer executes inside the same PHP 8.4 Embed environment used by the application, so platform requirements are checked against the relevant runtime. +The official PAM release does not require a system PHP CLI. Composer executes +inside the same PHP 8.5 Embed environment used by the application by default, +so platform requirements are checked against the relevant runtime. ## Diagnose a project @@ -34,7 +36,7 @@ The system CLI is diagnostic context, not a runtime dependency. A difference in | Category | Current contract | | --- | --- | | Pure PHP and PSR-4 packages | Loaded by the normal Composer autoloader | -| PSR-7, PSR-15, PSR-17 | Available through `pushinbr/pam-psr-bridge` | +| PSR-7, PSR-15, PSR-17 | Available through `pushinbr/pam-psr` | | PSR-3 | Consumed when `psr/log` is installed | | PHPUnit and Pest | Run inside Embed through `pam test` | | Amp, Revolt, ReactPHP | Exercised by compatibility smoke tests | diff --git a/src/content/docs/runtime/http.mdx b/src/content/docs/runtime/http.mdx index 65f3d25..8917450 100644 --- a/src/content/docs/runtime/http.mdx +++ b/src/content/docs/runtime/http.mdx @@ -10,12 +10,12 @@ PAM owns the HTTP transport in Rust and dispatches application work into PHP Fib The API preset creates the smallest useful server: ```bash -pam init my-api --template api +pam init my-api --template http cd my-api pam dev index.php ``` -With `pushinbr/pam-api`, application code registers routes and starts the listener: +With `pushinbr/pam-http`, application code registers routes and starts the listener: ```php div { +.pam-http-throughput > div { display: grid; gap: 0.35rem; } -.pam-api-throughput span, -.pam-api-throughput code { +.pam-http-throughput span, +.pam-http-throughput code { color: #8f8b82; font-family: var(--sl-font-mono); font-size: 0.66rem; @@ -960,7 +960,7 @@ select:focus-visible { text-transform: uppercase; } -.pam-api-throughput strong { +.pam-http-throughput strong { color: #f7f4eb; font-family: var(--sl-font-mono); font-size: clamp(1.55rem, 3vw, 2.35rem); @@ -969,13 +969,13 @@ select:focus-visible { line-height: 1; } -.pam-api-throughput small { +.pam-http-throughput small { color: #ff795b; font-size: 0.42em; letter-spacing: 0; } -.pam-api-throughput code { +.pam-http-throughput code { border: 0; background: transparent; padding: 0; @@ -1303,7 +1303,7 @@ select:focus-visible { grid-template-columns: 1fr; } - .pam-api-throughput { + .pam-http-throughput { align-items: start; flex-direction: column; } From 6874da2a8a178b225a8b04cc22f28685356e8c12 Mon Sep 17 00:00:00 2001 From: davidbalbino Date: Fri, 21 Aug 2026 22:49:48 -0300 Subject: [PATCH 6/8] ci: validate documentation pull requests --- .github/workflows/docs-health.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docs-health.yml b/.github/workflows/docs-health.yml index dbaf636..306f51a 100644 --- a/.github/workflows/docs-health.yml +++ b/.github/workflows/docs-health.yml @@ -1,6 +1,7 @@ name: Documentation health on: + pull_request: schedule: - cron: '17 9 * * 1' workflow_dispatch: @@ -29,12 +30,13 @@ jobs: run: npm run validate - name: Compare docs with the latest PAM release + if: github.event_name != 'pull_request' env: GITHUB_TOKEN: ${{ github.token }} run: npm run check:freshness - name: Open or update a maintenance issue - if: failure() + if: failure() && github.event_name == 'schedule' uses: actions/github-script@v8 with: script: | From 37e11b022da5a5413239260cc04d6dc2ea71f153 Mon Sep 17 00:00:00 2001 From: davidbalbino Date: Sat, 22 Aug 2026 13:43:18 -0300 Subject: [PATCH 7/8] fix: publish PAM HTTP at its canonical docs slug --- src/content/docs/packages/{api.mdx => http.mdx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/content/docs/packages/{api.mdx => http.mdx} (100%) diff --git a/src/content/docs/packages/api.mdx b/src/content/docs/packages/http.mdx similarity index 100% rename from src/content/docs/packages/api.mdx rename to src/content/docs/packages/http.mdx From 4e34f728e5b41cfff2617b998fee33b96496c3c9 Mon Sep 17 00:00:00 2001 From: davidbalbino Date: Sat, 22 Aug 2026 13:44:19 -0300 Subject: [PATCH 8/8] fix: align canonical package documentation slugs --- src/content/docs/packages/{core-api.mdx => contracts.mdx} | 0 src/content/docs/packages/{psr-bridge.mdx => psr.mdx} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/content/docs/packages/{core-api.mdx => contracts.mdx} (100%) rename src/content/docs/packages/{psr-bridge.mdx => psr.mdx} (100%) diff --git a/src/content/docs/packages/core-api.mdx b/src/content/docs/packages/contracts.mdx similarity index 100% rename from src/content/docs/packages/core-api.mdx rename to src/content/docs/packages/contracts.mdx diff --git a/src/content/docs/packages/psr-bridge.mdx b/src/content/docs/packages/psr.mdx similarity index 100% rename from src/content/docs/packages/psr-bridge.mdx rename to src/content/docs/packages/psr.mdx