From e0d2325a205a0e3245e3933ca3008e3e532293fa Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 27 Jan 2026 16:32:55 +0000 Subject: [PATCH] refactor: move namespace from Core\Uptelligence to Core\Mod\Uptelligence Aligns module namespace with Core PHP Framework conventions where modules live under the Core\Mod\ namespace hierarchy. This follows the monorepo separation work started in 40d893a. Co-Authored-By: Claude Opus 4.5 --- Boot.php | 20 +-- Console/AnalyzeCommand.php | 10 +- Console/CheckCommand.php | 8 +- Console/CheckUpdatesCommand.php | 8 +- Console/IssuesCommand.php | 6 +- Console/SendDigestsCommand.php | 6 +- Controllers/Api/WebhookController.php | 10 +- Jobs/CheckVendorUpdatesJob.php | 8 +- Jobs/ProcessUptelligenceWebhook.php | 12 +- Models/AnalysisLog.php | 2 +- Models/Asset.php | 2 +- Models/AssetVersion.php | 2 +- Models/DiffCache.php | 2 +- Models/Pattern.php | 2 +- Models/PatternCollection.php | 2 +- Models/PatternVariant.php | 2 +- Models/UpstreamTodo.php | 2 +- Models/UptelligenceDigest.php | 2 +- Models/UptelligenceWebhook.php | 2 +- Models/UptelligenceWebhookDelivery.php | 2 +- Models/Vendor.php | 2 +- Models/VersionRelease.php | 2 +- Notifications/NewReleaseDetected.php | 4 +- Notifications/SendUptelligenceDigest.php | 4 +- Services/AIAnalyzerService.php | 10 +- Services/AssetTrackerService.php | 6 +- Services/DiffAnalyzerService.php | 10 +- Services/IssueGeneratorService.php | 8 +- Services/UpstreamPlanGeneratorService.php | 8 +- Services/UptelligenceDigestService.php | 12 +- Services/VendorStorageService.php | 6 +- Services/VendorUpdateCheckerService.php | 6 +- Services/WebhookReceiverService.php | 10 +- View/Blade/admin/digest-preferences.blade.php | 2 +- View/Modal/Admin/AssetManager.php | 4 +- View/Modal/Admin/Dashboard.php | 10 +- View/Modal/Admin/DiffViewer.php | 8 +- View/Modal/Admin/DigestPreferences.php | 8 +- View/Modal/Admin/TodoList.php | 6 +- View/Modal/Admin/VendorManager.php | 6 +- View/Modal/Admin/WebhookManager.php | 10 +- changelog/2026/jan/code-review.md | 144 ++++++++++++++++++ composer.json | 6 +- routes/admin.php | 14 +- routes/api.php | 2 +- 45 files changed, 281 insertions(+), 137 deletions(-) create mode 100644 changelog/2026/jan/code-review.md diff --git a/Boot.php b/Boot.php index 7ba3490..9f39249 100644 --- a/Boot.php +++ b/Boot.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence; +namespace Core\Mod\Uptelligence; use Core\Events\AdminPanelBooting; use Core\Events\ApiRoutesRegistering; @@ -48,15 +48,15 @@ class Boot extends ServiceProvider 'upstream' ); - $this->app->singleton(\Core\Uptelligence\Services\IssueGeneratorService::class); - $this->app->singleton(\Core\Uptelligence\Services\UpstreamPlanGeneratorService::class); - $this->app->singleton(\Core\Uptelligence\Services\VendorStorageService::class); - $this->app->singleton(\Core\Uptelligence\Services\DiffAnalyzerService::class); - $this->app->singleton(\Core\Uptelligence\Services\AssetTrackerService::class); - $this->app->singleton(\Core\Uptelligence\Services\AIAnalyzerService::class); - $this->app->singleton(\Core\Uptelligence\Services\VendorUpdateCheckerService::class); - $this->app->singleton(\Core\Uptelligence\Services\UptelligenceDigestService::class); - $this->app->singleton(\Core\Uptelligence\Services\WebhookReceiverService::class); + $this->app->singleton(\Core\Mod\Uptelligence\Services\IssueGeneratorService::class); + $this->app->singleton(\Core\Mod\Uptelligence\Services\UpstreamPlanGeneratorService::class); + $this->app->singleton(\Core\Mod\Uptelligence\Services\VendorStorageService::class); + $this->app->singleton(\Core\Mod\Uptelligence\Services\DiffAnalyzerService::class); + $this->app->singleton(\Core\Mod\Uptelligence\Services\AssetTrackerService::class); + $this->app->singleton(\Core\Mod\Uptelligence\Services\AIAnalyzerService::class); + $this->app->singleton(\Core\Mod\Uptelligence\Services\VendorUpdateCheckerService::class); + $this->app->singleton(\Core\Mod\Uptelligence\Services\UptelligenceDigestService::class); + $this->app->singleton(\Core\Mod\Uptelligence\Services\WebhookReceiverService::class); } // ------------------------------------------------------------------------- diff --git a/Console/AnalyzeCommand.php b/Console/AnalyzeCommand.php index cdbb130..496623e 100644 --- a/Console/AnalyzeCommand.php +++ b/Console/AnalyzeCommand.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Core\Uptelligence\Console; +namespace Core\Mod\Uptelligence\Console; use Illuminate\Console\Command; -use Core\Uptelligence\Models\Vendor; -use Core\Uptelligence\Models\VersionRelease; -use Core\Uptelligence\Services\DiffAnalyzerService; -use Core\Uptelligence\Services\VendorStorageService; +use Core\Mod\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Models\VersionRelease; +use Core\Mod\Uptelligence\Services\DiffAnalyzerService; +use Core\Mod\Uptelligence\Services\VendorStorageService; class AnalyzeCommand extends Command { diff --git a/Console/CheckCommand.php b/Console/CheckCommand.php index 292dcc2..0b1093b 100644 --- a/Console/CheckCommand.php +++ b/Console/CheckCommand.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Core\Uptelligence\Console; +namespace Core\Mod\Uptelligence\Console; use Illuminate\Console\Command; -use Core\Uptelligence\Models\Vendor; -use Core\Uptelligence\Services\AssetTrackerService; -use Core\Uptelligence\Services\VendorStorageService; +use Core\Mod\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Services\AssetTrackerService; +use Core\Mod\Uptelligence\Services\VendorStorageService; class CheckCommand extends Command { diff --git a/Console/CheckUpdatesCommand.php b/Console/CheckUpdatesCommand.php index a72b5be..1fd89a0 100644 --- a/Console/CheckUpdatesCommand.php +++ b/Console/CheckUpdatesCommand.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Core\Uptelligence\Console; +namespace Core\Mod\Uptelligence\Console; use Illuminate\Console\Command; -use Core\Uptelligence\Models\Vendor; -use Core\Uptelligence\Services\AssetTrackerService; -use Core\Uptelligence\Services\VendorUpdateCheckerService; +use Core\Mod\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Services\AssetTrackerService; +use Core\Mod\Uptelligence\Services\VendorUpdateCheckerService; /** * Artisan command to check vendors and assets for upstream updates. diff --git a/Console/IssuesCommand.php b/Console/IssuesCommand.php index 158c86e..da7c4f9 100644 --- a/Console/IssuesCommand.php +++ b/Console/IssuesCommand.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Core\Uptelligence\Console; +namespace Core\Mod\Uptelligence\Console; use Illuminate\Console\Command; -use Core\Uptelligence\Models\UpstreamTodo; -use Core\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Models\UpstreamTodo; +use Core\Mod\Uptelligence\Models\Vendor; class IssuesCommand extends Command { diff --git a/Console/SendDigestsCommand.php b/Console/SendDigestsCommand.php index 6fed385..c7905da 100644 --- a/Console/SendDigestsCommand.php +++ b/Console/SendDigestsCommand.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Core\Uptelligence\Console; +namespace Core\Mod\Uptelligence\Console; use Illuminate\Console\Command; -use Core\Uptelligence\Models\UptelligenceDigest; -use Core\Uptelligence\Services\UptelligenceDigestService; +use Core\Mod\Uptelligence\Models\UptelligenceDigest; +use Core\Mod\Uptelligence\Services\UptelligenceDigestService; /** * Send Uptelligence digest emails to subscribed users. diff --git a/Controllers/Api/WebhookController.php b/Controllers/Api/WebhookController.php index a1cf114..57bb97e 100644 --- a/Controllers/Api/WebhookController.php +++ b/Controllers/Api/WebhookController.php @@ -2,16 +2,16 @@ declare(strict_types=1); -namespace Core\Uptelligence\Controllers\Api; +namespace Core\Mod\Uptelligence\Controllers\Api; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Routing\Controller; use Illuminate\Support\Facades\Log; -use Core\Uptelligence\Jobs\ProcessUptelligenceWebhook; -use Core\Uptelligence\Models\UptelligenceWebhook; -use Core\Uptelligence\Models\UptelligenceWebhookDelivery; -use Core\Uptelligence\Services\WebhookReceiverService; +use Core\Mod\Uptelligence\Jobs\ProcessUptelligenceWebhook; +use Core\Mod\Uptelligence\Models\UptelligenceWebhook; +use Core\Mod\Uptelligence\Models\UptelligenceWebhookDelivery; +use Core\Mod\Uptelligence\Services\WebhookReceiverService; /** * WebhookController - receives incoming vendor release webhooks. diff --git a/Jobs/CheckVendorUpdatesJob.php b/Jobs/CheckVendorUpdatesJob.php index 8287f6a..f3d3b8e 100644 --- a/Jobs/CheckVendorUpdatesJob.php +++ b/Jobs/CheckVendorUpdatesJob.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Jobs; +namespace Core\Mod\Uptelligence\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; @@ -10,9 +10,9 @@ use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; -use Core\Uptelligence\Models\Vendor; -use Core\Uptelligence\Services\AssetTrackerService; -use Core\Uptelligence\Services\VendorUpdateCheckerService; +use Core\Mod\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Services\AssetTrackerService; +use Core\Mod\Uptelligence\Services\VendorUpdateCheckerService; /** * Job to check vendors and assets for upstream updates. diff --git a/Jobs/ProcessUptelligenceWebhook.php b/Jobs/ProcessUptelligenceWebhook.php index c028c16..b47efa2 100644 --- a/Jobs/ProcessUptelligenceWebhook.php +++ b/Jobs/ProcessUptelligenceWebhook.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Jobs; +namespace Core\Mod\Uptelligence\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; @@ -10,9 +10,9 @@ use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; -use Core\Uptelligence\Models\UptelligenceWebhookDelivery; -use Core\Uptelligence\Notifications\NewReleaseDetected; -use Core\Uptelligence\Services\WebhookReceiverService; +use Core\Mod\Uptelligence\Models\UptelligenceWebhookDelivery; +use Core\Mod\Uptelligence\Notifications\NewReleaseDetected; +use Core\Mod\Uptelligence\Services\WebhookReceiverService; /** * ProcessUptelligenceWebhook - async processing of incoming vendor webhooks. @@ -129,13 +129,13 @@ class ProcessUptelligenceWebhook implements ShouldQueue * Send notification when a new release is detected. */ protected function sendReleaseNotification( - \Core\Uptelligence\Models\Vendor $vendor, + \Core\Mod\Uptelligence\Models\Vendor $vendor, array $parsedData, array $result ): void { try { // Get users subscribed to digest notifications for this vendor - $digests = \Core\Uptelligence\Models\UptelligenceDigest::where('is_enabled', true) + $digests = \Core\Mod\Uptelligence\Models\UptelligenceDigest::where('is_enabled', true) ->with('user') ->get(); diff --git a/Models/AnalysisLog.php b/Models/AnalysisLog.php index de677eb..4b426e8 100644 --- a/Models/AnalysisLog.php +++ b/Models/AnalysisLog.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Models/Asset.php b/Models/Asset.php index f2bb037..0c93d78 100644 --- a/Models/Asset.php +++ b/Models/Asset.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Models/AssetVersion.php b/Models/AssetVersion.php index 104c12a..923a81b 100644 --- a/Models/AssetVersion.php +++ b/Models/AssetVersion.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Models/DiffCache.php b/Models/DiffCache.php index 877b2ad..0714e19 100644 --- a/Models/DiffCache.php +++ b/Models/DiffCache.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Models/Pattern.php b/Models/Pattern.php index 70af7c2..3c4980e 100644 --- a/Models/Pattern.php +++ b/Models/Pattern.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Models/PatternCollection.php b/Models/PatternCollection.php index 259aa07..ebba51d 100644 --- a/Models/PatternCollection.php +++ b/Models/PatternCollection.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Models/PatternVariant.php b/Models/PatternVariant.php index 667c86f..3781426 100644 --- a/Models/PatternVariant.php +++ b/Models/PatternVariant.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Models/UpstreamTodo.php b/Models/UpstreamTodo.php index e73ac7d..2457e81 100644 --- a/Models/UpstreamTodo.php +++ b/Models/UpstreamTodo.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Models/UptelligenceDigest.php b/Models/UptelligenceDigest.php index 72cb959..c7ef72d 100644 --- a/Models/UptelligenceDigest.php +++ b/Models/UptelligenceDigest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Core\Mod\Tenant\Concerns\BelongsToWorkspace; use Core\Mod\Tenant\Models\User; diff --git a/Models/UptelligenceWebhook.php b/Models/UptelligenceWebhook.php index 77e75fd..1273e55 100644 --- a/Models/UptelligenceWebhook.php +++ b/Models/UptelligenceWebhook.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Models/UptelligenceWebhookDelivery.php b/Models/UptelligenceWebhookDelivery.php index 8785957..36bcf8f 100644 --- a/Models/UptelligenceWebhookDelivery.php +++ b/Models/UptelligenceWebhookDelivery.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Models/Vendor.php b/Models/Vendor.php index 4205085..3b21f85 100644 --- a/Models/Vendor.php +++ b/Models/Vendor.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Models/VersionRelease.php b/Models/VersionRelease.php index 2ae284c..67ff3ac 100644 --- a/Models/VersionRelease.php +++ b/Models/VersionRelease.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Models; +namespace Core\Mod\Uptelligence\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Notifications/NewReleaseDetected.php b/Notifications/NewReleaseDetected.php index a49ce22..48b30ab 100644 --- a/Notifications/NewReleaseDetected.php +++ b/Notifications/NewReleaseDetected.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Core\Uptelligence\Notifications; +namespace Core\Mod\Uptelligence\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; -use Core\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Models\Vendor; /** * NewReleaseDetected - notification when a vendor releases a new version. diff --git a/Notifications/SendUptelligenceDigest.php b/Notifications/SendUptelligenceDigest.php index d6d2bba..49c2324 100644 --- a/Notifications/SendUptelligenceDigest.php +++ b/Notifications/SendUptelligenceDigest.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace Core\Uptelligence\Notifications; +namespace Core\Mod\Uptelligence\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; use Illuminate\Support\Collection; -use Core\Uptelligence\Models\UptelligenceDigest; +use Core\Mod\Uptelligence\Models\UptelligenceDigest; /** * SendUptelligenceDigest - email notification for vendor update summaries. diff --git a/Services/AIAnalyzerService.php b/Services/AIAnalyzerService.php index b6b3f6e..957af52 100644 --- a/Services/AIAnalyzerService.php +++ b/Services/AIAnalyzerService.php @@ -2,16 +2,16 @@ declare(strict_types=1); -namespace Core\Uptelligence\Services; +namespace Core\Mod\Uptelligence\Services; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\RateLimiter; -use Core\Uptelligence\Models\AnalysisLog; -use Core\Uptelligence\Models\DiffCache; -use Core\Uptelligence\Models\UpstreamTodo; -use Core\Uptelligence\Models\VersionRelease; +use Core\Mod\Uptelligence\Models\AnalysisLog; +use Core\Mod\Uptelligence\Models\DiffCache; +use Core\Mod\Uptelligence\Models\UpstreamTodo; +use Core\Mod\Uptelligence\Models\VersionRelease; /** * AI Analyzer Service - uses AI to analyse version releases and create todos. diff --git a/Services/AssetTrackerService.php b/Services/AssetTrackerService.php index 1d21ea2..5204fd4 100644 --- a/Services/AssetTrackerService.php +++ b/Services/AssetTrackerService.php @@ -2,15 +2,15 @@ declare(strict_types=1); -namespace Core\Uptelligence\Services; +namespace Core\Mod\Uptelligence\Services; use Carbon\Carbon; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Process; use Illuminate\Support\Facades\RateLimiter; -use Core\Uptelligence\Models\Asset; -use Core\Uptelligence\Models\AssetVersion; +use Core\Mod\Uptelligence\Models\Asset; +use Core\Mod\Uptelligence\Models\AssetVersion; /** * Asset Tracker Service - monitors and updates package dependencies. diff --git a/Services/DiffAnalyzerService.php b/Services/DiffAnalyzerService.php index 87ffa04..e638784 100644 --- a/Services/DiffAnalyzerService.php +++ b/Services/DiffAnalyzerService.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Core\Uptelligence\Services; +namespace Core\Mod\Uptelligence\Services; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; @@ -10,10 +10,10 @@ use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Process; use InvalidArgumentException; -use Core\Uptelligence\Models\AnalysisLog; -use Core\Uptelligence\Models\DiffCache; -use Core\Uptelligence\Models\Vendor; -use Core\Uptelligence\Models\VersionRelease; +use Core\Mod\Uptelligence\Models\AnalysisLog; +use Core\Mod\Uptelligence\Models\DiffCache; +use Core\Mod\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Models\VersionRelease; /** * Diff Analyzer Service - analyses differences between vendor versions. diff --git a/Services/IssueGeneratorService.php b/Services/IssueGeneratorService.php index 7cc47e1..319727a 100644 --- a/Services/IssueGeneratorService.php +++ b/Services/IssueGeneratorService.php @@ -2,16 +2,16 @@ declare(strict_types=1); -namespace Core\Uptelligence\Services; +namespace Core\Mod\Uptelligence\Services; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\RateLimiter; use InvalidArgumentException; -use Core\Uptelligence\Models\AnalysisLog; -use Core\Uptelligence\Models\UpstreamTodo; -use Core\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Models\AnalysisLog; +use Core\Mod\Uptelligence\Models\UpstreamTodo; +use Core\Mod\Uptelligence\Models\Vendor; /** * Issue Generator Service - creates GitHub/Gitea issues from upstream todos. diff --git a/Services/UpstreamPlanGeneratorService.php b/Services/UpstreamPlanGeneratorService.php index dbdff19..eb1ee44 100644 --- a/Services/UpstreamPlanGeneratorService.php +++ b/Services/UpstreamPlanGeneratorService.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Core\Uptelligence\Services; +namespace Core\Mod\Uptelligence\Services; use Illuminate\Support\Collection; -use Core\Uptelligence\Models\UpstreamTodo; -use Core\Uptelligence\Models\Vendor; -use Core\Uptelligence\Models\VersionRelease; +use Core\Mod\Uptelligence\Models\UpstreamTodo; +use Core\Mod\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Models\VersionRelease; /** * Upstream Plan Generator Service - creates agent plans from version release analysis. diff --git a/Services/UptelligenceDigestService.php b/Services/UptelligenceDigestService.php index 64c0459..69188c4 100644 --- a/Services/UptelligenceDigestService.php +++ b/Services/UptelligenceDigestService.php @@ -2,15 +2,15 @@ declare(strict_types=1); -namespace Core\Uptelligence\Services; +namespace Core\Mod\Uptelligence\Services; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Log; -use Core\Uptelligence\Models\UpstreamTodo; -use Core\Uptelligence\Models\UptelligenceDigest; -use Core\Uptelligence\Models\Vendor; -use Core\Uptelligence\Models\VersionRelease; -use Core\Uptelligence\Notifications\SendUptelligenceDigest; +use Core\Mod\Uptelligence\Models\UpstreamTodo; +use Core\Mod\Uptelligence\Models\UptelligenceDigest; +use Core\Mod\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Models\VersionRelease; +use Core\Mod\Uptelligence\Notifications\SendUptelligenceDigest; /** * UptelligenceDigestService - generates and sends digest email notifications. diff --git a/Services/VendorStorageService.php b/Services/VendorStorageService.php index 2911d8a..1766c76 100644 --- a/Services/VendorStorageService.php +++ b/Services/VendorStorageService.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace Core\Uptelligence\Services; +namespace Core\Mod\Uptelligence\Services; use Illuminate\Contracts\Filesystem\Filesystem; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; -use Core\Uptelligence\Models\Vendor; -use Core\Uptelligence\Models\VersionRelease; +use Core\Mod\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Models\VersionRelease; use RuntimeException; use Symfony\Component\Process\Process; diff --git a/Services/VendorUpdateCheckerService.php b/Services/VendorUpdateCheckerService.php index 3c45814..8cf5d76 100644 --- a/Services/VendorUpdateCheckerService.php +++ b/Services/VendorUpdateCheckerService.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Core\Uptelligence\Services; +namespace Core\Mod\Uptelligence\Services; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\RateLimiter; -use Core\Uptelligence\Models\UpstreamTodo; -use Core\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Models\UpstreamTodo; +use Core\Mod\Uptelligence\Models\Vendor; /** * Vendor Update Checker Service - checks upstream sources for new releases. diff --git a/Services/WebhookReceiverService.php b/Services/WebhookReceiverService.php index b41158a..f8aff71 100644 --- a/Services/WebhookReceiverService.php +++ b/Services/WebhookReceiverService.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Core\Uptelligence\Services; +namespace Core\Mod\Uptelligence\Services; use Illuminate\Support\Facades\Log; -use Core\Uptelligence\Models\UptelligenceWebhook; -use Core\Uptelligence\Models\UptelligenceWebhookDelivery; -use Core\Uptelligence\Models\Vendor; -use Core\Uptelligence\Models\VersionRelease; +use Core\Mod\Uptelligence\Models\UptelligenceWebhook; +use Core\Mod\Uptelligence\Models\UptelligenceWebhookDelivery; +use Core\Mod\Uptelligence\Models\Vendor; +use Core\Mod\Uptelligence\Models\VersionRelease; /** * WebhookReceiverService - processes incoming vendor release webhooks. diff --git a/View/Blade/admin/digest-preferences.blade.php b/View/Blade/admin/digest-preferences.blade.php index 071990c..e1d8df1 100644 --- a/View/Blade/admin/digest-preferences.blade.php +++ b/View/Blade/admin/digest-preferences.blade.php @@ -30,7 +30,7 @@ Frequency - @foreach(\Core\Uptelligence\Models\UptelligenceDigest::getFrequencyOptions() as $value => $label) + @foreach(\Core\Mod\Uptelligence\Models\UptelligenceDigest::getFrequencyOptions() as $value => $label) canRetry()) { $delivery->scheduleRetry(); - \Core\Uptelligence\Jobs\ProcessUptelligenceWebhook::dispatch($delivery); + \Core\Mod\Uptelligence\Jobs\ProcessUptelligenceWebhook::dispatch($delivery); } unset($this->selectedWebhookDeliveries); diff --git a/changelog/2026/jan/code-review.md b/changelog/2026/jan/code-review.md new file mode 100644 index 0000000..dcac74a --- /dev/null +++ b/changelog/2026/jan/code-review.md @@ -0,0 +1,144 @@ +# Uptelligence Module Review + +**Updated:** 2026-01-21 - All recommended improvements implemented + +## Overview + +The Uptelligence module is an internal tooling system for tracking and managing upstream vendor software updates. It provides: + +1. **Vendor Tracking** - Monitor licensed software (66biolinks, Mixpost Pro/Enterprise), OSS projects, and plugins for version changes +2. **Diff Analysis** - Compare versions, cache diffs, and auto-categorise changes by type (security, controller, model, view, etc.) +3. **AI Analysis** - Use Claude or OpenAI to analyse diffs and generate prioritised porting todos +4. **Asset Tracking** - Monitor Composer/NPM packages, fonts, and CDN resources for updates +5. **Pattern Library** - Store reusable code patterns with variants for MCP context +6. **Issue Generation** - Auto-create GitHub/Gitea issues from todos +7. **Agent Plan Integration** - Generate structured porting plans for the Agentic module +8. **Cold Storage** - Archive vendor versions to S3 with on-demand retrieval + +## Production Readiness Score: 72/100 (was 60/100 - All recommended improvements implemented 2026-01-21) + +This module is well-designed architecturally. P1 critical issues fixed in Wave 1. All recommended improvements now implemented. + +## Critical Issues (Must Fix) + +- [x] **No database migrations** - FIXED: Created `2026_01_21_100000_create_uptelligence_tables.php` with all 10 tables +- [ ] **No Controllers/Routes** - No way to interact with the system via HTTP. No UI, no API endpoints +- [ ] **No Commands** - No artisan commands to run analyses, check for updates, or generate issues +- [ ] **No Tests** - Zero test coverage. No unit tests, feature tests, or factories +- [ ] **No Seeders** - No way to seed default vendors defined in config +- [x] **Dependency on Agentic module** - FIXED: `UpstreamPlanGeneratorService` now checks `agenticModuleAvailable()` before using Agentic models +- [ ] **API keys required** - AI analysis and GitHub/Gitea integration require API keys but no validation or graceful degradation +- [x] **DiffAnalyzerService shell injection risk** - FIXED: Now uses `Process::run(['diff', '-u', $prevPath, $currPath])` array syntax + +## Recommended Improvements + +- [x] **Add input validation on file paths in `DiffAnalyzerService::generateDiff()`** - FIXED: Path traversal validation added to prevent directory traversal attacks. +- [x] **Add rate limiting for AI API calls in `AIAnalyzerService`** - FIXED: Rate limiting implemented for AI analysis calls. +- [x] **Add retry logic with exponential backoff for external API calls** - FIXED: Retry logic with exponential backoff added for Packagist, NPM, GitHub, Gitea, Anthropic, and OpenAI calls. +- [x] **Add logging for all external API failures** - FIXED: Enhanced logging for API failures beyond just `report($e)`. +- [x] **Add database transactions in `DiffAnalyzerService::cacheDiffs()`** - FIXED: Database transactions added with rollback on failure. +- [x] **Add soft deletes to models for audit trail** - FIXED: Soft deletes added to relevant models. +- [x] **Add index on `diff_cache.version_release_id` and `upstream_todos.vendor_id`** - FIXED: Database performance indexes added. +- [x] **Add validation that vendor `target_repo` format is valid** - FIXED: Validation added before using `explode('/', ...)` in IssueGeneratorService. +- [x] **VendorStorageService uses both Laravel `Storage` facade and direct `file_exists()` calls** - FIXED: Standardised to use Storage facade throughout. +- [x] **Add config validation on boot to warn about missing API keys** - FIXED: Config validation added on boot. +- [ ] AssetTrackerService processes packages sequentially - could benefit from parallel processing for large checks +- [ ] Add webhook support for vendor notifications (currently only outbound notifications to Slack/Discord) +- [ ] Pattern model stores code as text - consider blob storage for large patterns +- [x] **Add timestamps validation for `released_at` in AssetVersion** - FIXED: Proper validation added instead of using fragile `now()->parse()`. + +## Missing Features (Future) + +- [ ] Livewire/Flux UI for managing vendors, viewing diffs, and tracking todos +- [ ] Scheduled job to auto-check vendors/assets for updates +- [ ] Webhook endpoint for receiving vendor release notifications +- [ ] CLI commands: `upstream:check`, `upstream:analyze`, `upstream:issues`, `upstream:sync-assets` +- [ ] Dashboard with metrics (pending todos, quick wins, security updates) +- [ ] Email digest notifications for new upstream releases +- [ ] Git submodule sync for OSS vendors (referenced in config but not implemented) +- [ ] Diff viewer UI with syntax highlighting +- [ ] Batch AI analysis with cost tracking +- [ ] Export/import of todos for external tracking systems +- [ ] Integration with project management tools (Linear, Jira) +- [ ] Automated PR creation for simple porting tasks +- [ ] Version comparison UI showing what's changed +- [ ] Pattern search and preview UI + +## Test Coverage Assessment + +**Current Coverage: 0%** + +No tests exist. The module needs: + +- Unit tests for all Models (scopes, helpers, relationships) +- Unit tests for DiffCache::detectCategory() +- Unit tests for Vendor path matching methods +- Feature tests for DiffAnalyzerService +- Feature tests for AIAnalyzerService (with mocked API responses) +- Feature tests for IssueGeneratorService (with mocked GitHub/Gitea APIs) +- Feature tests for VendorStorageService (local and S3 modes) +- Feature tests for AssetTrackerService +- Integration test for full analysis workflow +- Factories for all models + +## Security Concerns + +1. **Shell injection in DiffAnalyzerService** - FIXED: Now uses array syntax for Process::run(). + +2. **No authentication/authorisation** - When routes are added, they need proper guards. This is internal tooling and should be admin-only. + +3. **API tokens in config** - GitHub, Gitea, Anthropic, OpenAI tokens are stored in config. Ensure these are properly protected via `.env` and not logged. + +4. **S3 bucket access** - Vendor archives in S3 should use private ACL. Code doesn't explicitly set ACL. + +5. **Path traversal** - FIXED: Validation added to ensure slug contains no `../` sequences. + +6. **Arbitrary code patterns** - Pattern model stores code that could be surfaced via MCP. Ensure patterns are vetted before use. + +7. **SQL injection via search** - `Pattern::scopeSearch()` uses LIKE with user input. Currently safe due to Eloquent but worth noting. + +## Notes + +### Architecture + +The module follows good separation of concerns: +- Models are clean with well-defined scopes and helpers +- Services handle specific domains (diff analysis, AI, issues, storage) +- Config is comprehensive and uses env vars appropriately + +### Dependencies + +- Requires `Mod\Agentic` module for plan generation (soft dependency - now checks availability) +- External: Anthropic API, OpenAI API, GitHub API, Gitea API, Packagist, NPM registry, AWS S3 + +### Config Observations + +The config includes 3 pre-defined vendors (66biolinks, Mixpost Pro, Mixpost Enterprise) but no seeder to create them. + +The AI model defaults to `claude-sonnet-4-20250514` which is appropriate. + +S3 config supports dual endpoints (Hetzner Object Store pattern) which is good for the infrastructure. + +### Code Quality + +- Consistent use of `declare(strict_types=1)` +- Good PHPDoc on classes +- Constants defined for all magic strings +- Proper type hints throughout +- UK English spelling in documentation (colour, analyse, etc.) matching brand guidelines + +### Missing from Boot.php + +- Routes not registered (no routes file) +- No commands registered +- No event listeners +- No scheduled tasks +- DiffAnalyzerService and AssetTrackerService not registered as singletons (only Issue, Plan, and Storage services are) + +### Potential Quick Wins + +1. Create migrations from model definitions - DONE +2. Add basic artisan commands +3. Register DiffAnalyzerService and AssetTrackerService as singletons +4. Add a simple seeder for default vendors +5. Fix the shell injection in DiffAnalyzerService - DONE diff --git a/composer.json b/composer.json index d90ad6a..17bd0f5 100644 --- a/composer.json +++ b/composer.json @@ -14,18 +14,18 @@ }, "autoload": { "psr-4": { - "Core\\Uptelligence\\": "" + "Core\\Mod\\Uptelligence\\": "" } }, "autoload-dev": { "psr-4": { - "Core\\Uptelligence\\Tests\\": "tests/" + "Core\\Mod\\Uptelligence\\Tests\\": "tests/" } }, "extra": { "laravel": { "providers": [ - "Core\\Uptelligence\\Boot" + "Core\\Mod\\Uptelligence\\Boot" ] } }, diff --git a/routes/admin.php b/routes/admin.php index d3c82e5..0d9a582 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -1,13 +1,13 @@