'array', 'required_assets' => 'array', 'quality_score' => 'decimal:2', 'is_vetted' => 'boolean', 'is_active' => 'boolean', ]; // Relationships public function variants(): HasMany { return $this->hasMany(PatternVariant::class); } // Scopes public function scopeActive($query) { return $query->where('is_active', true); } public function scopeVetted($query) { return $query->where('is_vetted', true); } public function scopeCategory($query, string $category) { return $query->where('category', $category); } public function scopeLanguage($query, string $language) { return $query->where('language', $language); } public function scopeWithTag($query, string $tag) { return $query->whereJsonContains('tags', $tag); } public function scopeSearch($query, string $search) { return $query->where(function ($q) use ($search) { $q->where('name', 'like', "%{$search}%") ->orWhere('description', 'like', "%{$search}%") ->orWhereJsonContains('tags', $search); }); } // Helpers public function getCategoryIcon(): string { return match ($this->category) { self::CATEGORY_COMPONENT => '🧩', self::CATEGORY_LAYOUT => '📐', self::CATEGORY_THEME => '🎨', self::CATEGORY_SNIPPET => '📝', self::CATEGORY_WORKFLOW => '⚙️', self::CATEGORY_TEMPLATE => '📄', default => '📦', }; } public function getLanguageIcon(): string { return match ($this->language) { 'blade' => '🔹', 'vue' => '💚', 'react' => '⚛️', 'css' => '🎨', 'php' => '🐘', 'javascript', 'js' => '💛', 'typescript', 'ts' => '💙', default => '📄', }; } public function incrementUsage(): void { $this->increment('usage_count'); } public function getRequiredAssetsObjects(): array { if (empty($this->required_assets)) { return []; } return Asset::whereIn('slug', $this->required_assets)->get()->all(); } // For MCP context public function toMcpContext(): array { return [ 'name' => $this->name, 'slug' => $this->slug, 'category' => $this->category, 'language' => $this->language, 'description' => $this->description, 'tags' => $this->tags, 'code' => $this->code, 'usage_example' => $this->usage_example, 'required_assets' => $this->required_assets, 'source' => $this->source_type, 'is_vetted' => $this->is_vetted, 'variants' => $this->variants->map(fn ($v) => [ 'name' => $v->name, 'code' => $v->code, 'notes' => $v->notes, ])->all(), ]; } }