Skip to content

release: 1.1.0-dev.2 — git-backed plugin distribution, i18n cascade, tooling fixes - #107

Merged
hakeemRash merged 148 commits into
mainfrom
master
Aug 7, 2026
Merged

release: 1.1.0-dev.2 — git-backed plugin distribution, i18n cascade, tooling fixes#107
hakeemRash merged 148 commits into
mainfrom
master

Conversation

@hakeemRash

Copy link
Copy Markdown
Contributor

Brings master up to main for the 1.1.0-dev.2 development pre-release.

Merging this triggers auto-release.yml, which reads the top CHANGELOG version,
tags it, and runs the release build. That path is the reason for this PR — the
earlier v1.1.0-dev.1 / v1.1.0-dev.2 tags were cut by hand off master,
bypassing it.

What's in it

Plugins install from git. hkm plugins install|uninstall|versions|outdated|lock
fetch a plugin from its own repository, and hkm plugins enable now installs a
missing plugin instead of wiring it into the bootstrap by name and failing at
boot with a class-not-found. Installs resolve to a tag, never a branch, and
plugins.lock.json records the remote, tag, commit and kernel version so an
install is reproducible and reviewable.

Kernel compatibility gate. A plugin declares "kernel": "^1.0" in its
module.json; an incompatible pairing is refused at install time rather than
surfacing at request time as a missing method on a contract. All 28 plugins now
declare it and are released at v1.0.1 / v2.0.1.

Translation catalogue cascade. CompileLangManifestStage compiles each
plugin's lang declaration into lang-manifest.php using the same
project-first priority model as views — so plugins can finally ship messages.
Groups merge across the cascade, so overriding one key does not mean copying
the rest. English + French ship for every plugin with user-facing text.

hkm upgrade --local installs a local checkout over the installed kernel,
for testing a kernel change against real projects without cutting a release.

Memory inspector wired into the CLI (--mem, HKM_MEM_STRICT), plus a
zig build test step, which did not exist.

Fixes worth reviewing

Deferred cleanup never ran every command exited via std.process.exit, which skips defers
--help broken in five commands hkm discover --help ignored the flag and ran a registering scan
hkm --version wrote to stderr VERSION=$(hkm --version) returned empty
A git describe build sorted below its own tag a build after v1.0.21 was treated as older than it
A pre-release tag was offered as the latest release would have pushed a dev build to every stable user
Releases published with no binaries immutable releases forbid post-publish asset uploads
** array-repeat removed in Zig 0.17 broke the release build; compiled fine on 0.16
PHPStan could not run since db63dae still analysed a plugins path the kernel no longer has
auto-release skipped pre-release versions picked an older, already-tagged one instead

Known, deliberately not fixed here

  • 50 PHPStan findings in projects/ — project-layer code referencing
    Plugins\* classes that no longer live in this repo. Real architectural
    coupling the decoupling exposed, not a config error; fixing it changes what
    the project layer depends on and wants its own change.
  • v1.1.0-dev.1 is a burned version number. It published without binaries
    and the tag ruleset (correctly) refuses to recreate a deleted tag.
  • The French translations are translated for meaning over literalness but have
    not been reviewed by a native speaker.

Verification

  • 168 kernel tests, 37 Zig tests
  • Debug, --release=small, and all three cross-compile targets build on the
    pinned Zig 0.17.0-dev.657 (not just the 0.16 installed locally)
  • src/Kernel is PHPStan-clean
  • All 29 plugin repos CI-green at their released tags

hakeemRash added 30 commits July 7, 2026 22:15
Remove .claude/, CLAUDE.md, .github/copilot-instructions.md and docs/ from
version control (kept locally, gitignored) so they are not published to GitHub.
chore: remove AI-assistant config and internal docs from the repo
Previously the ASCII banner only appeared on 'hkm version'. It now headers
the default help output too.
feat(cli): show Sentinel banner on bare hkm and hkm help
hkm upgrade now detects the OS, downloads the matching release artifact,
and installs it (Linux apt / macOS install.sh / Windows install.bat),
instead of only printing manual instructions.
feat(upgrade): auto-download and install updates per OS
…g.env

- run/registry now resolve the kernel relative to the launcher (installed
  /opt/hkm-kernel or dev repo), fixing 'Kernel registry not found' on
  packaged installs and stopping use of a dev kernel found via PWD.
- hkm-config checks the kernel + writes/repairs HKM_KERNEL_HOME.
- launcher loads ~/.config/hkm/config.env at startup (real env wins).

No version change.
fix(cli): self-locate installed kernel + real hkm-config
Scaffolding templates moved tools/src/templates -> top-level templates/.
tools/ is not bundled, so hkm new / hkm ui init could not find templates on
a packaged install. bundle.sh now ships templates/ (exempt from the docs/
tools strip); services resolves <kernel>/templates via self-location.

No version change.
fix(templates): ship templates in the kernel (move out of tools/)
Kernel self-location, real hkm-config, config.env loading, and templates
shipped inside the kernel.
…help note

- projects/projects.json is committed empty ({}) so developer-local
  registrations (and machine paths) never ship in the repo or bundles.
- .githooks/pre-commit forces projects.json to {} in every commit; enable
  with: git config core.hooksPath .githooks
- hkm help notes the env vars are auto-detected (override only if needed).
…help

chore: empty committed project registry + help note
projects.json + platform.json are user data. HKM_USERDATA_DIR relocates them
outside the kernel install (honoured by the hkm CLI registry and the PHP
DomainResolver), and the .deb marks them as conffiles so an in-place upgrade
preserves the user's registrations. Falls back to <kernel>/projects when unset.
feat(userdata): HKM_USERDATA_DIR so updates don't clobber the registry
…ata)

hkm-config now resolves/pins HKM_KERNEL_HOME AND provisions the persistent
userdata dir: creates XDG_DATA_HOME/hkm (or ~/.local/share/hkm), migrates any
existing registry into it, and pins HKM_USERDATA_DIR. One command configures
everything the launcher and runtime need.
feat(config): hkm-config provisions the full environment
- .env (holds generated APP_KEY) written chmod 600; config.env too
- debug output force-disabled when APP_ENV=production regardless of APP_DEBUG
- new projects ship app/public/.htaccess (deny dotfiles, no listing, drop
  X-Powered-By, baseline security headers, front-controller rewrite)
- env.example documents the production/secret-handling expectations
Security hardening (scaffolding perms, prod debug gate, Apache+nginx web
config), HKM_USERDATA_DIR for persistent registry across updates, and
hkm-config full-environment setup.
New projects scaffold app/apache.conf.example (DocumentRoot=app/public,
deny dotfiles, only index.php executable, security headers).
Adds the Apache virtual-host sample to project scaffolding (alongside nginx).
- README now documents native install (.deb/.tar.gz/.zip), the hkm command set,
  HKM_* env vars, requirements, dev/build flow, and security defaults.
- Remove links to the removed docs/ai-context files from the Auth plugin README.
docs: refresh README + fix broken links
Route policy — the third route verb (add/override/DISABLE):
- Kernel::withRoutePolicy() + proj.json "routePolicy": {"disable": []} let a
  project veto plugin routes without forking the plugin. Specs are either
  "METHOD /path" (one route) or a module domain (all of a plugin's routes).
- CompileRouteManifestStage applies the policy to plugin routes AFTER they
  compile and BEFORE project routes, so a disabled key can be re-declared by
  the project. An unmatched spec fails the boot (anti-typo guard).
- EntryHelpers::projectRoutePolicy() reads the proj.json block.

hkm dev environment for contributors:
- `hkm <command> --dev` pins one invocation to the development kernel
  (HKM_DEV_HOME from config.env, or walk-up self-location from a repo-built
  launcher). Exports HKM_KERNEL_HOME + HKM_CLI_PATH for the child only;
  fails loudly when no dev kernel is found.
- hkm-config set-dev-home <path> (validated) + help/README documentation.

Templates: scaffolded proj.json ships the routePolicy stub, bootstrap wires
withRoutePolicy(), project README documents the three route verbs.
Project routePolicy.disable (veto plugin routes without forking) and the
hkm --dev contributor environment (stable install + dev checkout side by side).
Alshatri added 22 commits July 31, 2026 18:50
…, url generation

Eight kernel additions derived from a gap analysis against HKM 0.3
(docs/migration/KERNEL-ADDITIONS.md). All additive and backward compatible —
no existing module.json, proj.json or bootstrap needed editing.

- Config\Repository + CompileConfigManifestStage (boot stage 9) + config()
  Dotted, immutable, project deep-merged over plugin per KEY rather than
  replacing the whole file.

- Ports\LoggerPort + LogLevel enum
  The only binding of Psr\Log\LoggerInterface in the codebase pointed at a
  NullLogger, so every line from Database, Tenancy, EventBus and the command
  auditor was silently discarded.

- Ports\Lock + AbstractLock + CachePort::lock()/restoreLock()
  increment() is atomic but cannot express ownership, blocking acquisition or
  TTL-bounded release, so single-flight cron and job idempotency had no correct
  implementation. Release must be atomic compare-and-delete.

- Routing\RouteParameter — typed {id:num} params, unknown type fails the boot
  Previously every {param} compiled to [^/]+, so /users/{id} matched /users/abc.

- Routing\UrlGenerator — named routes + signed URLs
  A project override inherits the plugin route's name, so a plugin view linking
  to route('auth.register') survives the project replacing that page.

- QueuePort pop/ack/release/fail + WorkerLoop port mode
  The port was write-only; consumption leaked through a caller-supplied puller.

- Exceptions\HttpStatusAware — non-kernel exceptions were all 500 + CRITICAL.
- Ports\ClockPort + SystemClock — CSRF expiry was untestable without sleeping.

Tests: 532 -> 659 (+127). Pre-existing failures unchanged (77 ext-sqlite3
errors, 5 php-io-cli CLI failures).
- Logger (NEW, solves logging.application): FileLogger, StreamLogger,
  NullLogger, PsrLoggerBridge behind Kernel\Ports\LoggerPort.
- Commands: stop binding Psr\Log\LoggerInterface to a NullLogger — that single
  binding was discarding every log line in the application. Resolve LoggerPort.
- Database, Tenancy: migrate off Psr\Log onto LoggerPort.
- RedisCache: RedisLock (SET NX PX + Lua compare-and-delete) and the QueuePort
  read side (pop/ack/release/fail) with a dead-letter list.
- Mail, Validation, Storage, Edge: read config through the compiled manifest
  instead of four copies of a project-file-REPLACES-plugin-file lookup, so a
  project now overrides only the keys it names.
- DevTools: config:show / config:clear.
- Auth: drop docblock references to FirewallLayer/RateLimiterLayer, which the
  kernel does not ship.
- FirewallLayer / RateLimiterLayer were referenced in six files but have never
  existed; the kernel ships only CsrfTokenLayer (IP filtering and rate limiting
  are SecurityFilters route filters). Following CLAUDE.md produced a bootstrap
  that fatals on an undefined class.
- CoreContainer's docblock claimed build() freezes the container; Kernel.php
  freezes in materialize().
- CLAUDE.md documented src/Kernel/Http/, which moved to the alfacode-team/http
  package (namespace unchanged).
- Worker template: drop the hand-written puller that type-checked its adapter
  and returned null for anything else — swapping to Redis made the worker
  silently process nothing.
- New: docs/ai-context/28_KERNEL_ADDITIONS.md + migration analyses.
InMemoryRefreshTokenStore lacked allActive(), InMemoryScopeStore lacked
put()/delete(), and an anonymous RefreshTokenStore in
AuthorizedTokenManagementTest lacked allActive(). Each fatals at COLLECTION
time, so the whole suite aborted with no output rather than failing one file.

Also: FakeCache implements the new CachePort lock methods, and the Zig
bootstrap template drops its FirewallLayer/RateLimiterLayer reference.
BREAKING: plugins/ no longer exists in this repo. All 28 plugins are now
composer packages (alfacode-team/hkm-plugin-*) with their own repositories,
resolved from a sibling ../plugins workspace via a path repository with
symlink:true, so edits there stay live without a reinstall.

- composer.json: drop the "Plugins\\" PSR-4 root and the six plugin helper
  files[] entries; add the path repository and 28 requires.
- Each plugin package now declares its own autoload.files. Three of them
  (Storage, ViteManifest, SocialAuth) defined global helpers that were in NO
  autoload.files at all — not the plugin's, not the kernel's — so callers such
  as Storage\Provider::register(), which calls storage_config() ten times,
  would fatal on an undefined function. Pre-existing; surfaced by the move.
- Tests: resolve plugin asset paths via ReflectionClass instead of a
  repo-relative plugins/ path, which breaks once a plugin is a dependency.

Suite unchanged at parity: 659 tests, 77 errors (ext-sqlite3 absent),
5 failures (php-io-cli submodule).
…wn repos

Corrects the dependency direction from the previous commit. Requiring the 28
plugin packages from the kernel inverted the placement law (the framework must
not know about plugins) and created a cycle, since every plugin dev-requires
the kernel to run its own tests. The kernel now requires only its modules.

- Removed the 28 plugin requires and the ../plugins path repository.
- Moved tests/Unit/{Plugins,Database,Commands} into the plugin repos, plus the
  two kernel tests that reached into plugins (DevTools' config commands, the
  Logger adapters). The kernel keeps LogLevelTest, since it owns the enum.
- Bumped modules/php-io-cli for unknown-option rejection, which makes
  tests/Unit/Cli/UnknownOptionTest pass — it had been red permanently, testing
  a feature that was never implemented upstream either.

Kernel suite is now fully green: 157 tests, 298 assertions, 0 failures.
Previously 659 tests with 77 errors and 5 failures; the 77 were ext-sqlite3
(fixed in the Database plugin) and the 5 were the CLI parser.
The constraint was "*", while the kernel had in fact depended on an UNTAGGED
bind-it commit since June — the one adding a PSR-11 compatible
Container::get(string $id): mixed. Locally that resolved through the
modules/bind-it path repo and worked; any external consumer resolved the
published 0.1.3 instead and died at class-load time with

  Declaration of Kernel\Container\ModuleContainer::get(string $id): mixed
  must be compatible with PHPShots\Common\Container::get($key)

which surfaced as "Premature end of PHP process" — a fatal, not a catchable
error, so it read as a crashing test rather than a dependency mismatch.

bind-it 0.1.4 now tags that commit, and its composer.json no longer hardcodes a
"version" field that overrode (and lagged) the git tags. The constraint accepts
the path repo's dev-master for kernel development and the tag for consumers.
…ip messages

Adds CompileLangManifestStage (boot stage 7), which compiles every module.json
"lang" declaration plus the project's own into lang-manifest.php.

WHY

The Translator held a single directory, so the only catalogue that could ever
load was the one the I18n plugin ships. A plugin had nowhere to register its
messages, which is why every user-facing string in every other plugin is
hard-coded English. APP_LANG_PATH made it worse rather than better: it REPLACED
the directory, so a project pointing it at its own catalogue silently lost the
plugin's and got raw keys back for anything it had not copied.

MODEL

Deliberately identical to views — a platform with two different override models
is a platform nobody can predict. Lower priority wins: project sources default
to 0, plugin sources to 100, so a project overrides a plugin's wording by
default and can do so without forking. A plugin preempts the project only by
declaring an explicit lower priority. Ties break by declaration order, never by
load or filesystem order. Plugin catalogues are also exposed under a namespace
(the module name by default) so two plugins can define the same key.

A declared-but-missing directory is skipped rather than fatal — a catalogue is
optional content and a typo should not make the app unbootable. An empty path
does throw, because it means the author expects messages that will never load.

NOTE ON DUPLICATION

This mirrors CompileViewManifestStage rather than sharing code with it. The
common cascade logic is worth extracting, but that stage has no test coverage
and refactoring a shipped boot stage blind is the worse trade. This one ships
with 11 tests; extract once both are covered.

Full kernel suite green (168 tests).
…r --help

THE STRUCTURAL BUG

Every command arm ended in `std.process.exit(code)`. std.process.exit does NOT
run deferred code, so `threaded.deinit()` and the arena's `deinit()` never
executed on any successful command. The process exiting made that harmless in
practice, but it also meant nothing could ever run at teardown — no leak check,
no report, no cleanup. main() is now a thin wrapper that owns the memory manager
and is the only place that exits; dispatch() returns an exit code up to it.

MEMORY MANAGER (lib/memory.zig)

The file did not compile. `std.heap.DebugAllocator()` was called with no
argument (it is a generic taking a Config), and it imported "constants.zig" from
src/lib/ where the file lives at src/. Neither was caught because nothing
referenced it and Zig only analyses a function body when it is used.

Rewritten as a Manager that owns the whole strategy: debug builds get the debug
allocator (leak / double-free / use-after-free) wrapped in the inspector;
release builds get the page allocator, with the wrapper compiling to nothing.
Verified: --release=small is 434 KB and --mem produces no output at all.

Manager.init() deliberately does NOT wire itself. An earlier version did, and
segfaulted: DebugAllocator.allocator() captures &self, so wiring a local and
then returning the struct by value left the copy pointing into a dead stack
frame. The crash surfaced inside std.process.Environ.createMap, blaming the
first innocent code to allocate. Wiring now happens lazily at the final address.

constants.zig derived __DEBUG__ from a hard-coded `true`, so a RELEASE build
would have kept never_unmap and retain_metadata — the first stops freed pages
returning to the OS, the second keeps every allocation's metadata alive. Both
are correct while debugging and both are leaks by design in a shipped binary.
Now derived from builtin.mode.

INSPECTOR

Groups are tagged per command via a CmdScope that sets the group BEFORE opening
that command's arena. Order matters: the arena takes memory in large chunks, so
whichever group is active at its first chunk is charged for everything served
from it — with one process-wide arena opened at startup, every command's memory
was attributed to "startup".

The group panel now scales by PEAK, not current. The dashboard prints at exit,
where a clean run has freed everything, so every bar was drawn at zero. Peak
answers what was actually being asked; a non-zero `current` is now called out
explicitly, since that is where a leak lives.

Event.ret_addr was hard-coded to 0 at both call sites, making the field a lie
for anything that read it. It now carries the real return address.

--help REPAIRS

- discover: --help fell through the catch-all `--` branch and was ignored, so
  asking for help ran a full scan AND wrote every project it found into the
  registry. Now matched before the catch-all.
- cli/worker: printed help then returned 2, so a successful help request looked
  like a failed command to any script checking the status.
- run: parse() returned null for BOTH --help and invalid arguments, collapsing
  them into "print help, exit 2". The two are now distinct.
- new/update: no --help handling at all; the usage text was inline in an error
  branch. Extracted to printHelp() and reachable explicitly.

All twelve commands now exit 0 for --help. Normal behaviour is unchanged and an
unknown command still exits 2.

ALSO

- build.zig gains a `test` step. There was none. It is rooted at src/main.zig so
  relative imports resolve — `zig test src/lib/memory.zig` makes src/lib the
  module root and fails on ../constants.zig, which is misleading rather than
  useful.
- main.zig gains an explicit test-collection block. Zig only runs tests from
  files it analyses, and a top-level @import is not enough: without it the step
  reported success having run nothing. Verified by mutation — breaking an
  assertion in memory.zig now turns the step red.
- util.envIsTruthy centralises what HKM_* toggles consider "yes".
- --mem prints the dashboard; HKM_MEM_INSPECT does it always; HKM_MEM_STRICT
  exits 70 on a leak, for CI. All documented in `hkm help`.

6 tests pass. Debug and --release=small both build clean.
Enabling a plugin that was not already on disk used to wire it into the
bootstrap "by name anyway" — producing a project that referenced a Provider
class which did not exist. The failure landed at boot as a class-not-found,
nowhere near the command that caused it. Plugins are now fetched from git, and
enable either works or says why it cannot.

NEW COMMANDS

  hkm plugins install <plugin> [proj]    fetch from git (aliases: fetch/get)
  hkm plugins uninstall <plugin> [proj]  remove + drop from the lock
  hkm plugins versions <plugin>          list releases on the remote
  hkm plugins outdated [proj]            what has a newer release
  hkm plugins lock [proj]                restore every plugin at its locked version

`enable` auto-installs a missing plugin first. A plugin found locally still
wins: a contributor's working copy must not be silently replaced by a release.

VERSIONING

Installs resolve to a concrete TAG, never a branch. A plugin pinned to `main`
changes under a project between two deploys, which is exactly what a lock file
exists to prevent — so an untagged plugin is refused rather than installed from
a moving ref.

plugins.lock.json records remote, tag, commit and the kernel version in force.
The commit is stored alongside the tag deliberately: a tag can be moved on the
remote, and the two disagreeing is itself the signal. Entries are sorted and
hand-serialised so the file diffs cleanly in review — a lock is read by people
far more often than by machines.

KERNEL LOCK

module.json gains a "kernel" semver constraint (e.g. "^1.0"), checked before a
plugin is committed into plugins/. An ABSENT constraint installs freely — every
plugin predating the field declares nothing and failing closed would make all of
them uninstallable at once. A MALFORMED one is refused: someone tried to express
a requirement and got it wrong, and treating that as "no requirement" defeats
the check. A 0.0.0-dev kernel bypasses the gate, since 0.0.0 is below every real
floor and contributors would otherwise be unable to install anything.

ORDER OF OPERATIONS

resolve → resolve tag → fetch to STAGING → gate → commit into plugins/. The gate
runs after the fetch because the constraint lives inside the plugin; staging
first means a rejected plugin never lands in plugins/, where the bootstrap would
then try to wire it. A refused UPDATE rolls back to the previous tag rather than
leaving a plugin the project cannot boot with. A working copy with uncommitted
changes is never overwritten without --force.

SUPPORTING MODULES

- semver.zig: parsing and constraint matching (caret, tilde, comparators,
  wildcards, exact pins), with 0.x handled properly — ^0.2 allows 0.2.x only,
  because pre-1.0 packages break in the MINOR field.
- plugin_registry.zig: name → remote, including the irregular repo spellings
  (SocialAuth → social-auth, SiteSEO → siteseo, OAuth2 → oauth2) that were
  otherwise scattered special cases. HKM_PLUGIN_ORG / HKM_PLUGIN_REMOTE support
  forks and mirrors.
- plugin_git.zig: ls-remote/clone/fetch/checkout, shallow by default. Shells out
  to git so credential helpers, SSH agents and insteadOf rewrites all work.
  ls-remote retries three times: a single transient DNS hiccup otherwise
  surfaces as "the repo does not exist", sending people after a permissions
  problem they do not have. Measured 1-in-3 success before the retry, 5-in-5
  after.

29 tests pass. Verified end to end against the real remotes: fetching Logger
into a bare project resolved v1.0.0, cloned at that tag, wired the bootstrap and
wrote a correct lock; re-running reports up-to-date and touches nothing.
…from

The kernel is really at v1.0.21, and tools/bundle.sh stamps the version from
`git describe --tags` — so any build made between releases carries a trailer
like "1.0.21-138-gbdbbf34", meaning "138 commits after v1.0.21".

Plain semver reads that trailer as a PRE-RELEASE, and a pre-release sorts BELOW
its release. The build was therefore considered OLDER than the tag it was built
from: a plugin requiring ">=1.0.21" was refused on a kernel 138 commits past
v1.0.21. Every nightly and every packaged build cut between two releases would
have hit it.

parseDescribed() recognises the "-<commits>-g<sha>" shape and drops it, treating
the build as its base version. Conservative on purpose: the true version lies
between this tag and the next, so claiming the lower bound can only refuse a
plugin a newer kernel would have accepted — never admit one it should reject.

Detection is deliberately narrow. The count must be all digits and the sha must
be 'g' followed by hex, so a genuine pre-release keeps its lower precedence:
"1.0.0-rc.1" still fails ">=1.0.0", and "0.0.0-dev" still parses as a dev build.
Lookalikes ("1.0.0-1-gz", "1.0.0-beta-g1", "1.0.21-138") are left alone.

32 tests. Verified end to end against a stamped build: the kernel gate now
refuses a plugin requiring ^99.0 with a clear message and leaves nothing behind
in plugins/, accepts one requiring ^1.0, and HKM_PLUGIN_IGNORE_KERNEL=1
overrides. Also confirmed the installer checks out the COMMIT an annotated tag
points to rather than the tag object, and records that commit in the lock.
…ade repo

TWO FIXES

1. build.zig stamped the repo as "AlfaCode-Team/php-service-platform", but it
   was renamed to "hkm-kernel". `hkm upgrade` queries that name to find the
   latest release, and it only still worked because GitHub redirects the old
   name — a redirect that lasts only while nothing else claims it. Now points at
   the real repo.

2. A versioned build writes its version into composer.json, so a release carries
   it everywhere rather than only in the compiled binary. bundle.sh already
   copies composer.json into the artifact (SRC_PATHS), so the packaged kernel
   now reports its own version.

WHY THIS IS SCOPED THE WAY IT IS

A literal "version" in composer.json is normally a liability: Composer derives a
package's version from git tags, and the field OVERRIDES them. Once they can
disagree they eventually do — someone tags v1.2.0, forgets the field, and every
consumer silently resolves the stale number. This repository has already been
bitten by exactly that (phpshots/bind-it pinned "0.1.3" and its real tags were
ignored).

It earns its place only because the native distribution ships WITHOUT a .git
directory: a .deb or zip has no tags to derive from, so the field is the
installed kernel's only version marker.

So the stamp runs only when -Dversion was passed explicitly — which is what
bundle.sh does for a release. A plain `zig build` is 0.0.0-dev and leaves the
file untouched, so a dev build never dirties the working tree with a version
someone then commits by accident. `zig build stamp -Dversion=X` runs it on
demand.

The edit is textual, not a JSON re-serialise: the file keeps its hand-maintained
key order and indentation, so a release produces a one-line diff instead of
reordering every key. Re-stamping the same version is a no-op.

5 tests for the stamper (37 total). Verified: -Dversion=1.0.21 inserts the key
after "name" and the result still parses; re-running changes nothing; a bump to
1.0.22 replaces it in place; a plain build leaves composer.json alone.
…e installed kernel

`hkm upgrade` could only install a PUBLISHED release. There was no way to put
local kernel changes into /opt/hkm-kernel — the copy every project on the
machine actually runs — without tagging a release first, so testing a kernel
change against real projects meant cutting a release to try it.

    hkm upgrade --local [--dry-run] [--yes]

Copies the same file set a .deb ships (mirroring SRC_PATHS in bundle.sh) via
`git ls-files --recurse-submodules`, so only TRACKED files move: build
artifacts, vendor/ and local scratch cannot leak into the install. bin/psp is
installed as bin/hkm, matching the rename bundle.sh performs so the launcher's
passthrough resolves. The built native launcher is copied to /usr/bin when
present, and install.sh runs afterwards so PHP dependencies resolve against the
TARGET's PHP rather than whatever the checkout happened to resolve.

Guards: refuses when source and target are the same path (copying a checkout
over itself would delete files mid-walk), when the source is not a kernel
checkout, and prompts before overwriting unless --yes. --dry-run reports the
file set without writing.

THREE BUGS FOUND WHILE BUILDING IT

- util.canWrite probed with a 64-byte buffer, so any ordinary path overflowed
  bufPrint. The overflow was swallowed as "cannot write", so the caller
  escalated to sudo for targets it could write directly — and every one of 645
  copies then failed. Now sized to std.fs.max_path_bytes.

- The copy loop counted failures without reporting a cause. "645 file(s) could
  not be written" is barely better than failing silently; it now names the first
  failure and its error.

- banner.printShort() wrote to STDERR via std.debug.print, while its own
  docblock said "for `hkm --version` piped/scripted use". VERSION=$(hkm
  --version) returned an empty string and the version went where the caller was
  not looking. Now writes to stdout.

The "installed" version is read from the TARGET's composer.json rather than
banner.version(): the latter is the version THIS BINARY was stamped with, which
is normally the local dev build — so both sides would report the source's
version and always look like a no-op. They differ exactly when this command is
worth running. Falls back to the binary's version when the target predates
composer stamping.

Verified end to end against a scratch target: 645 files copied, src/Kernel and
modules present, bin/psp correctly installed as bin/hkm, and vendor/ and var/
absent. plugins/ copies nothing, which is correct — the kernel no longer ships
plugins; they are fetched with `hkm plugins install`.

37 tests pass; debug and --release=small both build clean.
Publishing a single dev tag would have pushed unfinished work to every stable
user.

`latestTag()` took the highest v* tag with no filtering, and upgrade.zig's local
`Ver.parse` STRIPPED any pre-release suffix before comparing. So "v1.1.0-dev.1"
was indistinguishable from a stable "v1.1.0" and sorted above "v1.0.21": anyone
running `hkm upgrade` would have been told an update was available and given the
dev build. That is the opposite of what publishing a pre-release is for.

Two changes:

- Pre-release tags are skipped when selecting the latest release. `--pre` opts
  in, for someone who deliberately wants a dev or rc build.
- The local `Ver` duplicate is replaced by lib/semver.zig, which sorts a
  pre-release BELOW its release per semver §11 and understands the `git
  describe` trailer bundle.sh stamps between releases. Removing the duplicate
  also means there is now one definition of "which version is newer" rather than
  two that disagreed on exactly this case.

release.yml already marks a tag containing '-' as a GitHub prerelease, so the
publish side was correct; only the client side was not.

Verified: given tags v1.0.20, v1.0.21 and v1.1.0-dev.1, selection yields
v1.0.21 by default and v1.1.0-dev.1 with --pre. 37 tests pass.
The release workflow extracts the '## [VERSION]' block as the release body, so
this is what people will actually read on the release page.
PHP Analysis has failed on every commit since db63dae — the refactor that moved
plugins out of the kernel into their own repositories. That commit removed
plugins/ but left it in phpstan.neon.dist's `paths`, so every run since died on
"Path .../plugins does not exist" before analysing a single file. Four months of
green-to-red went unexplained because the failure looked like an analysis error
rather than a config one.

With the path removed, analysis runs and reports 53 findings. The three in
src/Kernel — the code that actually ships — are fixed here:

- Repository::lookup() and UrlGenerator::substitute() declared nullable by-ref
  parameters that are never assigned null. PHPStan is right that the nullable
  half is dead, but simply narrowing the type would have broken BOTH call sites
  at runtime: they passed undefined variables, and PHP materialises an undefined
  by-ref argument as null, which a non-nullable parameter rejects with a
  TypeError. Verified that before changing it. The callers now initialise
  explicitly, which is clearer anyway, and the types are narrowed.

- CompileConfigManifestStage accepted a ManifestReader it never read. It locates
  a plugin's config by DIRECTORY (config/*.php beside its Provider), never from
  module.json, so the dependency was there purely for signature symmetry with
  the sibling stages — and implied a manifest lookup that does not happen.
  Removed, along with its now-unused import and the argument at both call sites.

The remaining 50 are in projects/ and are the same decoupling fallout:
project-layer code referencing Plugins\* classes that no longer live in this
repository. That is a real architectural coupling the split exposed, not a
config error, and fixing it means changing what the project layer depends on —
deliberately left for its own change rather than baselined away here.

168 tests pass; src/Kernel is PHPStan-clean.
…uild broke

The v1.1.0-dev.1 release build failed on all three platforms:

    dashboard.zig:70:54: error: binary operator '*' has whitespace on one side,
    but not the other
        p("\n{s}{s}╭{s}╮{s}\n", .{ bold, blue, "─" ** WIDTH, reset });

The message is misleading — the spacing is symmetric. Zig 0.17 REMOVED the `**`
array-repeat operator, so `"─" ** WIDTH` now parses as two pointer-type `*`
tokens (`"─" * (*WIDTH)`), and the whitespace rule fires on the first of them.
Written without spaces it fails differently, with "expected type 'type', found
'comptime_int'", which is the same cause seen from the other side. `**` no
longer appears anywhere in 0.17's own std.

Replaced with a comptime `repeat()` helper, which works on both 0.16 and 0.17.
It has to be `inline`: a plain fn building the string in a comptime block is
rejected with "function called at runtime cannot return value at comptime".

WHY THIS REACHED A RELEASE

It compiled fine on the Zig installed here (0.16.0) and only the PINNED version
in tools/.zig-version (0.17.0-dev.657) rejects it — and that pinned version is
the one every release is built with. I flagged the mismatch twice while working
without acting on it; this is what it cost. Fixed by installing the pinned
toolchain with the repo's own tools/ci/setup-zig.sh and reproducing the failure
locally before changing anything.

Verified on 0.17.0-dev.657: debug, --release=small, and the tests all pass, and
all three release targets cross-compile (aarch64-macos, x86_64-windows,
x86_64-linux). 0.16 still builds, so the fix is good on both.
The v1.1.0-dev.1 release built all three artifacts successfully and then
published with ZERO assets on it.

This repository has immutable releases enabled. The workflow created the release
already published (draft: false) and uploaded assets afterwards, which immutable
releases forbid:

    Cannot upload asset ... to an immutable release. GitHub only allows asset
    uploads before a release is published.

The .deb, .zip and .tar.gz were all built and had nowhere to go, and because the
release is immutable they can never be added to it — the tag has to be recut.

Assets now attach while the release is still a draft, and a following step
publishes it. That is the flow GitHub's own error message prescribes for
immutable-release repositories.

Worth noting for anything downstream: a draft prerelease fires
release.published when it is published, not release.prereleased.
v1.1.0-dev.1 was withdrawn: it published with no binaries attached because
immutable releases forbid post-publish asset uploads, and the repository's tag
ruleset (correctly) refuses to let a deleted tag be recreated. The version
number is burned; dev.2 is the first installable pre-release.
…r one

The CHANGELOG version detector matched only ^## [x.y.z], so a pre-release
heading like '## [1.1.0-dev.2]' was passed over and the next heading down
('## [1.0.21]') matched instead. That version is already tagged, so the run
reported 'nothing to release' — a dev release merged to main would have
silently done nothing while appearing to have been considered.

The suffix is now part of the pattern.
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 985 files, which is 885 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: f9dab77f-17e6-40bd-ad1a-10204488595d

📥 Commits

Reviewing files that changed from the base of the PR and between c415004 and b8ac839.

⛔ Files ignored due to path filters (10)
  • composer.lock is excluded by !**/*.lock
  • plugins/Auth/AUTH_GUIDE.pdf is excluded by !**/*.pdf
  • plugins/Authorization/config/policy.seed.csv is excluded by !**/*.csv
  • plugins/OAuth2/OAUTH2_GUIDE.pdf is excluded by !**/*.pdf
  • plugins/Pageflow/ui/PAGEFLOW_GUIDE.pdf is excluded by !**/*.pdf
  • plugins/Pageflow/ui/PAGEFLOW_TUTORIAL.pdf is excluded by !**/*.pdf
  • plugins/Pageflow/ui/PAGEFLOW_UI_REFERENCE.pdf is excluded by !**/*.pdf
  • plugins/Pageflow/ui/PAGEFLOW_URL_PRESERVATION.pdf is excluded by !**/*.pdf
  • plugins/Pageflow/ui/PAGEFLOW_USAGE.pdf is excluded by !**/*.pdf
  • plugins/User/User-Plugin.pdf is excluded by !**/*.pdf
📒 Files selected for processing (985)
  • .github/workflows/auto-release.yml
  • .github/workflows/release.yml
  • CHANGELOG.md
  • composer.json
  • docs/guides/Kernel-Guide_EN-FR.src.html
  • modules/bind-it
  • modules/php-io-cli
  • phpstan.neon.dist
  • plugins/Audit/API/Contracts/AuditReaderContract.php
  • plugins/Audit/API/Contracts/AuditServiceContract.php
  • plugins/Audit/Application/Ports/AuditWriter.php
  • plugins/Audit/Application/Services/AuditService.php
  • plugins/Audit/Domain/Entities/AuditEntry.php
  • plugins/Audit/Infrastructure/Persistence/AuditLogRepository.php
  • plugins/Audit/Infrastructure/Persistence/AuditTrail.php
  • plugins/Audit/Provider.php
  • plugins/Audit/database/migrations/.gitkeep
  • plugins/Audit/database/tenant-template/2026_06_22_000005_create_audit_log_table.php
  • plugins/Audit/module.json
  • plugins/Auth/API/Contracts/AuthServiceContract.php
  • plugins/Auth/API/Contracts/RefreshTokenServiceContract.php
  • plugins/Auth/API/DTOs/PersonalAccessTokenResult.php
  • plugins/Auth/API/DTOs/RefreshRotation.php
  • plugins/Auth/API/DTOs/RefreshTokenIssued.php
  • plugins/Auth/API/DTOs/TokenDTO.php
  • plugins/Auth/API/Guard.php
  • plugins/Auth/API/ScopeInheritance.php
  • plugins/Auth/Application/Auth/AuthManager.php
  • plugins/Auth/Application/Auth/AuthUserProxy.php
  • plugins/Auth/Application/Auth/GuardAccessor.php
  • plugins/Auth/Application/Auth/GuardBehaviour.php
  • plugins/Auth/Application/Auth/ModelUserProvider.php
  • plugins/Auth/Application/Auth/PasswordResetBroker.php
  • plugins/Auth/Application/Auth/PersonalAccessTokenFactory.php
  • plugins/Auth/Application/Auth/RoleResolver.php
  • plugins/Auth/Application/Auth/StatefulSessionGuard.php
  • plugins/Auth/Application/Ports/Authenticatable.php
  • plugins/Auth/Application/Ports/Driver.php
  • plugins/Auth/Application/Ports/GuardContext.php
  • plugins/Auth/Application/Ports/GuardDriver.php
  • plugins/Auth/Application/Ports/PasswordBroker.php
  • plugins/Auth/Application/Ports/RefreshTokenStore.php
  • plugins/Auth/Application/Ports/StatefulGuard.php
  • plugins/Auth/Application/Ports/SupportsBasicAuth.php
  • plugins/Auth/Application/Ports/UserProvider.php
  • plugins/Auth/Application/Services/AuthService.php
  • plugins/Auth/Application/Services/DeviceSessionService.php
  • plugins/Auth/Application/Services/MobileAuthService.php
  • plugins/Auth/Application/Services/RefreshTokenService.php
  • plugins/Auth/Domain/Entities/PersonalAccessToken.php
  • plugins/Auth/Domain/Entities/RefreshTokenRecord.php
  • plugins/Auth/Domain/Exceptions/AuthenticationException.php
  • plugins/Auth/Domain/Exceptions/AuthorizationException.php
  • plugins/Auth/Domain/Exceptions/InvalidAuthTokenException.php
  • plugins/Auth/Domain/Exceptions/InvalidRefreshTokenException.php
  • plugins/Auth/Domain/Exceptions/MissingScopeException.php
  • plugins/Auth/Domain/ValueObjects/Recaller.php
  • plugins/Auth/Infrastructure/Auth/Drivers/JwtDriver.php
  • plugins/Auth/Infrastructure/Auth/Drivers/RequestDriver.php
  • plugins/Auth/Infrastructure/Auth/Drivers/ResolvesFromVerdict.php
  • plugins/Auth/Infrastructure/Auth/Drivers/SessionDriver.php
  • plugins/Auth/Infrastructure/Auth/Drivers/TokenDriver.php
  • plugins/Auth/Infrastructure/Cli/PruneAccessTokensCommand.php
  • plugins/Auth/Infrastructure/Http/Controllers/AuthTokenController.php
  • plugins/Auth/Infrastructure/Http/Controllers/MobileAuthController.php
  • plugins/Auth/Infrastructure/Http/Controllers/PasswordResetController.php
  • plugins/Auth/Infrastructure/Http/Controllers/PersonalAccessTokenController.php
  • plugins/Auth/Infrastructure/Http/Controllers/SessionAuthController.php
  • plugins/Auth/Infrastructure/Http/Controllers/TransientTokenController.php
  • plugins/Auth/Infrastructure/Http/Stages/SessionAuthStage.php
  • plugins/Auth/Infrastructure/Persistence/DeviceSessionRepository.php
  • plugins/Auth/Infrastructure/Persistence/PersonalAccessTokenRepository.php
  • plugins/Auth/Infrastructure/Persistence/RefreshTokenRepository.php
  • plugins/Auth/Provider.php
  • plugins/Auth/README.md
  • plugins/Auth/Security/JwtAuthLayer.php
  • plugins/Auth/Security/PersonalAccessTokenLayer.php
  • plugins/Auth/Support/Token.php
  • plugins/Auth/Support/helpers.php
  • plugins/Auth/config/auth.php
  • plugins/Auth/database/migrations/.gitkeep
  • plugins/Auth/database/tenant-template/2026_06_05_000001_create_personal_access_tokens_table.php
  • plugins/Auth/database/tenant-template/2026_06_27_000002_add_expiry_and_abilities_to_personal_access_tokens.php
  • plugins/Auth/database/tenant-template/2026_07_04_000002_create_refresh_tokens_table.php
  • plugins/Auth/database/tenant-template/2026_07_12_000001_create_auth_sessions_table.php
  • plugins/Auth/module.json
  • plugins/Auth/resources/views/password-otp.php
  • plugins/Authorization/API/Contracts/AuthorizationServiceContract.php
  • plugins/Authorization/Application/Services/AuthorizationService.php
  • plugins/Authorization/Engine/CachedEnforcer.php
  • plugins/Authorization/Engine/Config.php
  • plugins/Authorization/Engine/Constants.php
  • plugins/Authorization/Engine/CoreEnforcer.php
  • plugins/Authorization/Engine/Effector/DefaultEffector.php
  • plugins/Authorization/Engine/Effector/Effector.php
  • plugins/Authorization/Engine/EnforceContext.php
  • plugins/Authorization/Engine/Enforcer.php
  • plugins/Authorization/Engine/Exceptions/BatchOperationException.php
  • plugins/Authorization/Engine/Exceptions/CannotSaveFilteredPolicy.php
  • plugins/Authorization/Engine/Exceptions/CasbinException.php
  • plugins/Authorization/Engine/Exceptions/EmptyConditionException.php
  • plugins/Authorization/Engine/Exceptions/EvalFunctionException.php
  • plugins/Authorization/Engine/Exceptions/InvalidFilePathException.php
  • plugins/Authorization/Engine/Exceptions/InvalidFilterTypeException.php
  • plugins/Authorization/Engine/Exceptions/NotImplementedException.php
  • plugins/Authorization/Engine/Exceptions/ObjConditionException.php
  • plugins/Authorization/Engine/Interfaces/CacheableParam.php
  • plugins/Authorization/Engine/Interfaces/ConditionalRoleManager.php
  • plugins/Authorization/Engine/Interfaces/Config.php
  • plugins/Authorization/Engine/Interfaces/Logger.php
  • plugins/Authorization/Engine/Interfaces/Persist/Adapter.php
  • plugins/Authorization/Engine/Interfaces/Persist/BatchAdapter.php
  • plugins/Authorization/Engine/Interfaces/Persist/FilteredAdapter.php
  • plugins/Authorization/Engine/Interfaces/Persist/UpdatableAdapter.php
  • plugins/Authorization/Engine/Interfaces/Persist/Watcher.php
  • plugins/Authorization/Engine/Interfaces/Persist/WatcherEx.php
  • plugins/Authorization/Engine/Interfaces/Persist/WatcherUpdatable.php
  • plugins/Authorization/Engine/Interfaces/RoleManager.php
  • plugins/Authorization/Engine/Interfaces/Supports/AccessPermission.php
  • plugins/Authorization/Engine/InternalEnforcer.php
  • plugins/Authorization/Engine/Log/Log.php
  • plugins/Authorization/Engine/Log/Logger/DefaultLogger.php
  • plugins/Authorization/Engine/ManagementEnforcer.php
  • plugins/Authorization/Engine/Model/Assertion.php
  • plugins/Authorization/Engine/Model/FunctionMap.php
  • plugins/Authorization/Engine/Model/Model.php
  • plugins/Authorization/Engine/Model/Policy.php
  • plugins/Authorization/Engine/Persist/AdapterHelper.php
  • plugins/Authorization/Engine/Persist/Adapters/FileAdapter.php
  • plugins/Authorization/Engine/Persist/Adapters/FileFilteredAdapter.php
  • plugins/Authorization/Engine/Persist/Adapters/Filter.php
  • plugins/Authorization/Engine/RBAC/ConditionalDomainManager.php
  • plugins/Authorization/Engine/RBAC/ConditionalRoleManager.php
  • plugins/Authorization/Engine/RBAC/DomainManager.php
  • plugins/Authorization/Engine/RBAC/Role.php
  • plugins/Authorization/Engine/RBAC/RoleManager.php
  • plugins/Authorization/Engine/RBAC/Supports/BaseManager.php
  • plugins/Authorization/Engine/RBAC/Supports/DomainManager.php
  • plugins/Authorization/Engine/RBAC/Supports/RoleManager.php
  • plugins/Authorization/Engine/Util/BuiltinOperations.php
  • plugins/Authorization/Engine/functions.php
  • plugins/Authorization/Infrastructure/Cli/SeedPolicyCommand.php
  • plugins/Authorization/Infrastructure/Http/Stages/PolicyFilterStage.php
  • plugins/Authorization/Infrastructure/Persistence/DatabasePolicyAdapter.php
  • plugins/Authorization/Provider.php
  • plugins/Authorization/config/rbac_model.conf
  • plugins/Authorization/database/migrations/.gitkeep
  • plugins/Authorization/database/tenant-template/2026_06_05_000001_create_casbin_rule_table.php
  • plugins/Authorization/module.json
  • plugins/Commands/API/Contracts/MigrationServiceContract.php
  • plugins/Commands/API/Contracts/ModuleManagementServiceContract.php
  • plugins/Commands/API/DTOs/MigrateRequest.php
  • plugins/Commands/API/DTOs/MigrateResponse.php
  • plugins/Commands/API/DTOs/MigrateStatusRequest.php
  • plugins/Commands/API/DTOs/MigrateStatusResponse.php
  • plugins/Commands/API/DTOs/ModuleAddRequest.php
  • plugins/Commands/API/DTOs/ModuleAddResponse.php
  • plugins/Commands/API/DTOs/ModuleRemoveRequest.php
  • plugins/Commands/API/DTOs/ModuleRemoveResponse.php
  • plugins/Commands/Application/Services/CommandsInfrastructureService.php
  • plugins/Commands/Application/Services/MigrationService.php
  • plugins/Commands/Application/Services/ModuleManagementService.php
  • plugins/Commands/Approval/MigrationApprovalManager.php
  • plugins/Commands/Backup/BackupManager.php
  • plugins/Commands/Configuration/ConfigurationValidator.php
  • plugins/Commands/Configuration/EnvironmentConfigurationLoader.php
  • plugins/Commands/Deployment/DeploymentLockManager.php
  • plugins/Commands/Deployment/DeploymentLockedException.php
  • plugins/Commands/Exceptions/ConfigurationException.php
  • plugins/Commands/Exceptions/ServiceException.php
  • plugins/Commands/Infrastructure/Gateways/LetMigrateGateway.php
  • plugins/Commands/Infrastructure/Gateways/ShellGateway.php
  • plugins/Commands/Infrastructure/Http/Commands/ModuleAddCommand.php
  • plugins/Commands/Infrastructure/Http/Commands/ModuleRemoveCommand.php
  • plugins/Commands/Infrastructure/Http/Commands/RouteListCommand.php
  • plugins/Commands/Infrastructure/Persistence/ApprovalRepository.php
  • plugins/Commands/Infrastructure/Persistence/BackupRepository.php
  • plugins/Commands/Infrastructure/Persistence/CommandAuditLogRepository.php
  • plugins/Commands/Infrastructure/Persistence/DeploymentLockRepository.php
  • plugins/Commands/Infrastructure/Persistence/MigrationRepository.php
  • plugins/Commands/Infrastructure/Persistence/ModuleRepository.php
  • plugins/Commands/Logging/CommandExecutionLogger.php
  • plugins/Commands/Provider.php
  • plugins/Commands/Secrets/SecretsManager.php
  • plugins/Commands/Validation/PreFlightValidator.php
  • plugins/Commands/module.json
  • plugins/Cookie/Infrastructure/CookieJar.php
  • plugins/Cookie/Infrastructure/Http/QueuedCookiesStage.php
  • plugins/Cookie/Provider.php
  • plugins/Cookie/Support/helpers.php
  • plugins/Cookie/config/cookie.php
  • plugins/Cookie/module.json
  • plugins/Crypto/Infrastructure/AesEncrypter.php
  • plugins/Crypto/Infrastructure/PasswordHasher.php
  • plugins/Crypto/Provider.php
  • plugins/Crypto/module.json
  • plugins/Database/API/Contracts/DatabaseConfigurationContract.php
  • plugins/Database/API/Contracts/DatabaseConnectionManagerContract.php
  • plugins/Database/Exceptions/ConnectionException.php
  • plugins/Database/Infrastructure/Drivers/DatabaseConfigurationFactory.php
  • plugins/Database/Infrastructure/Drivers/MySQLConfiguration.php
  • plugins/Database/Infrastructure/Drivers/PostgreSQLConfiguration.php
  • plugins/Database/Infrastructure/Drivers/SQLiteConfiguration.php
  • plugins/Database/Infrastructure/Drivers/SqlServerConfiguration.php
  • plugins/Database/Infrastructure/Persistence/ConnectionManager.php
  • plugins/Database/Infrastructure/Persistence/MultiDriverDatabaseAdapter.php
  • plugins/Database/Infrastructure/Persistence/PooledDatabaseAdapter.php
  • plugins/Database/Infrastructure/Persistence/SavepointGrammar.php
  • plugins/Database/Infrastructure/Pool/ConnectionPool.php
  • plugins/Database/Infrastructure/Pool/PoolConfiguration.php
  • plugins/Database/Infrastructure/Pool/PooledConnection.php
  • plugins/Database/Provider.php
  • plugins/Database/module.json
  • plugins/DevTools/Commands/GeneratorCommand.php
  • plugins/DevTools/Commands/MakePluginCommand.php
  • plugins/DevTools/Commands/MakeServiceCommand.php
  • plugins/DevTools/Commands/ModuleInfoCommand.php
  • plugins/DevTools/Commands/ModuleListCommand.php
  • plugins/DevTools/Commands/ProjectListCommand.php
  • plugins/DevTools/Commands/RoutesListCommand.php
  • plugins/DevTools/Provider.php
  • plugins/DevTools/module.json
  • plugins/Edge/API/Contracts/EdgeServiceContract.php
  • plugins/Edge/Application/EdgeService.php
  • plugins/Edge/Domain/CacheProfile.php
  • plugins/Edge/Domain/EdgePlan.php
  • plugins/Edge/Domain/ServeModel.php
  • plugins/Edge/Domain/ServerStack.php
  • plugins/Edge/Domain/Site.php
  • plugins/Edge/Domain/Strategy.php
  • plugins/Edge/Domain/SwooleOptions.php
  • plugins/Edge/Domain/TlsConfig.php
  • plugins/Edge/Domain/TlsMode.php
  • plugins/Edge/Infrastructure/Cli/EdgeApplyCommand.php
  • plugins/Edge/Infrastructure/Cli/EdgeHostsCommand.php
  • plugins/Edge/Infrastructure/Cli/EdgeServiceCommand.php
  • plugins/Edge/Infrastructure/Cli/EdgeStatusCommand.php
  • plugins/Edge/Infrastructure/ConfigRenderer.php
  • plugins/Edge/Infrastructure/HostsFileWriter.php
  • plugins/Edge/Infrastructure/ServiceRenderer.php
  • plugins/Edge/Infrastructure/SiteCollector.php
  • plugins/Edge/Infrastructure/StreamConfigWriter.php
  • plugins/Edge/Infrastructure/SystemProbe.php
  • plugins/Edge/Provider.php
  • plugins/Edge/README.md
  • plugins/Edge/Support/helpers.php
  • plugins/Edge/USAGE.md
  • plugins/Edge/config/edge.php
  • plugins/Edge/module.json
  • plugins/Feedback/API/DTOs/FeedbackPage.php
  • plugins/Feedback/API/DTOs/ListFeedbackQuery.php
  • plugins/Feedback/API/DTOs/SubmitFeedbackDTO.php
  • plugins/Feedback/API/IntegrationEvents/FeedbackSubmittedIntegrationEvent.php
  • plugins/Feedback/Application/Ports/FeedbackStore.php
  • plugins/Feedback/Application/Services/FeedbackService.php
  • plugins/Feedback/Domain/Entities/FeedbackEntry.php
  • plugins/Feedback/Domain/ValueObjects/FeedbackCategory.php
  • plugins/Feedback/Domain/ValueObjects/FeedbackId.php
  • plugins/Feedback/Domain/ValueObjects/FeedbackMessage.php
  • plugins/Feedback/Domain/ValueObjects/FeedbackRating.php
  • plugins/Feedback/Domain/ValueObjects/FeedbackStatus.php
  • plugins/Feedback/Domain/ValueObjects/Ulid.php
  • plugins/Feedback/Infrastructure/Http/Controllers/FeedbackController.php
  • plugins/Feedback/Infrastructure/Persistence/FeedbackRepository.php
  • plugins/Feedback/Provider.php
  • plugins/Feedback/README.md
  • plugins/Feedback/database/migrations/.gitkeep
  • plugins/Feedback/database/tenant-template/2026_06_29_000005_create_user_feedback_table.php
  • plugins/Feedback/module.json
  • plugins/HttpClient/Infrastructure/CurlHttpClient.php
  • plugins/HttpClient/Infrastructure/PendingRequest.php
  • plugins/HttpClient/Provider.php
  • plugins/HttpClient/module.json
  • plugins/I18n/Infrastructure/Http/LocaleStage.php
  • plugins/I18n/Provider.php
  • plugins/I18n/Support/Lang.php
  • plugins/I18n/Support/helpers.php
  • plugins/I18n/Translator.php
  • plugins/I18n/lang/en/validation.php
  • plugins/I18n/module.json
  • plugins/Mail/API/Contracts/MailerContract.php
  • plugins/Mail/Application/Jobs/SendMailJob.php
  • plugins/Mail/Application/Mailer.php
  • plugins/Mail/Domain/Address.php
  • plugins/Mail/Domain/Attachment.php
  • plugins/Mail/Domain/MailException.php
  • plugins/Mail/Domain/Message.php
  • plugins/Mail/Domain/Priority.php
  • plugins/Mail/Infrastructure/Mime/MimeBuilder.php
  • plugins/Mail/Infrastructure/Security/DkimSigner.php
  • plugins/Mail/Infrastructure/SmtpMailer.php
  • plugins/Mail/Infrastructure/SmtpTransport.php
  • plugins/Mail/Infrastructure/Transport/ArrayTransport.php
  • plugins/Mail/Infrastructure/Transport/LogTransport.php
  • plugins/Mail/Infrastructure/Transport/MailTransport.php
  • plugins/Mail/Infrastructure/Transport/SendmailTransport.php
  • plugins/Mail/Infrastructure/Transport/SmtpTransport.php
  • plugins/Mail/Infrastructure/Transport/Transport.php
  • plugins/Mail/Provider.php
  • plugins/Mail/README.md
  • plugins/Mail/config/mail.php
  • plugins/Mail/module.json
  • plugins/OAuth2/Application/Ports/AuthCodeStore.php
  • plugins/OAuth2/Application/Ports/AuthorizationFlow.php
  • plugins/OAuth2/Application/Ports/ClientStore.php
  • plugins/OAuth2/Application/Ports/DeviceCodeStore.php
  • plugins/OAuth2/Application/Ports/RefreshTokenStore.php
  • plugins/OAuth2/Application/Ports/ResourceOwnerVerifier.php
  • plugins/OAuth2/Application/Ports/ScopeStore.php
  • plugins/OAuth2/Application/Ports/UserInfoProvider.php
  • plugins/OAuth2/Application/Services/AuthorizationRequest.php
  • plugins/OAuth2/Application/Services/AuthorizationService.php
  • plugins/OAuth2/Application/Services/DeviceService.php
  • plugins/OAuth2/Application/Services/IntrospectionService.php
  • plugins/OAuth2/Application/Services/ScopeRegistry.php
  • plugins/OAuth2/Application/Services/ScopeValidator.php
  • plugins/OAuth2/Application/Services/TokenIssuer.php
  • plugins/OAuth2/Application/Services/TokenService.php
  • plugins/OAuth2/Domain/Entities/AuthCode.php
  • plugins/OAuth2/Domain/Entities/Client.php
  • plugins/OAuth2/Domain/Entities/DeviceCode.php
  • plugins/OAuth2/Domain/Entities/RefreshToken.php
  • plugins/OAuth2/Domain/Exceptions/OAuthException.php
  • plugins/OAuth2/Domain/ValueObjects/GrantType.php
  • plugins/OAuth2/Domain/ValueObjects/Pkce.php
  • plugins/OAuth2/Infrastructure/Cli/CreateClientCommand.php
  • plugins/OAuth2/Infrastructure/Cli/ListClientsCommand.php
  • plugins/OAuth2/Infrastructure/Cli/PruneCommand.php
  • plugins/OAuth2/Infrastructure/Cli/RevokeClientCommand.php
  • plugins/OAuth2/Infrastructure/Cli/RotateClientSecretCommand.php
  • plugins/OAuth2/Infrastructure/Http/Concerns/SpeaksOAuth.php
  • plugins/OAuth2/Infrastructure/Http/Controllers/AuthorizationController.php
  • plugins/OAuth2/Infrastructure/Http/Controllers/AuthorizedTokenController.php
  • plugins/OAuth2/Infrastructure/Http/Controllers/ClientController.php
  • plugins/OAuth2/Infrastructure/Http/Controllers/DeviceController.php
  • plugins/OAuth2/Infrastructure/Http/Controllers/DeviceVerificationController.php
  • plugins/OAuth2/Infrastructure/Http/Controllers/DiscoveryController.php
  • plugins/OAuth2/Infrastructure/Http/Controllers/IntrospectionController.php
  • plugins/OAuth2/Infrastructure/Http/Controllers/JwksController.php
  • plugins/OAuth2/Infrastructure/Http/Controllers/ScopeController.php
  • plugins/OAuth2/Infrastructure/Http/Controllers/TokenController.php
  • plugins/OAuth2/Infrastructure/Http/Controllers/UserInfoController.php
  • plugins/OAuth2/Infrastructure/Identity/SubjectUserInfoProvider.php
  • plugins/OAuth2/Infrastructure/Identity/UserResourceOwnerVerifier.php
  • plugins/OAuth2/Infrastructure/Persistence/AuthCodeRepository.php
  • plugins/OAuth2/Infrastructure/Persistence/ClientRepository.php
  • plugins/OAuth2/Infrastructure/Persistence/DeviceCodeRepository.php
  • plugins/OAuth2/Infrastructure/Persistence/RefreshTokenRepository.php
  • plugins/OAuth2/Infrastructure/Persistence/ScopeRepository.php
  • plugins/OAuth2/Provider.php
  • plugins/OAuth2/database/migrations/.gitkeep
  • plugins/OAuth2/database/migrations/2026_06_27_000010_create_oauth_clients_table.php
  • plugins/OAuth2/database/migrations/2026_06_27_000011_create_oauth_auth_codes_table.php
  • plugins/OAuth2/database/migrations/2026_06_27_000012_create_oauth_refresh_tokens_table.php
  • plugins/OAuth2/database/migrations/2026_06_27_000013_create_oauth_scopes_table.php
  • plugins/OAuth2/database/migrations/2026_06_27_000014_create_oauth_device_codes_table.php
  • plugins/OAuth2/database/migrations/2026_07_04_000001_add_owner_to_oauth_clients.php
  • plugins/OAuth2/database/tenant-template/2026_06_27_000010_create_oauth_clients_table.php
  • plugins/OAuth2/database/tenant-template/2026_06_27_000011_create_oauth_auth_codes_table.php
  • plugins/OAuth2/database/tenant-template/2026_06_27_000012_create_oauth_refresh_tokens_table.php
  • plugins/OAuth2/database/tenant-template/2026_06_27_000013_create_oauth_scopes_table.php
  • plugins/OAuth2/database/tenant-template/2026_06_27_000014_create_oauth_device_codes_table.php
  • plugins/OAuth2/database/tenant-template/2026_07_04_000001_add_owner_to_oauth_clients.php
  • plugins/OAuth2/module.json
  • plugins/OAuth2/resources/views/consent.php
  • plugins/OAuth2/resources/views/device.php
  • plugins/Pageflow/API/Contracts/PageflowSharerContract.php
  • plugins/Pageflow/Cli/PageflowTypesCommand.php
  • plugins/Pageflow/Http/CallablePageflowSharer.php
  • plugins/Pageflow/Http/CompositePageflowSharer.php
  • plugins/Pageflow/Http/PageflowAuth.php
  • plugins/Pageflow/Http/PageflowChannel.php
  • plugins/Pageflow/Http/PageflowEndpointsController.php
  • plugins/Pageflow/Http/PageflowPage.php
  • plugins/Pageflow/Http/PageflowResponder.php
  • plugins/Pageflow/Http/PageflowShares.php
  • plugins/Pageflow/Http/PageflowStage.php
  • plugins/Pageflow/Http/PageflowStream.php
  • plugins/Pageflow/Http/RegistryPageflowSharer.php
  • plugins/Pageflow/Provider.php
  • plugins/Pageflow/README.md
  • plugins/Pageflow/Support/helpers.php
  • plugins/Pageflow/module.json
  • plugins/Pageflow/resources/layouts/app.php
  • plugins/Pageflow/ui/core/csrf.ts
  • plugins/Pageflow/ui/core/csrfRetry.ts
  • plugins/Pageflow/ui/core/encryption.ts
  • plugins/Pageflow/ui/core/eventHandler/events.ts
  • plugins/Pageflow/ui/core/eventHandler/index.ts
  • plugins/Pageflow/ui/core/files.ts
  • plugins/Pageflow/ui/core/formData.ts
  • plugins/Pageflow/ui/core/head/index.ts
  • plugins/Pageflow/ui/core/history.ts
  • plugins/Pageflow/ui/core/http/request.ts
  • plugins/Pageflow/ui/core/http/requestParams.ts
  • plugins/Pageflow/ui/core/http/requestStream.ts
  • plugins/Pageflow/ui/core/http/response.ts
  • plugins/Pageflow/ui/core/index.ts
  • plugins/Pageflow/ui/core/initialVisit.ts
  • plugins/Pageflow/ui/core/modal.ts
  • plugins/Pageflow/ui/core/navigationType.ts
  • plugins/Pageflow/ui/core/objectUtils.ts
  • plugins/Pageflow/ui/core/page.ts
  • plugins/Pageflow/ui/core/poll/index.ts
  • plugins/Pageflow/ui/core/poll/polls.ts
  • plugins/Pageflow/ui/core/precognition.ts
  • plugins/Pageflow/ui/core/prefetched.ts
  • plugins/Pageflow/ui/core/progress-component.ts
  • plugins/Pageflow/ui/core/progress.ts
  • plugins/Pageflow/ui/core/queue.ts
  • plugins/Pageflow/ui/core/reactive.ts
  • plugins/Pageflow/ui/core/router.ts
  • plugins/Pageflow/ui/core/scroll.ts
  • plugins/Pageflow/ui/core/server.ts
  • plugins/Pageflow/ui/core/serviceWorker.ts
  • plugins/Pageflow/ui/core/sessionStorage.ts
  • plugins/Pageflow/ui/core/shouldIntercept.ts
  • plugins/Pageflow/ui/core/time.ts
  • plugins/Pageflow/ui/core/types.ts
  • plugins/Pageflow/ui/core/url.ts
  • plugins/Pageflow/ui/index.ts
  • plugins/Pageflow/ui/pageflow-sw.js
  • plugins/Pageflow/ui/react/App.tsx
  • plugins/Pageflow/ui/react/Can.tsx
  • plugins/Pageflow/ui/react/Deferred.tsx
  • plugins/Pageflow/ui/react/Form.tsx
  • plugins/Pageflow/ui/react/Head.tsx
  • plugins/Pageflow/ui/react/HeadContext.tsx
  • plugins/Pageflow/ui/react/Link.tsx
  • plugins/Pageflow/ui/react/PageContext.tsx
  • plugins/Pageflow/ui/react/WhenVisible.tsx
  • plugins/Pageflow/ui/react/createPageflowApp.tsx
  • plugins/Pageflow/ui/react/index.tsx
  • plugins/Pageflow/ui/react/server.ts
  • plugins/Pageflow/ui/react/useAuth.tsx
  • plugins/Pageflow/ui/react/useDirtyGuard.tsx
  • plugins/Pageflow/ui/react/useFlushOnIdentityChange.tsx
  • plugins/Pageflow/ui/react/useForm.tsx
  • plugins/Pageflow/ui/react/usePage.tsx
  • plugins/Pageflow/ui/react/usePoll.tsx
  • plugins/Pageflow/ui/react/usePrecognition.tsx
  • plugins/Pageflow/ui/react/usePrefetch.tsx
  • plugins/Pageflow/ui/react/useReactiveProps.tsx
  • plugins/Pageflow/ui/react/useRemember.tsx
  • plugins/Pageflow/ui/tests/csrf.test.ts
  • plugins/Pageflow/ui/tests/precognition.test.ts
  • plugins/Pageflow/ui/tests/queue.test.ts
  • plugins/Pageflow/ui/tests/reactive.test.ts
  • plugins/Pageflow/ui/tests/resolvePageComponent.test.ts
  • plugins/Pageflow/ui/tests/sameOrigin.test.ts
  • plugins/Pageflow/ui/tests/url.test.ts
  • plugins/Pageflow/ui/ui.json
  • plugins/Pageflow/ui/vitest.config.ts
  • plugins/RedisCache/Infrastructure/RedisCacheAdapter.php
  • plugins/RedisCache/Infrastructure/RedisConnection.php
  • plugins/RedisCache/Infrastructure/RedisQueueAdapter.php
  • plugins/RedisCache/Provider.php
  • plugins/RedisCache/module.json
  • plugins/SecurityFilters/Infrastructure/Http/Stages/ApiRateLimitStage.php
  • plugins/SecurityFilters/Infrastructure/Http/Stages/HmacSignedStage.php
  • plugins/SecurityFilters/Infrastructure/Http/Stages/RequireAuthStage.php
  • plugins/SecurityFilters/Infrastructure/Http/Stages/SecurityHeadersStage.php
  • plugins/SecurityFilters/Infrastructure/Http/Stages/ShieldStage.php
  • plugins/SecurityFilters/Provider.php
  • plugins/SecurityFilters/module.json
  • plugins/Session/Infrastructure/Handlers/ArraySessionHandler.php
  • plugins/Session/Infrastructure/Handlers/Contracts/CookieBackedHandler.php
  • plugins/Session/Infrastructure/Handlers/CookieSessionConfig.php
  • plugins/Session/Infrastructure/Handlers/CookieSessionHandler.php
  • plugins/Session/Infrastructure/Handlers/FileSessionHandler.php
  • plugins/Session/Infrastructure/Http/StartSessionStage.php
  • plugins/Session/Infrastructure/Store.php
  • plugins/Session/Provider.php
  • plugins/Session/module.json
  • plugins/Settings/API/Contracts/SettingsServiceContract.php
  • plugins/Settings/API/DTOs/CompanySettingsDTO.php
  • plugins/Settings/API/DTOs/ContactSettingsDTO.php
  • plugins/Settings/API/DTOs/EmailProviderSettingsDTO.php
  • plugins/Settings/API/DTOs/EmailSettingsDTO.php
  • plugins/Settings/API/DTOs/SystemSettingsDTO.php
  • plugins/Settings/Application/Services/SettingsService.php
  • plugins/Settings/Domain/Entities/TenantSettings.php
  • plugins/Settings/Domain/ValueObjects/SettingsSection.php
  • plugins/Settings/Infrastructure/Http/SettingsController.php
  • plugins/Settings/Infrastructure/Persistence/SettingsRepository.php
  • plugins/Settings/Provider.php
  • plugins/Settings/README.md
  • plugins/Settings/database/migrations/2026_06_25_000001_create_tenant_settings_company_table.php
  • plugins/Settings/database/migrations/2026_06_25_000002_create_tenant_settings_contact_table.php
  • plugins/Settings/database/migrations/2026_06_25_000003_create_tenant_settings_email_table.php
  • plugins/Settings/database/migrations/2026_06_25_000004_create_tenant_settings_email_providers_table.php
  • plugins/Settings/database/migrations/2026_06_25_000005_create_tenant_settings_system_table.php
  • plugins/Settings/module.json
  • plugins/SiteSEO/API/Contracts/SeoServiceContract.php
  • plugins/SiteSEO/API/IntegrationEvents/UrlPublishedIntegrationEvent.php
  • plugins/SiteSEO/Application/Jobs/IndexNowJob.php
  • plugins/SiteSEO/Application/Listeners/EnqueueIndexNowListener.php
  • plugins/SiteSEO/Application/Services/SeoService.php
  • plugins/SiteSEO/BaseObject.php
  • plugins/SiteSEO/Channel.php
  • plugins/SiteSEO/Exceptions/SeoException.php
  • plugins/SiteSEO/Exceptions/SitemapException.php
  • plugins/SiteSEO/Helpers/Escape.php
  • plugins/SiteSEO/Indexing.php
  • plugins/SiteSEO/Infrastructure/Gateways/SearchEngineGateway.php
  • plugins/SiteSEO/Infrastructure/Http/SeoController.php
  • plugins/SiteSEO/Interfaces/SchemaInterface.php
  • plugins/SiteSEO/Interfaces/SeoInterface.php
  • plugins/SiteSEO/Interfaces/SitemapBuilderInterface.php
  • plugins/SiteSEO/Interfaces/SitemapIndexInterface.php
  • plugins/SiteSEO/Interfaces/SitemapInterface.php
  • plugins/SiteSEO/OpenGraph.php
  • plugins/SiteSEO/Ping.php
  • plugins/SiteSEO/Property.php
  • plugins/SiteSEO/Provider.php
  • plugins/SiteSEO/RobotsTxtEditor.php
  • plugins/SiteSEO/RobotsTxtValidator.php
  • plugins/SiteSEO/Schema.php
  • plugins/SiteSEO/Schema/Thing.php
  • plugins/SiteSEO/Schema/Things/ContactPoint.php
  • plugins/SiteSEO/Schema/Things/Offer.php
  • plugins/SiteSEO/Schema/Things/Organization.php
  • plugins/SiteSEO/Schema/Things/Product.php
  • plugins/SiteSEO/Schema/Things/WebPage.php
  • plugins/SiteSEO/Sitemap.php
  • plugins/SiteSEO/Sitemap/LinksBuilder.php
  • plugins/SiteSEO/Sitemap/NewsBuilder.php
  • plugins/SiteSEO/Sitemap/SitemapBuilder.php
  • plugins/SiteSEO/Sitemap/SitemapIndex.php
  • plugins/SiteSEO/Sitemap/SitemapParser.php
  • plugins/SiteSEO/StructuredProperties/Audio.php
  • plugins/SiteSEO/StructuredProperties/Image.php
  • plugins/SiteSEO/StructuredProperties/StructuredProperty.php
  • plugins/SiteSEO/StructuredProperties/Video.php
  • plugins/SiteSEO/Support/ConditionalCallProxy.php
  • plugins/SiteSEO/Support/HasConditionalCalls.php
  • plugins/SiteSEO/Twitter.php
  • plugins/SiteSEO/TwitterProperty.php
  • plugins/SiteSEO/TwitterType.php
  • plugins/SiteSEO/Type.php
  • plugins/SiteSEO/Types/Article.php
  • plugins/SiteSEO/Types/Book.php
  • plugins/SiteSEO/Types/Music/Album.php
  • plugins/SiteSEO/Types/Music/Playlist.php
  • plugins/SiteSEO/Types/Music/RadioStation.php
  • plugins/SiteSEO/Types/Music/Song.php
  • plugins/SiteSEO/Types/Profile.php
  • plugins/SiteSEO/Types/Twitter/App.php
  • plugins/SiteSEO/Types/Twitter/Player.php
  • plugins/SiteSEO/Types/Twitter/Summary.php
  • plugins/SiteSEO/Types/Twitter/SummaryLargeImage.php
  • plugins/SiteSEO/Types/Video/Episode.php
  • plugins/SiteSEO/Types/Video/Movie.php
  • plugins/SiteSEO/Types/Video/Other.php
  • plugins/SiteSEO/Types/Video/TvShow.php
  • plugins/SiteSEO/Types/Website.php
  • plugins/SiteSEO/XRobotsTag.php
  • plugins/SiteSEO/module.json
  • plugins/SocialAuth/API/Contracts/SocialAuthServiceContract.php
  • plugins/SocialAuth/Application/Services/SocialAuthService.php
  • plugins/SocialAuth/Application/Services/SocialLoginService.php
  • plugins/SocialAuth/Infrastructure/Gateways/ProviderTokenGateway.php
  • plugins/SocialAuth/Infrastructure/Http/Controllers/SocialAuthController.php
  • plugins/SocialAuth/Infrastructure/Persistence/SocialIdentityRepository.php
  • plugins/SocialAuth/Provider.php
  • plugins/SocialAuth/Socialite/AbstractUser.php
  • plugins/SocialAuth/Socialite/Http/RedirectResponse.php
  • plugins/SocialAuth/Socialite/Http/Request.php
  • plugins/SocialAuth/Socialite/Http/Session.php
  • plugins/SocialAuth/Socialite/One/AbstractProvider.php
  • plugins/SocialAuth/Socialite/One/MissingTemporaryCredentialsException.php
  • plugins/SocialAuth/Socialite/One/MissingVerifierException.php
  • plugins/SocialAuth/Socialite/One/TwitterProvider.php
  • plugins/SocialAuth/Socialite/One/User.php
  • plugins/SocialAuth/Socialite/Ports/Factory.php
  • plugins/SocialAuth/Socialite/Ports/Provider.php
  • plugins/SocialAuth/Socialite/Ports/User.php
  • plugins/SocialAuth/Socialite/SocialiteManager.php
  • plugins/SocialAuth/Socialite/Support/Config.php
  • plugins/SocialAuth/Socialite/Support/Manager.php
  • plugins/SocialAuth/Socialite/Support/helpers.php
  • plugins/SocialAuth/Socialite/Two/AbstractProvider.php
  • plugins/SocialAuth/Socialite/Two/BitbucketProvider.php
  • plugins/SocialAuth/Socialite/Two/FacebookProvider.php
  • plugins/SocialAuth/Socialite/Two/GithubProvider.php
  • plugins/SocialAuth/Socialite/Two/GitlabProvider.php
  • plugins/SocialAuth/Socialite/Two/GoogleProvider.php
  • plugins/SocialAuth/Socialite/Two/InvalidStateException.php
  • plugins/SocialAuth/Socialite/Two/LinkedInOpenIdProvider.php
  • plugins/SocialAuth/Socialite/Two/LinkedInProvider.php
  • plugins/SocialAuth/Socialite/Two/ProviderInterface.php
  • plugins/SocialAuth/Socialite/Two/SlackOpenIdProvider.php
  • plugins/SocialAuth/Socialite/Two/SlackProvider.php
  • plugins/SocialAuth/Socialite/Two/Token.php
  • plugins/SocialAuth/Socialite/Two/TwitterProvider.php
  • plugins/SocialAuth/Socialite/Two/User.php
  • plugins/SocialAuth/Socialite/Two/XProvider.php
  • plugins/SocialAuth/database/migrations/.gitkeep
  • plugins/SocialAuth/database/tenant-template/2026_07_12_000001_create_social_identities_table.php
  • plugins/SocialAuth/module.json
  • plugins/Storage/Infrastructure/LocalStorageAdapter.php
  • plugins/Storage/Infrastructure/S3StorageAdapter.php
  • plugins/Storage/Provider.php
  • plugins/Storage/Support/helpers.php
  • plugins/Storage/config/storage.php
  • plugins/Storage/module.json
  • plugins/Tenancy/API/Contracts/InvitationServiceContract.php
  • plugins/Tenancy/API/Contracts/MembershipServiceContract.php
  • plugins/Tenancy/API/Contracts/TenantAdminServiceContract.php
  • plugins/Tenancy/API/Contracts/TenantConnectionResolverContract.php
  • plugins/Tenancy/API/Contracts/TenantHostRegistryContract.php
  • plugins/Tenancy/API/Contracts/TenantHostServiceContract.php
  • plugins/Tenancy/API/Contracts/TenantRegistryContract.php
  • plugins/Tenancy/API/DTOs/HostVerificationInstructions.php
  • plugins/Tenancy/API/DTOs/HostVerificationResult.php
  • plugins/Tenancy/API/DTOs/InvitationResult.php
  • plugins/Tenancy/API/DTOs/TenantDetail.php
  • plugins/Tenancy/API/DTOs/TenantSelection.php
  • plugins/Tenancy/API/DTOs/TenantSummary.php
  • plugins/Tenancy/API/IntegrationEvents/HostUnverifiedIntegrationEvent.php
  • plugins/Tenancy/API/IntegrationEvents/HostVerifiedIntegrationEvent.php
  • plugins/Tenancy/Application/Listeners/AssignTenantMembershipOnUserRegistered.php
  • plugins/Tenancy/Application/Ports/AuditReader.php
  • plugins/Tenancy/Application/Ports/AuditSink.php
  • plugins/Tenancy/Application/Ports/AuditWriter.php
  • plugins/Tenancy/Application/Ports/DnsResolver.php
  • plugins/Tenancy/Application/Ports/InvitationStore.php
  • plugins/Tenancy/Application/Ports/MembershipReader.php
  • plugins/Tenancy/Application/Ports/MembershipWriter.php
  • plugins/Tenancy/Application/Ports/TenantHostStore.php
  • plugins/Tenancy/Application/Ports/TenantProvisioner.php
  • plugins/Tenancy/Application/Ports/TenantWriteStore.php
  • plugins/Tenancy/Application/Services/AuditService.php
  • plugins/Tenancy/Application/Services/InvitationService.php
  • plugins/Tenancy/Application/Services/MembershipService.php
  • plugins/Tenancy/Application/Services/TenantAdminService.php
  • plugins/Tenancy/Application/Services/TenantHostService.php
  • plugins/Tenancy/Domain/Entities/AuditEntry.php
  • plugins/Tenancy/Domain/Entities/Invitation.php
  • plugins/Tenancy/Domain/Entities/Membership.php
  • plugins/Tenancy/Domain/Entities/Tenant.php
  • plugins/Tenancy/Domain/Entities/TenantHost.php
  • plugins/Tenancy/Domain/Exceptions/HostConflictException.php
  • plugins/Tenancy/Domain/Exceptions/HostNotFoundException.php
  • plugins/Tenancy/Domain/Exceptions/HostQuotaExceededException.php
  • plugins/Tenancy/Domain/Exceptions/InvalidHostnameException.php
  • plugins/Tenancy/Domain/Exceptions/InvalidInvitationException.php
  • plugins/Tenancy/Domain/Exceptions/NotAMemberException.php
  • plugins/Tenancy/Domain/Exceptions/TenantUnavailableException.php
  • plugins/Tenancy/Domain/Exceptions/UnknownTenantException.php
  • plugins/Tenancy/Domain/ValueObjects/HostStatus.php
  • plugins/Tenancy/Domain/ValueObjects/Hostname.php
  • plugins/Tenancy/Domain/ValueObjects/InvitationStatus.php
  • plugins/Tenancy/Domain/ValueObjects/MembershipStatus.php
  • plugins/Tenancy/Domain/ValueObjects/TenantStatus.php
  • plugins/Tenancy/Infrastructure/Cli/AddTenantHostCommand.php
  • plugins/Tenancy/Infrastructure/Cli/Concerns/ManagesTenantDatabase.php
  • plugins/Tenancy/Infrastructure/Cli/CreateTenantCommand.php
  • plugins/Tenancy/Infrastructure/Cli/DeleteTenantCommand.php
  • plugins/Tenancy/Infrastructure/Cli/MigrateTenantsCommand.php
  • plugins/Tenancy/Infrastructure/Cli/RememberTenantCommand.php
  • plugins/Tenancy/Infrastructure/Dns/SystemDnsResolver.php
  • plugins/Tenancy/Infrastructure/Http/Controllers/InvitationController.php
  • plugins/Tenancy/Infrastructure/Http/Controllers/TenantAdminController.php
  • plugins/Tenancy/Infrastructure/Http/Controllers/TenantController.php
  • plugins/Tenancy/Infrastructure/Http/Controllers/TenantHostController.php
  • plugins/Tenancy/Infrastructure/Http/Controllers/TenantPageController.php
  • plugins/Tenancy/Infrastructure/Http/Identification/ClaimTenantIdentifier.php
  • plugins/Tenancy/Infrastructure/Http/Identification/DomainTenantIdentifier.php
  • plugins/Tenancy/Infrastructure/Http/Identification/HostTenantIdentifier.php
  • plugins/Tenancy/Infrastructure/Http/Identification/TenantIdentifier.php
  • plugins/Tenancy/Infrastructure/Http/Stages/RequireTenantStage.php
  • plugins/Tenancy/Infrastructure/Http/Stages/TenantContextStage.php
  • plugins/Tenancy/Infrastructure/Persistence/AuditLogRepository.php
  • plugins/Tenancy/Infrastructure/Persistence/AuditTrail.php
  • plugins/Tenancy/Infrastructure/Persistence/InvitationRepository.php
  • plugins/Tenancy/Infrastructure/Persistence/MembershipRepository.php
  • plugins/Tenancy/Infrastructure/Persistence/TenantAdminRepository.php
  • plugins/Tenancy/Infrastructure/Persistence/TenantHostRegistry.php
  • plugins/Tenancy/Infrastructure/Persistence/TenantHostRepository.php
  • plugins/Tenancy/Infrastructure/Persistence/TenantRegistry.php
  • plugins/Tenancy/Infrastructure/Provisioning/DdlTenantProvisioner.php
  • plugins/Tenancy/Infrastructure/TenantConnectionResolver.php
  • plugins/Tenancy/Provider.php
  • plugins/Tenancy/README.md
  • plugins/Tenancy/Support/TenantsFile.php
  • plugins/Tenancy/Support/Token.php
  • plugins/Tenancy/database/migrations/2026_06_22_000001_create_tenants_table.php
  • plugins/Tenancy/database/migrations/2026_06_22_000002_create_user_tenants_table.php
  • plugins/Tenancy/database/migrations/2026_06_22_000003_create_tenant_invitations_table.php
  • plugins/Tenancy/database/migrations/2026_06_22_000006_create_tenant_hosts_table.php
  • plugins/Tenancy/database/tenant-template/.gitkeep
  • plugins/Tenancy/module.json
  • plugins/Tenancy/resources/views/hosts/index.php
  • plugins/Tenancy/resources/views/layouts/app.php
  • plugins/Tenancy/resources/views/tenants/create.php
  • plugins/Tenancy/resources/views/tenants/edit.php
  • plugins/Tenancy/resources/views/tenants/index.php
  • plugins/Tenancy/resources/views/tenants/manage.php
  • plugins/Tenancy/ui/README.md
  • plugins/Tenancy/ui/admin/Pages/Tenant/Create.tsx
  • plugins/Tenancy/ui/admin/Pages/Tenant/Edit.tsx
  • plugins/Tenancy/ui/admin/Pages/Tenant/Manage.tsx
  • plugins/Tenancy/ui/components/StatusBadge.tsx
  • plugins/Tenancy/ui/components/TenantBadge.tsx
  • plugins/Tenancy/ui/index.ts
  • plugins/Tenancy/ui/lib/client.ts
  • plugins/Tenancy/ui/site/Pages/Tenant/Hosts.tsx
  • plugins/Tenancy/ui/site/Pages/Tenant/Index.tsx
  • plugins/Tenancy/ui/ui.json
  • plugins/User/API/Contracts/.gitkeep
  • plugins/User/API/Contracts/TenantProfileReaderContract.php
  • plugins/User/API/Contracts/UserServiceContract.php
  • plugins/User/API/DTOs/FeedbackPage.php
  • plugins/User/API/DTOs/ListFeedbackQuery.php
  • plugins/User/API/DTOs/ListUsersQuery.php
  • plugins/User/API/DTOs/RegisterUserDTO.php
  • plugins/User/API/DTOs/SubmitFeedbackDTO.php
  • plugins/User/API/DTOs/UpdateNotificationPreferencesDTO.php
  • plugins/User/API/DTOs/UpdatePreferencesDTO.php
  • plugins/User/API/DTOs/UpdatePrivacyDTO.php
  • plugins/User/API/DTOs/UpdateProfileDTO.php
  • plugins/User/API/DTOs/UpdateUserDTO.php
  • plugins/User/API/DTOs/UserDTO.php
  • plugins/User/API/DTOs/UserPage.php
  • plugins/User/API/DTOs/VerifyEmailDTO.php
  • plugins/User/API/DTOs/VerifyEmailResult.php
  • plugins/User/API/IntegrationEvents/FeedbackSubmittedIntegrationEvent.php
  • plugins/User/API/IntegrationEvents/GenericIntegrationEvent.php
  • plugins/User/API/IntegrationEvents/UserDeletedIntegrationEvent.php
  • plugins/User/API/IntegrationEvents/UserRegisteredIntegrationEvent.php
  • plugins/User/API/IntegrationEvents/UserUpdatedIntegrationEvent.php
  • plugins/User/Application/Ports/BreachChecker.php
  • plugins/User/Application/Ports/FeedbackStore.php
  • plugins/User/Application/Ports/OutboxPort.php
  • plugins/User/Application/Ports/UserStore.php
  • plugins/User/Application/Services/.gitkeep
  • plugins/User/Application/Services/FeedbackService.php
  • plugins/User/Application/Services/OutboxRelayService.php
  • plugins/User/Application/Services/TenantProfileProvisioner.php
  • plugins/User/Application/Services/UserService.php
  • plugins/User/Application/Services/UserSettingsService.php
  • plugins/User/Domain/.gitkeep
  • plugins/User/Domain/Entities/FeedbackEntry.php
  • plugins/User/Domain/Entities/User.php
  • plugins/User/Domain/Entities/UserNotificationPreferences.php
  • plugins/User/Domain/Entities/UserPreferences.php
  • plugins/User/Domain/Entities/UserPrivacySettings.php
  • plugins/User/Domain/Entities/UserProfile.php
  • plugins/User/Domain/Events/UserDeletedDomainEvent.php
  • plugins/User/Domain/Events/UserRegisteredDomainEvent.php
  • plugins/User/Domain/Events/UserUpdatedDomainEvent.php
  • plugins/User/Domain/Exceptions/DuplicateUserException.php
  • plugins/User/Domain/ValueObjects/Email.php
  • plugins/User/Domain/ValueObjects/FeedbackCategory.php
  • plugins/User/Domain/ValueObjects/FeedbackId.php
  • plugins/User/Domain/ValueObjects/FeedbackMessage.php
  • plugins/User/Domain/ValueObjects/FeedbackRating.php
  • plugins/User/Domain/ValueObjects/FeedbackStatus.php
  • plugins/User/Domain/ValueObjects/PasswordPolicy.php
  • plugins/User/Domain/ValueObjects/ProfileVisibility.php
  • plugins/User/Domain/ValueObjects/Theme.php
  • plugins/User/Domain/ValueObjects/Ulid.php
  • plugins/User/Domain/ValueObjects/UserId.php
  • plugins/User/Domain/ValueObjects/Username.php
  • plugins/User/Infrastructure/Audit/AuditLogger.php
  • plugins/User/Infrastructure/Cli/RelayUserOutboxCommand.php
  • plugins/User/Infrastructure/Gateways/NullBreachChecker.php
  • plugins/User/Infrastructure/Gateways/PwnedPasswordGateway.php
  • plugins/User/Infrastructure/Http/.gitkeep
  • plugins/User/Infrastructure/Http/Controllers/FeedbackController.php
  • plugins/User/Infrastructure/Http/Controllers/UserController.php
  • plugins/User/Infrastructure/Http/Controllers/UserFlowController.php
  • plugins/User/Infrastructure/Http/Controllers/UserPageController.php
  • plugins/User/Infrastructure/Http/Controllers/UserSettingsController.php
  • plugins/User/Infrastructure/Listeners/ProvisionTenantProfileListener.php
  • plugins/User/Infrastructure/Outbox/OutboxRelay.php
  • plugins/User/Infrastructure/Outbox/OutboxWriter.php
  • plugins/User/Infrastructure/Persistence/FeedbackRepository.php
  • plugins/User/Infrastructure/Persistence/OutboxRepository.php
  • plugins/User/Infrastructure/Persistence/UserRepository.php
  • plugins/User/Infrastructure/Persistence/UserSettingsRepository.php
  • plugins/User/Provider.php
  • plugins/User/README.md
  • plugins/User/config/user.php
  • plugins/User/database/factories/UserFactory.php
  • plugins/User/database/migrations/2026_01_01_000000_create_user_table.php
  • plugins/User/database/migrations/2026_01_01_000001_create_user_outbox_table.php
  • plugins/User/database/migrations/2026_01_01_000002_add_email_verification_token_to_users.php
  • plugins/User/database/migrations/2026_07_19_000001_add_platform_admin_to_users.php
  • plugins/User/database/seeders/UserSeeder.php
  • plugins/User/database/tenant-template/2026_06_29_000001_create_user_profiles_table.php
  • plugins/User/database/tenant-template/2026_06_29_000002_create_user_privacy_settings_table.php
  • plugins/User/database/tenant-template/2026_06_29_000003_create_user_preferences_table.php
  • plugins/User/database/tenant-template/2026_06_29_000004_create_user_notification_preferences_table.php
  • plugins/User/database/tenant-template/2026_06_29_000005_create_user_feedback_table.php
  • plugins/User/module.json
  • plugins/User/resources/views/account/feedback.php
  • plugins/User/resources/views/account/settings.php
  • plugins/User/resources/views/account/verify.php
  • plugins/User/resources/views/emails/verify.php
  • plugins/User/resources/views/layouts/app.php
  • plugins/User/resources/views/user.php
  • plugins/User/resources/views/users/create.php
  • plugins/User/resources/views/users/edit.php
  • plugins/User/resources/views/users/index.php
  • plugins/User/resources/views/users/show.php
  • plugins/User/ui/README.md
  • plugins/User/ui/admin/Pages/User/Index.tsx
  • plugins/User/ui/admin/Pages/User/Show.tsx
  • plugins/User/ui/components/UserBadge.tsx
  • plugins/User/ui/index.ts
  • plugins/User/ui/site/Pages/User/Profile.tsx
  • plugins/User/ui/site/Pages/User/Register.tsx
  • plugins/User/ui/site/Pages/User/VerifyEmail.tsx
  • plugins/User/ui/ui.json
  • plugins/Validation/AbstractDto.php
  • plugins/Validation/Provider.php
  • plugins/Validation/README.md
  • plugins/Validation/Rules/CommonRules.php
  • plugins/Validation/Rules/FinancialRules.php
  • plugins/Validation/Validator.php
  • plugins/Validation/config/validation.php
  • plugins/Validation/module.json
  • plugins/View/API/Contracts/ViewDecoratorContract.php
  • plugins/View/API/Contracts/ViewRendererContract.php
  • plugins/View/Exceptions/ViewException.php
  • plugins/View/Infrastructure/PhpViewRenderer.php
  • plugins/View/Infrastructure/SidebarManager.php
  • plugins/View/Provider.php
  • plugins/View/module.json
  • plugins/ViteManifest/API/Contracts/ViteContract.php
  • plugins/ViteManifest/Exceptions/ViteManifestNotFoundException.php
  • plugins/ViteManifest/Infrastructure/ManifestReader.php
  • plugins/ViteManifest/Infrastructure/Vite.php
  • plugins/ViteManifest/Provider.php
  • plugins/ViteManifest/README.md
  • plugins/ViteManifest/Support/Html.php
  • plugins/ViteManifest/Support/helpers.php
  • plugins/ViteManifest/ViteConfig.php
  • plugins/ViteManifest/ViteFactory.php
  • plugins/ViteManifest/module.json
  • projects/Infrastructure/FileCache.php
  • projects/Infrastructure/FileLock.php
  • projects/Infrastructure/FileQueue.php
  • projects/Infrastructure/InMemoryCache.php
  • projects/Infrastructure/ProcessLocalLock.php
  • src/Kernel/Boot/BootPipeline.php
  • src/Kernel/Boot/ManifestReader.php
  • src/Kernel/Boot/Stages/CompileConfigManifestStage.php
  • src/Kernel/Boot/Stages/CompileLangManifestStage.php
  • src/Kernel/Boot/Stages/CompileRouteManifestStage.php
  • src/Kernel/Config/Repository.php
  • src/Kernel/Container/CoreContainer.php
  • src/Kernel/Events/EventBus.php
  • src/Kernel/Exceptions/HttpStatusAware.php
  • src/Kernel/Exceptions/LockTimeoutException.php
  • src/Kernel/Kernel.php
  • src/Kernel/Pipelines/Http/RouteMatcher.php
  • src/Kernel/Pipelines/Http/Stages/ErrorStage.php
  • src/Kernel/Pipelines/Worker/WorkerLoop.php
  • src/Kernel/Ports/AbstractLock.php
  • src/Kernel/Ports/CachePort.php
  • src/Kernel/Ports/ClockPort.php
  • src/Kernel/Ports/Lock.php
  • src/Kernel/Ports/LogLevel.php
  • src/Kernel/Ports/LoggerPort.php
  • src/Kernel/Ports/QueuePort.php
  • src/Kernel/Ports/SystemClock.php
  • src/Kernel/Routing/RouteParameter.php
  • src/Kernel/Routing/UrlGenerator.php
  • src/Kernel/Security/Layers/CsrfTokenLayer.php
  • src/Kernel/Security/SecurityGateway.php
  • src/Kernel/Support/helpers.php
  • src/System/GlobalKernelProjectScaffolder.php
  • templates/app/bootstrap/app.php
  • templates/app/worker/run.php
  • tests/Unit/Commands/MigrationCommandTestCase.php
  • tests/Unit/Database/Drivers/DatabaseConfigurationFactoryTest.php
  • tests/Unit/Database/Drivers/MySQLConfigurationTest.php
  • tests/Unit/Database/Drivers/PostgreSQLConfigurationTest.php
  • tests/Unit/Database/Drivers/SQLiteConfigurationTest.php
  • tests/Unit/Database/Drivers/SqlServerConfigurationTest.php
  • tests/Unit/Database/Exceptions/ConnectionExceptionTest.php
  • tests/Unit/Database/Persistence/ConnectionManagerTest.php
  • tests/Unit/Database/Persistence/MultiDriverDatabaseAdapterTest.php
  • tests/Unit/Database/Persistence/PooledDatabaseAdapterTest.php
  • tests/Unit/Database/Persistence/QueryLoggingTest.php
  • tests/Unit/Database/Pool/ConnectionPoolTest.php
  • tests/Unit/Database/Pool/PoolConfigurationTest.php
  • tests/Unit/Kernel/Boot/CompileLangManifestStageTest.php
  • tests/Unit/Kernel/Boot/RouteNameCompilationTest.php
  • tests/Unit/Kernel/Boot/RouteParameterValidationTest.php
  • tests/Unit/Kernel/Config/CompileConfigManifestStageTest.php
  • tests/Unit/Kernel/Config/RepositoryTest.php
  • tests/Unit/Kernel/Exceptions/HttpStatusAwareTest.php
  • tests/Unit/Kernel/Pipelines/Http/RouteMatcherTest.php
  • tests/Unit/Kernel/Ports/LockContractTest.php
  • tests/Unit/Kernel/Ports/LogLevelTest.php
  • tests/Unit/Kernel/Ports/QueuePortTest.php
  • tests/Unit/Kernel/Routing/UrlGeneratorTest.php
  • tests/Unit/Kernel/Security/CsrfTokenExpiryTest.php
  • tests/Unit/Plugins/Auth/AuthManagerExtensionTest.php
  • tests/Unit/Plugins/Auth/AuthManagerTest.php
  • tests/Unit/Plugins/Auth/AuthServiceTest.php
  • tests/Unit/Plugins/Auth/AuthUserProxyTokensTest.php
  • tests/Unit/Plugins/Auth/GuardTest.php
  • tests/Unit/Plugins/Auth/ModelUserProviderTenantGateTest.php
  • tests/Unit/Plugins/Auth/PasswordResetBrokerTest.php
  • tests/Unit/Plugins/Auth/PersonalAccessTokenControllerTest.php
  • tests/Unit/Plugins/Auth/RecallerTest.php
  • tests/Unit/Plugins/Auth/RefreshTokenServiceTest.php
  • tests/Unit/Plugins/Auth/ScopeInheritanceTest.php
  • tests/Unit/Plugins/Auth/SessionAuthStageRememberTest.php
  • tests/Unit/Plugins/Auth/StatefulSessionGuardTest.php
  • tests/Unit/Plugins/Auth/Support/FakeAuthService.php
  • tests/Unit/Plugins/Auth/Support/FakeSession.php
  • tests/Unit/Plugins/Auth/Support/FakeUserService.php
  • tests/Unit/Plugins/Auth/Support/RecordingDatabasePort.php
  • tests/Unit/Plugins/Auth/TokenDTOTest.php
  • tests/Unit/Plugins/Auth/TransientTokenControllerTest.php
  • tests/Unit/Plugins/Cookie/CookieJarTest.php
  • tests/Unit/Plugins/Crypto/AesEncrypterTest.php
  • tests/Unit/Plugins/Crypto/PasswordHasherTest.php
  • tests/Unit/Plugins/Edge/NginxConfigRendererTest.php
  • tests/Unit/Plugins/Edge/NginxSyntaxTest.php
  • tests/Unit/Plugins/Feedback/FeedbackServiceTest.php
  • tests/Unit/Plugins/Feedback/Support/FakeFeedbackStore.php
  • tests/Unit/Plugins/I18n/TranslatorTest.php
  • tests/Unit/Plugins/Mail/MailerTest.php
  • tests/Unit/Plugins/OAuth2/AuthorizedTokenManagementTest.php
  • tests/Unit/Plugins/OAuth2/ClientManagementTest.php
  • tests/Unit/Plugins/OAuth2/OAuth2FlowTest.php
  • tests/Unit/Plugins/OAuth2/OAuth2HttpIntegrationTest.php
  • tests/Unit/Plugins/OAuth2/OAuth2PersistenceIntegrationTest.php
  • tests/Unit/Plugins/OAuth2/ScopeRegistryTest.php
  • tests/Unit/Plugins/Pageflow/PageflowResponderTest.php
  • tests/Unit/Plugins/Session/CookieSessionHandlerTest.php
  • tests/Unit/Plugins/Session/InteractsWithSessionTest.php
  • tests/Unit/Plugins/Session/PreviousPageRecordingTest.php
  • tests/Unit/Plugins/Storage/LocalStorageAdapterTest.php
  • tests/Unit/Plugins/Storage/S3StorageAdapterTest.php
  • tests/Unit/Plugins/Tenancy/InvitationServiceTest.php
  • tests/Unit/Plugins/Tenancy/MembershipServiceTest.php
  • tests/Unit/Plugins/Tenancy/RequireTenantStageTest.php
  • tests/Unit/Plugins/Tenancy/RouteFilterCompositionTest.php
  • tests/Unit/Plugins/Tenancy/TenantAdminServiceTest.php
  • tests/Unit/Plugins/Tenancy/TenantHostServiceTest.php
  • tests/Unit/Plugins/User/FakeRequest.php
  • tests/Unit/Plugins/User/FeedbackServiceTest.php
  • tests/Unit/Plugins/User/Support/FakeCache.php
  • tests/Unit/Plugins/User/Support/FakeDatabasePort.php
  • tests/Unit/Plugins/User/Support/FakeFeedbackStore.php
  • tests/Unit/Plugins/User/Support/FakeHasher.php
  • tests/Unit/Plugins/User/Support/FakeOutbox.php
  • tests/Unit/Plugins/User/Support/FakeUserStore.php
  • tests/Unit/Plugins/User/Support/InMemoryDatabasePort.php
  • tests/Unit/Plugins/User/UserServiceTest.php
  • tests/Unit/Plugins/User/UserSettingsServiceTest.php
  • tests/Unit/Plugins/Validation/ValidatorTest.php
  • tools/build.zig
  • tools/ci/setup-zig.sh
  • tools/src/commands/cli.zig
  • tools/src/commands/discover.zig
  • tools/src/commands/new.zig
  • tools/src/commands/plugins.zig
  • tools/src/commands/run.zig
  • tools/src/commands/update.zig
  • tools/src/commands/upgrade.zig
  • tools/src/constants.zig
  • tools/src/lib/banner.zig
  • tools/src/lib/inspector/dashboard.zig
  • tools/src/lib/inspector/meminspector.zig
  • tools/src/lib/inspector/tracked.zig
  • tools/src/lib/memory.zig
  • tools/src/lib/plugin_git.zig
  • tools/src/lib/plugin_install.zig
  • tools/src/lib/plugin_lock.zig
  • tools/src/lib/plugin_registry.zig
  • tools/src/lib/plugin_sources.zig
  • tools/src/lib/semver.zig
  • tools/src/lib/util.zig
  • tools/src/main.zig
  • tools/src/stamp.zig
  • tools/src/templates/app/bootstrap/app.php

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

…ffolding

PR #107 was red on PHPStan with 50 findings. One was a genuine bug; the other 49
share a single root cause.

THE REAL BUG

ProcessLocalLock declared its registry as an anonymous `object{locks: ...}`
shape. PHPStan treats an object shape's properties as READ-ONLY, so all three
writes to $registry->locks were errors — against a type that described the
shape but never named the one class that satisfies it. Typed as InMemoryCache,
which is the sole owner of that table and the only caller, and is what the
docblock already said.

THE OTHER 49

projects/ ships opt-in base controllers and SEO helpers that bind to
Plugins\Cookie, Plugins\View and Plugins\SiteSEO by design (CLAUDE.md, "Base
controllers"). Since db63dae those plugins are deliberately NOT dependencies of
this repository — the kernel depends on no plugins — so the classes cannot
resolve here and every reference reports class.notFound.

Adding them back as require-dev would re-introduce exactly the coupling that
commit removed, and create a dev-dependency cycle (the plugins already
dev-require the kernel). So these nine files are excluded from analysis here,
listed FILE BY FILE rather than excluding projects/ wholesale — any new
project-layer code is still analysed, and the rest of projects/ (Support/Casting,
Support/Entity, Infrastructure, ApiController) stays covered: 48 of 57 files.

Each exclusion was verified to be caused by a plugin reference rather than
assumed. InteractsWithCsrf names no plugin itself but calls CookieJar methods
the sibling trait provides — checked by removing it from the list and
confirming the error returns.

This is a scoping decision, not a fix: the coupling is real and those files are
analysed where their dependencies exist, in a project that has installed the
plugins. Moving them out of the kernel repo is the actual resolution and wants
its own change.

PHPStan: no errors. 168 tests pass.

@Alshatri Alshatri left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done reviewing

@hakeemRash
hakeemRash merged commit de165c5 into main Aug 7, 2026
14 checks passed
craftdevscommunity pushed a commit that referenced this pull request Aug 7, 2026
Records the re-cut from main. v1.1.0-dev.2 was tagged from master before #107
merged, so its artefacts predate the PHPStan fixes; dev.3 is the same contents
built from the branch releases are supposed to come from.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants