Conversation
- Remove non-existent src/Core/Service/ from CLAUDE.md L1 packages list - Fix LifecycleEventsTest: remove dependency on McpToolHandler interface (lives in core-mcp, not needed since McpToolsRegistering stores class name strings) - Run Laravel Pint to fix PSR-12 violations across all source and test files - Add missing declare(strict_types=1) to 18 PHP files (tests, seeders, Layout.php, GenerateServiceOgImages.php) Co-Authored-By: Virgil <virgil@lethean.io>
…-and-fix--laravel-php-package into dev Reviewed-on: https://forge.lthn.ai/core/php/pulls/10
Agent-readable documentation for every Core subsystem, extracted from 530 PHP source files. Each CLAUDE.md documents key classes, public API, patterns, and integration points. Highlights discovered: - Actions: #[Scheduled] attribute system wires to Laravel scheduler - Bouncer Gate: training mode with #[Action] attributes (CoreGO pattern) - Config: hierarchical scope (global→workspace→user) with version diffs - Crypt: LthnHash = QuasiSalt from dAppServer, ported to PHP - Database: Kahn's algorithm topological seeder sorting via attributes - Events: 12 lifecycle events with HasEventVersion forward compat - Front: 78 blade components + programmatic Component for MCP/agent UI - Headers: DetectDevice identifies 14 in-app browser platforms - Input: 9-step pre-boot sanitisation pipeline - Lang: TranslationMemory with fuzzy matching + TMX import/export - Mail: EmailShield with 100k+ disposable domain blocking - Search: 7-source unified search with privacy-aware IP hashing - Storage: Redis circuit breaker (Closed/Open/Half-Open) Co-Authored-By: Virgil <virgil@lethean.io>
Every directory containing PHP or Blade files now has agent-readable documentation. 134 new files, 2,103 lines across: - 78 blade component dirs (accordion through web) - 18 admin view components - 20 Core subsystem internals (models, services, concerns, migrations) - 10 Bouncer/Gate subsystem dirs - 5 root namespaces (Core, Mod, Mod/Trees, Plug, Website) - Tests, config, lang, media, seo, cdn, search, storage, webhook dirs Any agent landing on any CorePHP directory now understands the code before reading a single PHP file. The CLAUDE.md IS the index. Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
- Migrate module path: dappco.re/go/core/php -> dappco.re/go/php - Bump dappco.re/go/* deps to v0.8.0-alpha.1 in go.mod (any forge.lthn.ai/core/* paths migrated to canonical dappco.re/go/* form) - Update Go source imports across 21 .go files - Add tests/cli/php/Taskfile.yaml AX-10 scaffold (build/vet/test under default deps), per RFC-CORE-008-AGENT-EXPERIENCE.md §10 Co-Authored-By: Athena <athena@lthn.ai>
📝 WalkthroughWalkthroughThe PR migrates Go module dependencies from Changes
|
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
…ess pending Service module PHPStan + Psalm CI both failed at config-load on #2 because src/Core/Service/Tests doesn't exist. Removed that exclude entry from both configs. Knock-on: BunnyStorageService implements Core\Service\Contracts\HealthCheckable which lives in a not-yet-built Core\Service module. PHPStan flagged it via non-ignorable interface.notFound, Psalm via MissingDependency. Excluded the file from PHPStan and added directory-scoped MissingDependency suppression to Psalm covering src/Core/Cdn until the Service module lands. Also added Front\Client\Boot to the UndefinedClass suppression list (pending Front\Client frontage subpackage). Local verification: vendor/bin/phpstan analyse --no-progress → No errors vendor/bin/psalm --no-progress → No errors found composer test → 245 tests pass Tracked under core/lint RFC migration: plans/code/core/lint/RFC.md Co-Authored-By: Cladius Maximus <claude@anthropic.com>
Adds .github/workflows/lint-corelint.yml as a parity workflow for the core-lint orchestrator. Runs side-by-side with the existing static-analysis.yml jobs so PHPStan + Psalm output can be diffed between the native runners and the core-lint adapters across at least one merge cycle. The pilot is non-blocking (continue-on-error: true) — if core-lint fails the PR is not gated. Native jobs remain authoritative until parity is confirmed. Spec: plans/code/core/lint/RFC.md §5.4 (PHP adapter table), §7.2 (GitHub Actions integration) Co-Authored-By: Cladius Maximus <claude@anthropic.com>
The Psalm Laravel plugin emits NoEnvOutsideConfig for every env() call outside config/ — 176 instances in src/Core/config.php alone. PHPStan already ignores the equivalent identifier (larastan.noEnvCallsOutsideOfConfig) via phpstan.neon. Locally Psalm doesn't load the plugin's runtime check (works via the plugin's bootstrap file at composer install time on Linux runners), so the failure only surfaces in CI. Suppress at the issue-handler level matching the existing PHPStan exemption. Co-Authored-By: Cladius Maximus <claude@anthropic.com>
Bare <NoEnvOutsideConfig> failed Psalm's XML schema validation
("Element ...: This element is not expected."). Plugin-registered
issues need the <PluginIssue name="..."> wrapper.
Confirmed locally: vendor/bin/psalm --no-progress → 0 exit.
Co-Authored-By: Cladius Maximus <claude@anthropic.com>
CI Psalm reports 6 UndefinedClass errors for Illuminate\Foundation\Auth\User even though laravel/framework provides it. Local Psalm resolves it via the workspace autoloader; CI runner doesn't. Add to the existing UndefinedClass suppression list alongside other framework-resolved classes. Co-Authored-By: Cladius Maximus <claude@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 12
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/Core/Cdn/Services/StorageOffload.php (1)
48-57:⚠️ Potential issue | 🟠 MajorUpdate StorageOffload to use ConfigService for configuration.
StorageOffload reads configuration via Laravel's
config()helper, which relies on.envfiles. Other CDN services (BunnyCdnService, BunnyStorageService) use ConfigService dependency injection to access DB-backed configuration. For consistency and to follow the established pattern across the CDN module, refactor the constructor to inject ConfigService and read offload settings via$this->config->get()instead.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/Core/Cdn/Services/StorageOffload.php` around lines 48 - 57, The StorageOffload constructor currently uses the global config() helper; change the constructor to accept a ConfigService (e.g., add ConfigService $config parameter, assign $this->config = $config) and replace each config('offload.xxx') call with $this->config->get('offload.xxx') while preserving the existing default fallbacks for disk ('hetzner-public'), enabled (false), keep_local (true), and cache.enabled (false), and still set the properties disk, enabled, keepLocal, cdnUrl, maxFileSize, allowedExtensions, and cacheEnabled accordingly.
🧹 Nitpick comments (18)
src/Core/Webhook/CronTrigger.php (1)
46-46: Formatting change looks fine; consider URL-encoding the key.The compact concatenation style is acceptable. However,
$keyis appended directly withouturlencode(). If the key contains reserved characters (&,=,#, etc.), the URL could be malformed or unintentionally modified.Additionally, if
$endpointalready contains a query string (e.g.,/hook?foo=bar), the resulting URL would have two?characters.♻️ Suggested improvement for safer URL construction
- $url = $baseUrl.$endpoint.'?key='.$key; + $separator = str_contains($endpoint, '?') ? '&' : '?'; + $url = $baseUrl.$endpoint.$separator.'key='.urlencode($key);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/Core/Webhook/CronTrigger.php` at line 46, The current concatenation of $baseUrl, $endpoint and '?key='.$key in CronTrigger.php can produce malformed URLs; update the $url construction to URL-encode the key and choose the correct separator depending on whether $endpoint already contains a query string: compute a separator = (strpos($endpoint, '?') !== false) ? '&' : '?' and append separator.'key='.rawurlencode($key) (or urlencode if preferred) when building $url so $baseUrl, $endpoint, and $key are combined safely.src/Core/Bouncer/Migrations/CLAUDE.md (1)
1-10: LGTM!The documentation accurately describes the Bouncer migration's purpose. The early timestamp convention ensures these security-related tables exist before application migrations run.
Minor style note: Consider hyphenating "rate-limiting" when used as a compound adjective (e.g., "rate-limiting configuration"), though this is optional for documentation.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/Core/Bouncer/Migrations/CLAUDE.md` around lines 1 - 10, Update the documentation in src/Core/Bouncer/Migrations/CLAUDE.md to hyphenate "rate-limiting" when used as a compound adjective (change "rate limiting configuration" to "rate-limiting configuration") so the table entry for `0001_01_01_000001_create_bouncer_tables.php` reads "Creates core bouncer tables for IP/domain blocklisting, redirect rules, and rate-limiting configuration."src/Core/Front/Stdio/CLAUDE.md (1)
7-7: Minor grammar nit: consider adding a comma after "Currently".The sentence would read more clearly as: "Currently, a placeholder with empty command registration..."
This is a minor stylistic suggestion and can be addressed at your discretion.
📝 Suggested fix
-- **Boot.php** -- ServiceProvider for stdin/stdout transport. Handles non-HTTP contexts: Artisan commands, MCP stdio transport (agents connecting via pipes), and interactive CLI tools. Currently a placeholder with empty command registration -- core CLI commands will be registered here. No HTTP middleware -- this is a different transport entirely. +- **Boot.php** -- ServiceProvider for stdin/stdout transport. Handles non-HTTP contexts: Artisan commands, MCP stdio transport (agents connecting via pipes), and interactive CLI tools. Currently, a placeholder with empty command registration -- core CLI commands will be registered here. No HTTP middleware -- this is a different transport entirely.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/Core/Front/Stdio/CLAUDE.md` at line 7, Update the sentence in CLAUDE.md that describes Boot.php to insert a comma after "Currently" so it reads "Currently, a placeholder with empty command registration -- core CLI commands will be registered here." Locate and edit the line mentioning "Boot.php" and the clause "Currently a placeholder with empty command registration" and add the comma to improve readability.src/Core/Front/Components/View/Blade/file-item/CLAUDE.md (1)
1-7: LGTM with minor text suggestion.Clear documentation for the file-item subcomponents. Consider adding a comma after "Typically" on line 7 for improved readability:
Typically**,** renders an X icon button...
📝 Optional punctuation fix
-**remove.blade.php** -- Remove/delete button for a file item. Typically renders an X icon button to remove a file from an upload list or file manager. +**remove.blade.php** -- Remove/delete button for a file item. Typically, renders an X icon button to remove a file from an upload list or file manager.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/Core/Front/Components/View/Blade/file-item/CLAUDE.md` around lines 1 - 7, Update the CLAUDE.md documentation sentence in the Blade/file-item section by adding a comma after the word "Typically" so the line reading "Typically renders an X icon button..." becomes "Typically, renders an X icon button..."; locate the sentence describing remove.blade.php in CLAUDE.md and insert the comma to improve readability.src/Core/Search/Boot.php (1)
14-14: Subtle pattern: importing a potentially non-existent class for aliasing.The
use App\Services\Search\UnifiedSearchServiceimport is safe because PHPusestatements and::classresolution don't trigger autoloading. However, this pattern may be confusing to future maintainers who might expect the imported class to exist.Consider adding a brief comment explaining the alias purpose:
+// Legacy namespace alias (may not exist yet) use App\Services\Search\UnifiedSearchService;That said, the implementation is functionally correct and the backward-compatibility aliasing works as intended.
Also applies to: 76-77
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/Core/Search/Boot.php` at line 14, The import of App\Services\Search\UnifiedSearchService is intentionally used for backward-compatibility aliasing but can confuse readers; update src/Core/Search/Boot.php by adding a short inline comment next to the `use App\Services\Search\UnifiedSearchService;` statement (and the similar import around the area referenced at lines 76-77) explaining that the import is only for aliasing/compatibility and that PHP `use`/`::class` won't trigger autoloading—this clarifies intent for future maintainers without changing behavior.src/Core/Seo/Analytics/CLAUDE.md (1)
5-7: Consider adding file extension for consistency.The file reference
SeoScoreTrendlacks the.phpextension. Other CLAUDE.md files in the codebase (e.g.,src/Core/Lang/en_GB/CLAUDE.md) include file extensions in their tables for clarity.✏️ Suggested fix
| File | Purpose | |------|---------| -| `SeoScoreTrend` | Tracks SEO scores over time to show improvement or regression trends. Reads from `SeoScoreHistory` model. Provides daily, weekly, and monthly aggregation. | +| `SeoScoreTrend.php` | Tracks SEO scores over time to show improvement or regression trends. Reads from `SeoScoreHistory` model. Provides daily, weekly, and monthly aggregation. |🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/Core/Seo/Analytics/CLAUDE.md` around lines 5 - 7, Update the CLAUDE.md table entry for SeoScoreTrend to include the file extension by changing the reference from `SeoScoreTrend` to `SeoScoreTrend.php`; ensure the description still references the SeoScoreHistory model and the daily/weekly/monthly aggregation text remains unchanged so the table matches the project's convention of including file extensions.pkg/php/container.go (1)
383-386: Stale module path reference in comment.The comment on line 384 still references
forge.lthn.ai/core/go/pkg/container, which is inconsistent with the module path migration todappco.re/go/*.✏️ Suggested fix
// Try to load from container package templates - // This would integrate with forge.lthn.ai/core/go/pkg/container + // This would integrate with dappco.re/go/container return "", cli.Err("template not found: %s", name)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@pkg/php/container.go` around lines 383 - 386, Update the stale comment that references the old module path `forge.lthn.ai/core/go/pkg/container` to the new module path `dappco.re/go/pkg/container` in the function returning cli.Err (the block that returns "", cli.Err("template not found: %s", name)); locate the comment immediately above that return and replace the old path string so the comment accurately reflects the migrated module location.src/Core/Bouncer/Gate/CLAUDE.md (1)
16-18: Add language identifier to fenced code block.The integration flow diagram should specify a language identifier for consistency with markdown best practices. Since this is a text diagram, use
textorplaintext.📝 Suggested fix
-``` +```text Request -> ActionGateMiddleware -> ActionGateService::check() -> ActionPermission (allowed/denied) -> Controller</details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In
@src/Core/Bouncer/Gate/CLAUDE.mdaround lines 16 - 18, The fenced code block
showing the integration flow lacks a language identifier; update the block to
include a language tag (e.g., use "text" or "plaintext") so Markdown renders it
consistently—locate the flow line containing "Request -> ActionGateMiddleware ->
ActionGateService::check() -> ActionPermission (allowed/denied) -> Controller"
and change the opening fence fromtotext (or ```plaintext).</details> </blockquote></details> <details> <summary>src/Core/Activity/Concerns/LogsActivity.php (1)</summary><blockquote> `50-52`: **Redundant `logOnlyDirty()` call.** `logOnlyDirty()` is called conditionally on line 51, then unconditionally again on line 70, which overrides any intention behind the conditional check. <details> <summary>♻️ Suggested fix</summary> ```diff // Configure which events to log $events = $this->getActivityLogEvents(); - $options->logOnlyDirty(); // Set custom description generator ``` </details> Also applies to: 70-70 <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@src/Core/Activity/Concerns/LogsActivity.php` around lines 50 - 52, The code in LogsActivity.php redundantly calls $options->logOnlyDirty(): once guarded by shouldLogOnlyDirty() and again unconditionally later, which nullifies the conditional; remove the unconditional call (the second $options->logOnlyDirty()) or change it to be executed only when shouldLogOnlyDirty() returns true so that shouldLogOnlyDirty() controls whether logOnlyDirty() is applied; search for the $options->logOnlyDirty() usage in the LogsActivity trait/class to update the redundant invocation. ``` </details> </blockquote></details> <details> <summary>src/Core/Cdn/Boot.php (1)</summary><blockquote> `14-17`: **Disambiguate legacy aliases to reduce namespace shadowing.** This works, but importing legacy `App\...` classes as short names (`Cdn`, `HasCdnUrls`, etc.) makes the `class_alias` source/target direction harder to parse at a glance. <details> <summary>♻️ Optional readability refactor</summary> ```diff -use App\Facades\Cdn; +use App\Facades\Cdn as LegacyCdnFacade; ... - if (! class_exists(Cdn::class)) { - class_alias(Facades\Cdn::class, Cdn::class); + if (! class_exists(LegacyCdnFacade::class)) { + class_alias(Facades\Cdn::class, LegacyCdnFacade::class); } ``` </details> Also applies to: 134-150 <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@src/Core/Cdn/Boot.php` around lines 14 - 17, Imports like Cdn and HasCdnUrls shadow legacy class names and make class_alias usage hard to read; change the use statements to explicit aliased names (e.g., import App\Facades\Cdn as LegacyCdnFacade or similar, and App\Traits\HasCdnUrls as LegacyHasCdnUrls) and update any class_alias calls (and references in Boot::boot or wherever class_alias is used) to use these aliased identifiers so the source/target direction is unambiguous; apply the same renaming pattern to the other affected imports/aliases around the later block that currently contains similar App\... imports (the block around the existing RewriteOffloadedUrls, PushAssetToCdn, and the 134-150 region). ``` </details> </blockquote></details> <details> <summary>src/Core/Lang/Console/Commands/CLAUDE.md (1)</summary><blockquote> `1-11`: **Documentation looks good overall.** The table clearly documents the two translation CLI commands and their purposes. One minor wording suggestion: "CLI interface" on line 8 is slightly redundant since CLI already means "Command Line Interface". Consider simplifying to just "CLI" or "command-line interface". <details> <summary>📝 Suggested wording fix</summary> ```diff -| `TranslationMemoryCommand` | CLI interface for managing translation memory — view statistics, browse entries, import/export TMX files, fuzzy match queries. | +| `TranslationMemoryCommand` | CLI for managing translation memory — view statistics, browse entries, import/export TMX files, fuzzy match queries. | ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@src/Core/Lang/Console/Commands/CLAUDE.md` around lines 1 - 11, Update the wording for the TranslationMemoryCommand description to remove the redundant phrase "CLI interface": edit the README entry for TranslationMemoryCommand in CLAUDE.md and replace "CLI interface for managing translation memory — view statistics, browse entries, import/export TMX files, fuzzy match queries." with a concise alternative such as "CLI for managing translation memory — view statistics, browse entries, import/export TMX files, fuzzy match queries." (or "command-line interface" if you prefer); ensure the rest of the sentence and punctuation remain unchanged. ``` </details> </blockquote></details> <details> <summary>src/Core/Storage/CLAUDE.md (1)</summary><blockquote> `27-33`: **Add a language specifier to the fenced code block.** The ASCII diagram code block lacks a language identifier. Use `text` or `plaintext` to satisfy markdown linting while preserving the diagram format. <details> <summary>Suggested fix</summary> ```diff -``` +```text get("key") | v [Memory/Array] -- miss --> [Redis] -- miss --> [Database] 60s TTL 1h TTL 24h TTL ``` ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In
@src/Core/Storage/CLAUDE.mdaround lines 27 - 33, The fenced ASCII diagram
block starting with get("key") should include a language specifier (e.g., text
or plaintext) to satisfy markdown linting; update the triple-backtick fence that
wraps the diagram (the block containing get("key") and the [Memory/Array] --
miss --> [Redis] -- miss --> [Database] lines) to start with ```text so the
diagram remains unchanged but the linter recognizes the block.</details> </blockquote></details> <details> <summary>src/Core/Events/CLAUDE.md (1)</summary><blockquote> `9-9`: **Minor grammar improvement.** Consider rephrasing for clarity: "listened events" reads awkwardly. <details> <summary>Suggested fix</summary> ```diff -This is the **core of the module loading architecture**. Modules are never instantiated until their listened events fire. +This is the **core of the module loading architecture**. Modules are never instantiated until their subscribed events fire. ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@src/Core/Events/CLAUDE.md` at line 9, The sentence "Modules are never instantiated until their listened events fire." is awkward; update the wording in src/Core/Events/CLAUDE.md to a clearer phrasing such as "Modules are never instantiated until the events they listen for fire" or "Modules are only instantiated when the events they listen for are emitted" by replacing that exact sentence to improve readability. ``` </details> </blockquote></details> <details> <summary>src/Mod/CLAUDE.md (1)</summary><blockquote> `13-31`: **Add language specifier to fenced code block.** The directory structure code block lacks a language identifier. Adding `text` or `plaintext` improves rendering consistency. <details> <summary>📝 Suggested fix</summary> ```diff -``` +```text Mod/ {ModuleName}/ ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In
@src/Mod/CLAUDE.mdaround lines 13 - 31, The fenced code block in CLAUDE.md
that shows the module directory structure lacks a language specifier; update the
block delimiter fromto a language-tagged fence (e.g.,text orblock in src/Mod/CLAUDE.md and change the opening fence to include the language specifier for the snippet.src/Core/Webhook/CLAUDE.md (1)
18-29: Add language specifier to fenced code block.The request flow diagram lacks a language identifier. Adding
textorplaintextimproves rendering.📝 Suggested fix
-``` +```text POST /api/webhooks/{source}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/Core/Webhook/CLAUDE.md` around lines 18 - 29, The fenced code block in src/Core/Webhook/CLAUDE.md lacks a language specifier which can impair rendering; update the markdown block that documents the POST /api/webhooks/{source} flow (the block showing WebhookController::handle(), app("webhook.verifier.{$source}"), config("webhook.secrets.{$source}"), WebhookCall record creation, and dispatch of WebhookReceived) by adding a language tag such as text or plaintext after the opening backticks (e.g., replace ``` with ```text) so the diagram renders correctly.src/Mod/Trees/CLAUDE.md (1)
30-38: Consider adding a language specifier to the planting flow diagram.The fenced code block showing the planting flow lacks a language specifier, which triggers a markdownlint warning.
📝 Suggested fix
## Planting Flow -``` +```text Agent referral visit (/ref/{provider}/{model})🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/Mod/Trees/CLAUDE.md` around lines 30 - 38, The fenced code block containing the planting flow diagram (starting with "Agent referral visit (/ref/{provider}/{model})") is missing a language specifier and triggers markdownlint; update that fenced block to include a language tag (e.g., text) after the opening backticks so the block becomes ```text ... ``` to silence the lint warning and preserve formatting.src/Core/CLAUDE.md (1)
47-59: Consider adding a language specifier to the lifecycle events table header.The fenced code block section header at line 47 lacks a language specifier, which triggers a markdownlint warning. While this is minor, adding a language hint improves rendering in some Markdown viewers.
📝 Suggested fix
-## Lifecycle Events (fire* methods) +## Lifecycle Events (`fire*` methods)Alternatively, this is acceptable as-is since the content is a table, not code.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/Core/CLAUDE.md` around lines 47 - 59, Add a language specifier to the fenced code block that contains the "## Lifecycle Events (fire* methods)" table so markdownlint stops warning; locate the fenced block around that table (the section headed "Lifecycle Events (fire* methods)") and change the opening fence from ``` to a language-tagged fence such as ```markdown or ```md (or another appropriate language like ```text) so the table's code block has an explicit language.src/Core/Media/CLAUDE.md (1)
7-7: Add a language identifier to the fenced code block.The directory structure code block is missing a language identifier. Consider using
textorplaintextto satisfy markdown linters.-``` +```text Media/ Abstracts/ MediaConversion base class, Image abstract🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/Core/Media/CLAUDE.md` at line 7, Update the fenced code block in src/Core/Media/CLAUDE.md that contains the directory listing starting with "Media/" and "Abstracts/" so the opening backticks include a language identifier (e.g., change "```" to "```text" or "```plaintext") to satisfy markdown linters; ensure the rest of the block remains unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@cmd/core-php/main.go`:
- Around line 6-8: The import "dappco.re/go/cli/pkg/cli" was added but go.sum
lacks the module checksums; run the Go module tooling to regenerate checksums
(e.g., run go mod download or go build in the module root) so go.sum is updated
with entries for dappco.re/go/cli (v0.8.0-alpha.1), then stage and commit the
updated go.sum file.
In `@composer.json`:
- Line 21: Update the CI and local test matrix to include Laravel 13 and run the
full test suite against it, focusing on areas likely affected by major-version
changes (bootstrapping, middleware, service providers, and any framework-facing
APIs); if failures appear, modify the affected symbols or files (e.g., service
provider registration, middleware signatures, calls interacting with the
Illuminate container, or any usages tied to "laravel/framework":
"^11.0|^12.0|^13.0") to restore compatibility, add targeted unit/integration
tests for the breaking behaviors, and only merge the ^13.0 composer constraint
once all CI jobs and manual verification pass.
In `@go.mod`:
- Around line 14-27: Remove the duplicate module entries in the require block:
delete the second occurrences of dappco.re/go/i18n v0.8.0-alpha.1 and
dappco.re/go/io v0.8.0-alpha.1 so each module only appears once in go.mod; after
deduping, run go mod tidy to refresh dependencies and address the reported
404/unrecognised import-path errors (resolve or replace the failing dappco.re
module paths or update their versions as needed).
In `@psalm.xml`:
- Around line 77-82: Narrow the MissingDependency suppression: replace the broad
<MissingDependency> entry that targets the entire src/Core/Cdn directory with a
suppression scoped only to the specific file that legitimately depends on
Core\Service — the BunnyStorageService class/file (where HealthCheckable and
HealthCheckResult are imported). Update the <directory name="src/Core/Cdn" />
element to a <file name=".../BunnyStorageService.php" /> (or equivalent
file-scoped element) so only BunnyStorageService.php is suppressed for
MissingDependency, leaving other files in the CDN module uncovered by this
suppression.
- Around line 22-29: Replace the broad PluginIssue suppression for
NoEnvOutsideConfig that currently targets the entire src directory with
file-level suppressions only for the known offenders: add <file
name="src/Core/Bouncer/BouncerMiddleware.php" /> and a <directory
name="src/Core/Tests/Feature" /> (or individual <file> entries for each test
file) under the PluginIssue block so Psalm only ignores env() calls in those
locations; include a comment or attribute linking each suppression to a tracking
ticket (e.g., TICKET-1234) that will remediate or justify the usage and ensure
the PluginIssue tag still references name="NoEnvOutsideConfig".
In `@src/Core/Console/CLAUDE.md`:
- Around line 24-25: Update the documentation table to use the actual Artisan
command signatures instead of descriptions: replace the Signature cell for
PruneEmailShieldStatsCommand with "emailshield:prune" and for
ScheduleSyncCommand with "core:schedule-sync"; ensure the rows referencing
PruneEmailShieldStatsCommand and ScheduleSyncCommand in CLAUDE.md reflect these
exact signatures so they match the command class names.
In `@src/Core/Front/Admin/Blade/layouts/CLAUDE.md`:
- Line 10: Update the inaccurate sidebar width note in the CLAUDE.md layout:
replace the sentence "Responsive: sidebar hidden on mobile, 20px collapsed /
64px expanded on desktop." with the correct Tailwind spacing or pixel values
that match the classes used (ml-20 → 5rem / 80px and ml-64 → 16rem / 256px),
e.g., state "Responsive: sidebar hidden on mobile, 80px collapsed / 256px
expanded (ml-20 / ml-64)" so the doc matches the actual classes.
In `@src/Core/Front/Admin/Contracts/CLAUDE.md`:
- Line 13: Update the documented menu-group allowlist in CLAUDE.md to include
the missing `agents` group so implementations have the correct enum of groups;
change the pipe-separated list (`dashboard | workspaces | services | settings |
admin`) to include `agents` (e.g., `dashboard | agents | workspaces | services |
settings | admin`) so the documented allowlist matches the required groups used
by the provider implementations.
In `@src/Core/Front/Components/View/Blade/command/CLAUDE.md`:
- Line 3: Replace the nonstandard spelling "sub-components" with "subcomponents"
in the Markdown heading/text that currently reads "Command palette (Cmd+K)
sub-components." (the CLAUDE.md command palette line) so the file uses the
standard single-word form; simply edit that sentence to "Command palette (Cmd+K)
subcomponents."
In `@src/Core/Front/Services/CLAUDE.md`:
- Line 15: The example calls isStrictContentPlatform($ua) with an undefined $ua;
assign the request User-Agent into $ua before that call (e.g. extract via the
incoming request header or $_SERVER['HTTP_USER_AGENT']) so the variable is
defined, then pass $ua to isStrictContentPlatform; place the assignment
immediately above the if to ensure $ua is available for subsequent checks and
any logging or branching that uses it.
In `@src/Core/Helpers/Rules/CLAUDE.md`:
- Around line 9-13: The usage snippet for HexRule is currently merged into one
invalid PHP line; update the documentation so the two examples are separate
valid PHP array entries: show one entry for 'colour' using new HexRule() and a
second entry for 'colour' using new HexRule(forceFull: true), each terminated
properly and optionally add brief comments describing that HexRule() accepts
`#rgb` and `#rrggbb` while HexRule(forceFull: true) requires full `#rrggbb`; reference
the HexRule class name in the doc so readers can locate the rule.
In `@src/Core/Seo/CLAUDE.md`:
- Line 19: The table entry uses the incorrect service name
ServiceOgImageService; change it to OgImageService and ensure consistency by
renaming the symbol ServiceOgImageService to OgImageService everywhere it
appears (class/file names, exports, imports, and tests), update any references
(constructor injections, type annotations, and DI mappings) to use
OgImageService, and run the build/tests to catch remaining broken imports.
---
Outside diff comments:
In `@src/Core/Cdn/Services/StorageOffload.php`:
- Around line 48-57: The StorageOffload constructor currently uses the global
config() helper; change the constructor to accept a ConfigService (e.g., add
ConfigService $config parameter, assign $this->config = $config) and replace
each config('offload.xxx') call with $this->config->get('offload.xxx') while
preserving the existing default fallbacks for disk ('hetzner-public'), enabled
(false), keep_local (true), and cache.enabled (false), and still set the
properties disk, enabled, keepLocal, cdnUrl, maxFileSize, allowedExtensions, and
cacheEnabled accordingly.
---
Nitpick comments:
In `@pkg/php/container.go`:
- Around line 383-386: Update the stale comment that references the old module
path `forge.lthn.ai/core/go/pkg/container` to the new module path
`dappco.re/go/pkg/container` in the function returning cli.Err (the block that
returns "", cli.Err("template not found: %s", name)); locate the comment
immediately above that return and replace the old path string so the comment
accurately reflects the migrated module location.
In `@src/Core/Activity/Concerns/LogsActivity.php`:
- Around line 50-52: The code in LogsActivity.php redundantly calls
$options->logOnlyDirty(): once guarded by shouldLogOnlyDirty() and again
unconditionally later, which nullifies the conditional; remove the unconditional
call (the second $options->logOnlyDirty()) or change it to be executed only when
shouldLogOnlyDirty() returns true so that shouldLogOnlyDirty() controls whether
logOnlyDirty() is applied; search for the $options->logOnlyDirty() usage in the
LogsActivity trait/class to update the redundant invocation.
In `@src/Core/Bouncer/Gate/CLAUDE.md`:
- Around line 16-18: The fenced code block showing the integration flow lacks a
language identifier; update the block to include a language tag (e.g., use
"text" or "plaintext") so Markdown renders it consistently—locate the flow line
containing "Request -> ActionGateMiddleware -> ActionGateService::check() ->
ActionPermission (allowed/denied) -> Controller" and change the opening fence
from ``` to ```text (or ```plaintext).
In `@src/Core/Bouncer/Migrations/CLAUDE.md`:
- Around line 1-10: Update the documentation in
src/Core/Bouncer/Migrations/CLAUDE.md to hyphenate "rate-limiting" when used as
a compound adjective (change "rate limiting configuration" to "rate-limiting
configuration") so the table entry for
`0001_01_01_000001_create_bouncer_tables.php` reads "Creates core bouncer tables
for IP/domain blocklisting, redirect rules, and rate-limiting configuration."
In `@src/Core/Cdn/Boot.php`:
- Around line 14-17: Imports like Cdn and HasCdnUrls shadow legacy class names
and make class_alias usage hard to read; change the use statements to explicit
aliased names (e.g., import App\Facades\Cdn as LegacyCdnFacade or similar, and
App\Traits\HasCdnUrls as LegacyHasCdnUrls) and update any class_alias calls (and
references in Boot::boot or wherever class_alias is used) to use these aliased
identifiers so the source/target direction is unambiguous; apply the same
renaming pattern to the other affected imports/aliases around the later block
that currently contains similar App\... imports (the block around the existing
RewriteOffloadedUrls, PushAssetToCdn, and the 134-150 region).
In `@src/Core/CLAUDE.md`:
- Around line 47-59: Add a language specifier to the fenced code block that
contains the "## Lifecycle Events (fire* methods)" table so markdownlint stops
warning; locate the fenced block around that table (the section headed
"Lifecycle Events (fire* methods)") and change the opening fence from ``` to a
language-tagged fence such as ```markdown or ```md (or another appropriate
language like ```text) so the table's code block has an explicit language.
In `@src/Core/Events/CLAUDE.md`:
- Line 9: The sentence "Modules are never instantiated until their listened
events fire." is awkward; update the wording in src/Core/Events/CLAUDE.md to a
clearer phrasing such as "Modules are never instantiated until the events they
listen for fire" or "Modules are only instantiated when the events they listen
for are emitted" by replacing that exact sentence to improve readability.
In `@src/Core/Front/Components/View/Blade/file-item/CLAUDE.md`:
- Around line 1-7: Update the CLAUDE.md documentation sentence in the
Blade/file-item section by adding a comma after the word "Typically" so the line
reading "Typically renders an X icon button..." becomes "Typically, renders an X
icon button..."; locate the sentence describing remove.blade.php in CLAUDE.md
and insert the comma to improve readability.
In `@src/Core/Front/Stdio/CLAUDE.md`:
- Line 7: Update the sentence in CLAUDE.md that describes Boot.php to insert a
comma after "Currently" so it reads "Currently, a placeholder with empty command
registration -- core CLI commands will be registered here." Locate and edit the
line mentioning "Boot.php" and the clause "Currently a placeholder with empty
command registration" and add the comma to improve readability.
In `@src/Core/Lang/Console/Commands/CLAUDE.md`:
- Around line 1-11: Update the wording for the TranslationMemoryCommand
description to remove the redundant phrase "CLI interface": edit the README
entry for TranslationMemoryCommand in CLAUDE.md and replace "CLI interface for
managing translation memory — view statistics, browse entries, import/export TMX
files, fuzzy match queries." with a concise alternative such as "CLI for
managing translation memory — view statistics, browse entries, import/export TMX
files, fuzzy match queries." (or "command-line interface" if you prefer); ensure
the rest of the sentence and punctuation remain unchanged.
In `@src/Core/Media/CLAUDE.md`:
- Line 7: Update the fenced code block in src/Core/Media/CLAUDE.md that contains
the directory listing starting with "Media/" and "Abstracts/" so the opening
backticks include a language identifier (e.g., change "```" to "```text" or
"```plaintext") to satisfy markdown linters; ensure the rest of the block
remains unchanged.
In `@src/Core/Search/Boot.php`:
- Line 14: The import of App\Services\Search\UnifiedSearchService is
intentionally used for backward-compatibility aliasing but can confuse readers;
update src/Core/Search/Boot.php by adding a short inline comment next to the
`use App\Services\Search\UnifiedSearchService;` statement (and the similar
import around the area referenced at lines 76-77) explaining that the import is
only for aliasing/compatibility and that PHP `use`/`::class` won't trigger
autoloading—this clarifies intent for future maintainers without changing
behavior.
In `@src/Core/Seo/Analytics/CLAUDE.md`:
- Around line 5-7: Update the CLAUDE.md table entry for SeoScoreTrend to include
the file extension by changing the reference from `SeoScoreTrend` to
`SeoScoreTrend.php`; ensure the description still references the SeoScoreHistory
model and the daily/weekly/monthly aggregation text remains unchanged so the
table matches the project's convention of including file extensions.
In `@src/Core/Storage/CLAUDE.md`:
- Around line 27-33: The fenced ASCII diagram block starting with get("key")
should include a language specifier (e.g., text or plaintext) to satisfy
markdown linting; update the triple-backtick fence that wraps the diagram (the
block containing get("key") and the [Memory/Array] -- miss --> [Redis] -- miss
--> [Database] lines) to start with ```text so the diagram remains unchanged but
the linter recognizes the block.
In `@src/Core/Webhook/CLAUDE.md`:
- Around line 18-29: The fenced code block in src/Core/Webhook/CLAUDE.md lacks a
language specifier which can impair rendering; update the markdown block that
documents the POST /api/webhooks/{source} flow (the block showing
WebhookController::handle(), app("webhook.verifier.{$source}"),
config("webhook.secrets.{$source}"), WebhookCall record creation, and dispatch
of WebhookReceived) by adding a language tag such as text or plaintext after the
opening backticks (e.g., replace ``` with ```text) so the diagram renders
correctly.
In `@src/Core/Webhook/CronTrigger.php`:
- Line 46: The current concatenation of $baseUrl, $endpoint and '?key='.$key in
CronTrigger.php can produce malformed URLs; update the $url construction to
URL-encode the key and choose the correct separator depending on whether
$endpoint already contains a query string: compute a separator =
(strpos($endpoint, '?') !== false) ? '&' : '?' and append
separator.'key='.rawurlencode($key) (or urlencode if preferred) when building
$url so $baseUrl, $endpoint, and $key are combined safely.
In `@src/Mod/CLAUDE.md`:
- Around line 13-31: The fenced code block in CLAUDE.md that shows the module
directory structure lacks a language specifier; update the block delimiter from
``` to a language-tagged fence (e.g., ```text or ```plaintext) so the snippet
renders consistently—locate the directory tree block in src/Mod/CLAUDE.md and
change the opening fence to include the language specifier for the snippet.
In `@src/Mod/Trees/CLAUDE.md`:
- Around line 30-38: The fenced code block containing the planting flow diagram
(starting with "Agent referral visit (/ref/{provider}/{model})") is missing a
language specifier and triggers markdownlint; update that fenced block to
include a language tag (e.g., text) after the opening backticks so the block
becomes ```text ... ``` to silence the lint warning and preserve formatting.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 6d540af1-90d3-43d4-b8f8-753e061f3dbe
📒 Files selected for processing (300)
.github/workflows/lint-corelint.ymlCLAUDE.mdcmd/core-php/main.gocomposer.jsonconfig/core.phpgo.modphpstan.neonpkg/php/cmd.gopkg/php/cmd_build.gopkg/php/cmd_ci.gopkg/php/cmd_commands.gopkg/php/cmd_deploy.gopkg/php/cmd_dev.gopkg/php/cmd_packages.gopkg/php/cmd_serve_frankenphp.gopkg/php/container.gopkg/php/coolify.gopkg/php/deploy.gopkg/php/dockerfile.gopkg/php/i18n.gopkg/php/packages.gopkg/php/php.gopkg/php/quality.gopkg/php/services.gopkg/php/ssl.gopkg/php/testing.gopkg/php/workspace.gopsalm.xmlsrc/Core/Actions/CLAUDE.mdsrc/Core/Actions/ScheduleServiceProvider.phpsrc/Core/Actions/ScheduledAction.phpsrc/Core/Actions/ScheduledActionScanner.phpsrc/Core/Activity/CLAUDE.mdsrc/Core/Activity/Concerns/CLAUDE.mdsrc/Core/Activity/Concerns/LogsActivity.phpsrc/Core/Activity/Console/ActivityPruneCommand.phpsrc/Core/Activity/Console/CLAUDE.mdsrc/Core/Activity/Models/Activity.phpsrc/Core/Activity/Models/CLAUDE.mdsrc/Core/Activity/Scopes/CLAUDE.mdsrc/Core/Activity/Services/CLAUDE.mdsrc/Core/Activity/View/Blade/admin/CLAUDE.mdsrc/Core/Activity/View/Modal/Admin/ActivityFeed.phpsrc/Core/Activity/View/Modal/Admin/CLAUDE.mdsrc/Core/Boot.phpsrc/Core/Bouncer/CLAUDE.mdsrc/Core/Bouncer/Database/Seeders/CLAUDE.mdsrc/Core/Bouncer/Gate/Attributes/CLAUDE.mdsrc/Core/Bouncer/Gate/CLAUDE.mdsrc/Core/Bouncer/Gate/Migrations/CLAUDE.mdsrc/Core/Bouncer/Gate/Models/ActionPermission.phpsrc/Core/Bouncer/Gate/Models/ActionRequest.phpsrc/Core/Bouncer/Gate/Models/CLAUDE.mdsrc/Core/Bouncer/Gate/Tests/Feature/ActionGateTest.phpsrc/Core/Bouncer/Gate/Tests/Feature/CLAUDE.mdsrc/Core/Bouncer/Gate/Tests/Unit/CLAUDE.mdsrc/Core/Bouncer/Migrations/CLAUDE.mdsrc/Core/Bouncer/Tests/Unit/CLAUDE.mdsrc/Core/CLAUDE.mdsrc/Core/Cdn/Boot.phpsrc/Core/Cdn/CLAUDE.mdsrc/Core/Cdn/Console/CLAUDE.mdsrc/Core/Cdn/Console/CdnPurge.phpsrc/Core/Cdn/Console/PushAssetsToCdn.phpsrc/Core/Cdn/Facades/CLAUDE.mdsrc/Core/Cdn/Facades/Cdn.phpsrc/Core/Cdn/Jobs/CLAUDE.mdsrc/Core/Cdn/Jobs/PushAssetToCdn.phpsrc/Core/Cdn/Middleware/CLAUDE.mdsrc/Core/Cdn/Models/CLAUDE.mdsrc/Core/Cdn/Models/StorageOffload.phpsrc/Core/Cdn/Services/AssetPipeline.phpsrc/Core/Cdn/Services/CLAUDE.mdsrc/Core/Cdn/Services/FluxCdnService.phpsrc/Core/Cdn/Services/StorageOffload.phpsrc/Core/Cdn/Services/StorageUrlResolver.phpsrc/Core/Cdn/Traits/CLAUDE.mdsrc/Core/Config/CLAUDE.mdsrc/Core/Config/Console/CLAUDE.mdsrc/Core/Config/Console/ConfigExportCommand.phpsrc/Core/Config/Console/ConfigImportCommand.phpsrc/Core/Config/Console/ConfigListCommand.phpsrc/Core/Config/Console/ConfigPrimeCommand.phpsrc/Core/Config/Console/ConfigVersionCommand.phpsrc/Core/Config/Contracts/CLAUDE.mdsrc/Core/Config/Contracts/ConfigProvider.phpsrc/Core/Config/Database/Seeders/CLAUDE.mdsrc/Core/Config/Enums/CLAUDE.mdsrc/Core/Config/Events/CLAUDE.mdsrc/Core/Config/Migrations/CLAUDE.mdsrc/Core/Config/Models/CLAUDE.mdsrc/Core/Config/Models/Channel.phpsrc/Core/Config/Models/ConfigKey.phpsrc/Core/Config/Models/ConfigProfile.phpsrc/Core/Config/Models/ConfigResolved.phpsrc/Core/Config/Models/ConfigValue.phpsrc/Core/Config/Models/ConfigVersion.phpsrc/Core/Config/Routes/CLAUDE.mdsrc/Core/Config/Tests/Feature/CLAUDE.mdsrc/Core/Config/Tests/Feature/ConfigServiceTest.phpsrc/Core/Config/View/Blade/admin/CLAUDE.mdsrc/Core/Config/View/Modal/Admin/CLAUDE.mdsrc/Core/Config/View/Modal/Admin/ConfigPanel.phpsrc/Core/Config/View/Modal/Admin/WorkspaceConfig.phpsrc/Core/Console/CLAUDE.mdsrc/Core/Console/Commands/CLAUDE.mdsrc/Core/Console/Commands/InstallCommand.phpsrc/Core/Console/Commands/MakeModCommand.phpsrc/Core/Console/Commands/MakePlugCommand.phpsrc/Core/Console/Commands/MakeWebsiteCommand.phpsrc/Core/Console/Commands/NewProjectCommand.phpsrc/Core/Console/Commands/PruneEmailShieldStatsCommand.phpsrc/Core/Crypt/CLAUDE.mdsrc/Core/Crypt/EncryptArrayObject.phpsrc/Core/Database/Seeders/Attributes/CLAUDE.mdsrc/Core/Database/Seeders/CLAUDE.mdsrc/Core/Database/Seeders/Exceptions/CLAUDE.mdsrc/Core/Events/CLAUDE.mdsrc/Core/Events/Concerns/CLAUDE.mdsrc/Core/Front/Admin/AdminMenuRegistry.phpsrc/Core/Front/Admin/Blade/components/CLAUDE.mdsrc/Core/Front/Admin/Blade/components/tabs/CLAUDE.mdsrc/Core/Front/Admin/Blade/layouts/CLAUDE.mdsrc/Core/Front/Admin/Boot.phpsrc/Core/Front/Admin/CLAUDE.mdsrc/Core/Front/Admin/Concerns/CLAUDE.mdsrc/Core/Front/Admin/Contracts/CLAUDE.mdsrc/Core/Front/Admin/Support/CLAUDE.mdsrc/Core/Front/Admin/Validation/CLAUDE.mdsrc/Core/Front/Admin/View/Components/ActivityFeed.phpsrc/Core/Front/Admin/View/Components/ActivityLog.phpsrc/Core/Front/Admin/View/Components/Alert.phpsrc/Core/Front/Admin/View/Components/CLAUDE.mdsrc/Core/Front/Admin/View/Components/CardGrid.phpsrc/Core/Front/Admin/View/Components/ClearFilters.phpsrc/Core/Front/Admin/View/Components/DataTable.phpsrc/Core/Front/Admin/View/Components/EditableTable.phpsrc/Core/Front/Admin/View/Components/Filter.phpsrc/Core/Front/Admin/View/Components/FilterBar.phpsrc/Core/Front/Admin/View/Components/LinkGrid.phpsrc/Core/Front/Admin/View/Components/ManagerTable.phpsrc/Core/Front/Admin/View/Components/Metrics.phpsrc/Core/Front/Admin/View/Components/ProgressList.phpsrc/Core/Front/Admin/View/Components/Search.phpsrc/Core/Front/Admin/View/Components/ServiceCard.phpsrc/Core/Front/Admin/View/Components/Sidemenu.phpsrc/Core/Front/Admin/View/Components/Stats.phpsrc/Core/Front/Admin/View/Components/StatusCards.phpsrc/Core/Front/Boot.phpsrc/Core/Front/CLAUDE.mdsrc/Core/Front/Cli/Boot.phpsrc/Core/Front/Cli/CLAUDE.mdsrc/Core/Front/Components/CLAUDE.mdsrc/Core/Front/Components/Layout.phpsrc/Core/Front/Components/View/Blade/CLAUDE.mdsrc/Core/Front/Components/View/Blade/accordion/CLAUDE.mdsrc/Core/Front/Components/View/Blade/autocomplete/CLAUDE.mdsrc/Core/Front/Components/View/Blade/button/CLAUDE.mdsrc/Core/Front/Components/View/Blade/callout/CLAUDE.mdsrc/Core/Front/Components/View/Blade/chart/CLAUDE.mdsrc/Core/Front/Components/View/Blade/chart/axis/CLAUDE.mdsrc/Core/Front/Components/View/Blade/chart/tooltip/CLAUDE.mdsrc/Core/Front/Components/View/Blade/checkbox/CLAUDE.mdsrc/Core/Front/Components/View/Blade/command/CLAUDE.mdsrc/Core/Front/Components/View/Blade/components/satellite/CLAUDE.mdsrc/Core/Front/Components/View/Blade/date-picker/CLAUDE.mdsrc/Core/Front/Components/View/Blade/editor/CLAUDE.mdsrc/Core/Front/Components/View/Blade/errors/CLAUDE.mdsrc/Core/Front/Components/View/Blade/examples/CLAUDE.mdsrc/Core/Front/Components/View/Blade/file-item/CLAUDE.mdsrc/Core/Front/Components/View/Blade/file-upload/CLAUDE.mdsrc/Core/Front/Components/View/Blade/forms/CLAUDE.mdsrc/Core/Front/Components/View/Blade/icon/CLAUDE.mdsrc/Core/Front/Components/View/Blade/input/CLAUDE.mdsrc/Core/Front/Components/View/Blade/input/group/CLAUDE.mdsrc/Core/Front/Components/View/Blade/kanban/CLAUDE.mdsrc/Core/Front/Components/View/Blade/kanban/column/CLAUDE.mdsrc/Core/Front/Components/View/Blade/layout/CLAUDE.mdsrc/Core/Front/Components/View/Blade/layouts/CLAUDE.mdsrc/Core/Front/Components/View/Blade/layouts/partials/CLAUDE.mdsrc/Core/Front/Components/View/Blade/menu/CLAUDE.mdsrc/Core/Front/Components/View/Blade/navbar/CLAUDE.mdsrc/Core/Front/Components/View/Blade/navlist/CLAUDE.mdsrc/Core/Front/Components/View/Blade/pillbox/CLAUDE.mdsrc/Core/Front/Components/View/Blade/radio/CLAUDE.mdsrc/Core/Front/Components/View/Blade/select/CLAUDE.mdsrc/Core/Front/Components/View/Blade/slider/CLAUDE.mdsrc/Core/Front/Components/View/Blade/tab/CLAUDE.mdsrc/Core/Front/Components/View/Blade/table/CLAUDE.mdsrc/Core/Front/Components/View/Blade/web/CLAUDE.mdsrc/Core/Front/Services/CLAUDE.mdsrc/Core/Front/Stdio/CLAUDE.mdsrc/Core/Front/Tests/Unit/CLAUDE.mdsrc/Core/Front/Web/Blade/components/CLAUDE.mdsrc/Core/Front/Web/Blade/layouts/CLAUDE.mdsrc/Core/Front/Web/Boot.phpsrc/Core/Front/Web/CLAUDE.mdsrc/Core/Front/Web/Middleware/CLAUDE.mdsrc/Core/Front/Web/Middleware/FindDomainRecord.phpsrc/Core/Front/Web/Middleware/ResilientSession.phpsrc/Core/Headers/CLAUDE.mdsrc/Core/Headers/Livewire/CLAUDE.mdsrc/Core/Headers/Livewire/HeaderConfigurationManager.phpsrc/Core/Headers/Testing/CLAUDE.mdsrc/Core/Headers/Views/livewire/CLAUDE.mdsrc/Core/Helpers/CLAUDE.mdsrc/Core/Helpers/Rules/CLAUDE.mdsrc/Core/Input/CLAUDE.mdsrc/Core/Input/Tests/Unit/CLAUDE.mdsrc/Core/Lang/CLAUDE.mdsrc/Core/Lang/Console/Commands/CLAUDE.mdsrc/Core/Lang/Console/Commands/TranslationCoverageCommand.phpsrc/Core/Lang/Console/Commands/TranslationMemoryCommand.phpsrc/Core/Lang/Coverage/CLAUDE.mdsrc/Core/Lang/TranslationMemory/CLAUDE.mdsrc/Core/Lang/TranslationMemory/Contracts/CLAUDE.mdsrc/Core/Lang/en_GB/CLAUDE.mdsrc/Core/LifecycleEventProvider.phpsrc/Core/Mail/CLAUDE.mdsrc/Core/Mail/Rules/CLAUDE.mdsrc/Core/Media/Abstracts/CLAUDE.mdsrc/Core/Media/Abstracts/MediaConversion.phpsrc/Core/Media/CLAUDE.mdsrc/Core/Media/Conversions/CLAUDE.mdsrc/Core/Media/Events/CLAUDE.mdsrc/Core/Media/Image/CLAUDE.mdsrc/Core/Media/Image/ImageOptimization.phpsrc/Core/Media/Jobs/CLAUDE.mdsrc/Core/Media/Routes/CLAUDE.mdsrc/Core/Media/Support/CLAUDE.mdsrc/Core/Media/Thumbnail/CLAUDE.mdsrc/Core/Rules/CLAUDE.mdsrc/Core/Search/Analytics/CLAUDE.mdsrc/Core/Search/Analytics/SearchAnalytics.phpsrc/Core/Search/Analytics/migrations/CLAUDE.mdsrc/Core/Search/Boot.phpsrc/Core/Search/CLAUDE.mdsrc/Core/Search/Suggestions/CLAUDE.mdsrc/Core/Search/Suggestions/SearchSuggestions.phpsrc/Core/Search/Support/CLAUDE.mdsrc/Core/Search/Unified.phpsrc/Core/Seo/Analytics/CLAUDE.mdsrc/Core/Seo/Boot.phpsrc/Core/Seo/CLAUDE.mdsrc/Core/Seo/Console/Commands/CLAUDE.mdsrc/Core/Seo/Console/Commands/GenerateServiceOgImages.phpsrc/Core/Seo/Controllers/CLAUDE.mdsrc/Core/Seo/Jobs/CLAUDE.mdsrc/Core/Seo/Jobs/GenerateOgImageJob.phpsrc/Core/Seo/Models/CLAUDE.mdsrc/Core/Seo/Models/SeoScoreHistory.phpsrc/Core/Seo/SeoMetadata.phpsrc/Core/Seo/Services/CLAUDE.mdsrc/Core/Seo/Validation/CLAUDE.mdsrc/Core/Storage/CLAUDE.mdsrc/Core/Storage/CacheResilienceProvider.phpsrc/Core/Storage/Commands/CLAUDE.mdsrc/Core/Storage/Commands/WarmCacheCommand.phpsrc/Core/Storage/Events/CLAUDE.mdsrc/Core/Tests/Feature/AdminComponentsTest.phpsrc/Core/Tests/Feature/AdminRouteSmokeTest.phpsrc/Core/Tests/Feature/CLAUDE.mdsrc/Core/Tests/Feature/CdnIntegrationTest.phpsrc/Core/Tests/Feature/Config/CLAUDE.mdsrc/Core/Tests/Feature/Config/ChannelTest.phpsrc/Core/Tests/Feature/Config/ConfigValueTest.phpsrc/Core/Tests/Feature/CoreComponentsTest.phpsrc/Core/Tests/Feature/DatabaseMigrationTest.phpsrc/Core/Tests/Feature/EmailShieldTest.phpsrc/Core/Tests/Feature/ErrorPagesTest.phpsrc/Core/Tests/Feature/ImageOptimizerTest.phpsrc/Core/Tests/Feature/MailConfigurationTest.phpsrc/Core/Tests/Feature/ModuleScannerIntegrationTest.phpsrc/Core/Tests/Feature/OffloadMigrateCommandTest.phpsrc/Core/Tests/Feature/RewriteOffloadedUrlsTest.phpsrc/Core/Tests/Feature/SecurityFixesTest.phpsrc/Core/Tests/Feature/SecurityHeadersTest.phpsrc/Core/Tests/Feature/StorageOffloadTest.phpsrc/Core/Tests/Feature/ValidationRulesTest.phpsrc/Core/Tests/Unit/CLAUDE.mdsrc/Core/Tests/Unit/Crypt/CLAUDE.mdsrc/Core/Tests/Unit/HadesEncryptTest.phpsrc/Core/Tests/Unit/LthnHashTest.phpsrc/Core/Tests/Unit/Services/BunnyCdnServiceTest.phpsrc/Core/Tests/Unit/Services/CLAUDE.mdsrc/Core/Webhook/CLAUDE.mdsrc/Core/Webhook/CronTrigger.phpsrc/Mod/CLAUDE.mdsrc/Mod/Trees/CLAUDE.mdsrc/Mod/Trees/Database/Seeders/TreeSeeder.phpsrc/Mod/Trees/Routes/web.phpsrc/Mod/Trees/Tests/Feature/DailyLimitAndBonusTest.phpsrc/Mod/Trees/Tests/Feature/QueueProcessingTest.phpsrc/Mod/Trees/Tests/Feature/ReferralRouteTest.phpsrc/Mod/Trees/Tests/Feature/SignupReferralTest.phpsrc/Mod/Trees/Tests/Feature/StatsApiTest.phpsrc/Mod/Trees/Tests/Feature/SubscriberMonthlyCommandTest.phpsrc/Mod/Trees/Tests/Feature/TreePlantingTest.phpsrc/Mod/Trees/Tests/Feature/TreesPageTest.phpsrc/Mod/Trees/View/Modal/Web/Index.php
💤 Files with no reviewable changes (1)
- CLAUDE.md
Routine dev→main PR opened by Hephaestus PR-cadence task.
This PR exists to:
ahead_by: 7 commit(s) (per gh api compare)If CodeRabbit clears with no blocking comments, this PR is eligible for
gh pr merge --merge(real merge commit, no force-push). Conflicts and review feedback should be addressed on the dev branch before merge.Co-authored-by: Hephaestus hephaestus@cladius
Summary by CodeRabbit
Release Notes