Skip to content

release: 1.1.0-beta.1 — fix composer version stamping that broke every install - #108

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

release: 1.1.0-beta.1 — fix composer version stamping that broke every install#108
hakeemRash merged 152 commits into
mainfrom
master

Conversation

@hakeemRash

Copy link
Copy Markdown
Contributor

Releases 1.1.0-beta.1, the first pre-release of this line that actually installs.

Why the rename from -dev.N

The build stamps its version into composer.json, and 1.1.0-dev.N is not a
valid Composer version
— Composer's dev suffix takes no counter. composer install refuses to run at all on a version it cannot parse, so both
v1.1.0-dev.2 and v1.1.0-dev.3 unpacked and then failed to resolve
dependencies on every machine that took them:

"./composer.json" does not match the expected JSON schema:
 - version : Does not match the regex pattern ...

-beta.1 is Composer-valid, sorts above 1.0.21 and below a stable 1.1.0.

Fixes in this PR

  • The stamper now validates and skips rather than writing a version Composer
    rejects. The field is optional; a broken install is not. It deliberately does
    not rewrite the version into a Composer-friendly shape, which would make
    composer.json disagree with the tag it was built from.
  • It trimmed v from both ends, so any version ending in v lost it —
    1.1.0-dev became 1.1.0-de, the one pre-release form Composer accepts.
  • hkm-stamp is now an installed artifact. It previously existed only in
    .zig-cache under content-hashed paths, so verifying its behaviour meant
    guessing which copy was current — I tested a stale one and got misleading
    results.

Verification

Beyond the unit tests, this was checked end to end because the previous two
attempts passed their tests and still broke:

  • The validator was cross-checked against composer validate itself across 15
    version strings — zero disagreements.
  • A real .deb was built at 1.1.0-beta.1; the shipped composer.json carries
    the version, composer validate passes, and composer install --no-dev --dry-run — the exact command install.sh runs — completes with exit 0.

After merging

auto-release picks up 1.1.0-beta.1 from the CHANGELOG, tags it, and builds
and publishes it — no manual tagging. Then hkm upgrade will offer it and the
install will complete.

Known

v1.1.0-dev.2 and v1.1.0-dev.3 remain published with broken stamps. They
cannot be repaired (immutable releases) and their tags cannot be reused. Anyone
who took one can recover by upgrading to this release, or by removing the
version line from /opt/hkm-kernel/composer.json and re-running
install.sh.

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 August 6, 2026 04:03
- 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.
…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.
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.
…ry machine

`hkm upgrade` to v1.1.0-dev.2 failed on the target with:

    "./composer.json" does not match the expected JSON schema:
     - version : Does not match the regex pattern ...

The version was stamped straight from the git tag, and "1.1.0-dev.2" is not a
valid Composer version: Composer's `dev` suffix takes NO counter. "1.1.0-dev"
is accepted, "1.1.0-dev.2" and "1.1.0-dev2" are not. `composer install` ABORTS
on an unparseable version, so the package never resolved its dependencies —
the .deb installed and then failed to finish setting itself up.

The stamper now validates before writing and SKIPS when the version is not
something Composer accepts, printing why. The field is optional; a broken
install is not. It deliberately does not rewrite the version into a
Composer-friendly shape, which would make composer.json disagree with the tag
it was built from.

TWO BUGS FOUND WHILE VERIFYING

- main() trimmed the cutset " \t\r\nv" from BOTH ends, so any version ENDING in
  'v' lost it: "1.1.0-dev" arrived as "1.1.0-de" and was rejected — the one
  pre-release form Composer does accept. Only a leading 'v' is stripped now.
- hkm-stamp was never installed as an artifact, so the only copies lived in
  .zig-cache under content-hashed directories. Verifying its behaviour meant
  guessing which one was current, and I initially tested a stale binary. It is
  installed now.

Validated by cross-checking the validator against `composer validate` itself
across 15 version strings — zero disagreements, including every case above.
Renames the pre-release from -dev.N to -beta.1 because Composer will not accept
the former: its `dev` suffix takes no counter, so "1.1.0-dev.2" and
"1.1.0-dev.3" are unparseable. The build stamps the version into composer.json,
and `composer install` ABORTS on a version it cannot parse — so both previous
pre-releases unpacked and then failed to resolve their dependencies on every
machine that took them.

-beta.1 is Composer-valid, sorts above 1.0.21 and below a stable 1.1.0, and
means the version marker the native distribution relies on is present again
rather than being skipped by the stamper's new validation.

Verified by building an actual .deb at this version and checking the shipped
composer.json: the version is stamped, `composer validate` passes (previously a
schema error), and `composer install --no-dev --dry-run` — the exact command
install.sh runs — completes with exit 0.
@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: 0062d8b3-5ce2-4ec5-ab6b-9dc44950e128

📥 Commits

Reviewing files that changed from the base of the PR and between de165c5 and a296b7f.

⛔ 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.

@hakeemRash
hakeemRash merged commit bee4238 into main Aug 7, 2026
14 checks passed
craftdevscommunity pushed a commit that referenced this pull request Aug 7, 2026
… back-merge

The fix for the install-breaking version stamp reached neither branch. It was
committed to master as d51b215, then `648db50 Merge branch 'main' into master`
resolved the conflict in favour of main's older copy and dropped it, three
minutes before PR #108 merged — which is why that PR squashed to a commit
changing ZERO files, and why neither main nor master contains composerValid().

Re-applies, unchanged from the reviewed version:

- stamp.zig validates the version against a conservative subset of Composer's
  own pattern and SKIPS rather than writing something Composer rejects.
  "1.1.0-dev.N" is not valid — Composer's dev suffix takes no counter — and
  `composer install` ABORTS on an unparseable version, so v1.1.0-dev.2 and
  v1.1.0-dev.3 unpacked and then failed to resolve dependencies everywhere.
- Only a LEADING 'v' is stripped. The previous trim used a cutset on both ends,
  so "1.1.0-dev" became "1.1.0-de" — the one pre-release form Composer accepts.
- hkm-stamp is installed as an artifact so its behaviour can be verified
  against real composer instead of guessing which .zig-cache copy is current.

CHANGELOG names the release 1.1.0-beta.1, which Composer accepts, so the
version marker the native distribution needs is present rather than skipped.

Re-verified after restoring: 41 tests pass (32 kernel + 9 stamp), a real .deb
built at 1.1.0-beta.1 carries the version, `composer validate` passes, and
`composer install --no-dev --dry-run` completes with exit 0.
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