[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FDQ9MD3NWJNAM7Q7229PCN":3,"skill-same:01M6FDQ9MD3NWJNAM7Q7229PCN":48},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":21,"linkOnly":22,"markdownContent":23,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":30,"ownerHtmlUrl":31,"ownerBlogUrl":6,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M6FDQ9MD3NWJNAM7Q7229PCN","laravel-constants-and-configuration",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fnoartem\u002Fskills\u002Flaravel-constants-and-configuration\u002FSKILL.md",[],[18,19,20],"laravel","configuration","laravel constants and configuration","2026-11-10 10:12:30",false,"# Constants and Configuration Values\n\nAvoid hardcoded values throughout your codebase. Use constants, configuration files, and enums to make your application more maintainable, refactorable, and debuggable.\n\n## The Problem with Hardcoded Values\n\n```php\n\u002F\u002F BAD: Magic numbers and strings scattered everywhere\nif ($user->role === 'admin') { \u002F\u002F What other roles exist?\n    $cacheTime = 3600; \u002F\u002F What does 3600 mean?\n}\n\nif ($order->status === 1) { \u002F\u002F What does 1 represent?\n    $discount = 0.15; \u002F\u002F Why 15%?\n}\n\nCache::remember('users_list', 600, fn() => ...); \u002F\u002F 600 what?\n```\n\n## Solution 1: PHP Constants and Enums\n\n### Class Constants\n\n```php\n\u002F\u002F app\u002FConstants\u002FUserRole.php\nclass UserRole\n{\n    public const ADMIN = 'admin';\n    public const EDITOR = 'editor';\n    public const VIEWER = 'viewer';\n    public const GUEST = 'guest';\n\n    public const ALL = [\n        self::ADMIN,\n        self::EDITOR,\n        self::VIEWER,\n        self::GUEST,\n    ];\n\n    public static function hasPermission(string $role, string $action): bool\n    {\n        return match($role) {\n            self::ADMIN => true,\n            self::EDITOR => in_array($action, ['read', 'write', 'edit']),\n            self::VIEWER => $action === 'read',\n            self::GUEST => false,\n            default => false,\n        };\n    }\n}\n\n\u002F\u002F Usage\nif ($user->role === UserRole::ADMIN) {\n    \u002F\u002F Clear intent\n}\n```\n\n### PHP 8.1+ Enums\n\n```php\n\u002F\u002F app\u002FEnums\u002FOrderStatus.php\nenum OrderStatus: string\n{\n    case PENDING = 'pending';\n    case PROCESSING = 'processing';\n    case SHIPPED = 'shipped';\n    case DELIVERED = 'delivered';\n    case CANCELLED = 'cancelled';\n    case REFUNDED = 'refunded';\n\n    public function label(): string\n    {\n        return match($this) {\n            self::PENDING => 'Pending Payment',\n            self::PROCESSING => 'Processing',\n            self::SHIPPED => 'Shipped',\n            self::DELIVERED => 'Delivered',\n            self::CANCELLED => 'Cancelled',\n            self::REFUNDED => 'Refunded',\n        };\n    }\n\n    public function color(): string\n    {\n        return match($this) {\n            self::PENDING => 'yellow',\n            self::PROCESSING => 'blue',\n            self::SHIPPED => 'indigo',\n            self::DELIVERED => 'green',\n            self::CANCELLED => 'red',\n            self::REFUNDED => 'gray',\n        };\n    }\n\n    public function canTransitionTo(self $newStatus): bool\n    {\n        return match($this) {\n            self::PENDING => in_array($newStatus, [\n                self::PROCESSING,\n                self::CANCELLED,\n            ]),\n            self::PROCESSING => in_array($newStatus, [\n                self::SHIPPED,\n                self::CANCELLED,\n            ]),\n            self::SHIPPED => $newStatus === self::DELIVERED,\n            self::DELIVERED => $newStatus === self::REFUNDED,\n            default => false,\n        };\n    }\n}\n\n\u002F\u002F Model with enum casting\nclass Order extends Model\n{\n    protected $casts = [\n        'status' => OrderStatus::class,\n    ];\n\n    public function transitionTo(OrderStatus $newStatus): void\n    {\n        if (!$this->status->canTransitionTo($newStatus)) {\n            throw new InvalidStateTransition(\n                \"Cannot transition from {$this->status->value} to {$newStatus->value}\"\n            );\n        }\n\n        $this->update(['status' => $newStatus]);\n    }\n}\n\n\u002F\u002F Usage\n$order->transitionTo(OrderStatus::PROCESSING);\n```\n\n## Solution 2: Configuration Files\n\n### Application-Wide Settings\n\n```php\n\u002F\u002F config\u002Fapp.php\nreturn [\n    'cache_ttl' => [\n        'short' => 60,      \u002F\u002F 1 minute\n        'medium' => 300,    \u002F\u002F 5 minutes\n        'long' => 3600,     \u002F\u002F 1 hour\n        'day' => 86400,     \u002F\u002F 24 hours\n    ],\n\n    'pagination' => [\n        'default' => 20,\n        'max' => 100,\n        'options' => [10, 20, 50, 100],\n    ],\n\n    'upload' => [\n        'max_file_size' => 10 * 1024 * 1024, \u002F\u002F 10MB\n        'allowed_extensions' => ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx'],\n        'storage_path' => 'uploads',\n    ],\n\n    'business' => [\n        'tax_rate' => 0.08,\n        'shipping_threshold' => 50.00,\n        'discount_tiers' => [\n            'bronze' => 0.05,\n            'silver' => 0.10,\n            'gold' => 0.15,\n            'platinum' => 0.20,\n        ],\n    ],\n];\n\n\u002F\u002F Usage\nCache::remember(\n    'products',\n    config('app.cache_ttl.long'),\n    fn() => Product::all()\n);\n\n$maxSize = config('app.upload.max_file_size');\n```\n\n### Feature-Specific Configuration\n\n```php\n\u002F\u002F config\u002Fpayment.php\nreturn [\n    'stripe' => [\n        'key' => env('STRIPE_KEY'),\n        'secret' => env('STRIPE_SECRET'),\n        'webhook_secret' => env('STRIPE_WEBHOOK_SECRET'),\n        'webhook_tolerance' => 300, \u002F\u002F seconds\n        'currency' => 'usd',\n        'minimum_amount' => 50, \u002F\u002F cents\n    ],\n\n    'retry' => [\n        'max_attempts' => 3,\n        'delay_seconds' => [5, 10, 30],\n    ],\n\n    'statuses' => [\n        'pending' => 'pending',\n        'processing' => 'processing',\n        'succeeded' => 'succeeded',\n        'failed' => 'failed',\n    ],\n];\n\n\u002F\u002F Usage in service\nclass PaymentService\n{\n    public function charge(int $amount): void\n    {\n        if ($amount \u003C config('payment.stripe.minimum_amount')) {\n            throw new InvalidAmountException('Amount below minimum');\n        }\n\n        \u002F\u002F Process payment\n    }\n}\n```\n\n## Solution 3: Database-Driven Configuration\n\n### Settings Model\n\n```php\n\u002F\u002F app\u002FModels\u002FSetting.php\nclass Setting extends Model\n{\n    protected $fillable = ['key', 'value', 'type'];\n\n    protected $casts = [\n        'value' => 'json',\n    ];\n\n    public static function get(string $key, mixed $default = null): mixed\n    {\n        return Cache::remember(\n            \"settings.{$key}\",\n            config('app.cache_ttl.long'),\n            fn() => static::where('key', $key)->first()?->value ?? $default\n        );\n    }\n\n    public static function set(string $key, mixed $value): void\n    {\n        static::updateOrCreate(\n            ['key' => $key],\n            ['value' => $value]\n        );\n\n        Cache::forget(\"settings.{$key}\");\n    }\n\n    protected static function booted(): void\n    {\n        static::saved(function ($setting) {\n            Cache::forget(\"settings.{$setting->key}\");\n        });\n    }\n}\n\n\u002F\u002F Usage\n$maintenanceMode = Setting::get('maintenance_mode', false);\n$maxLoginAttempts = Setting::get('max_login_attempts', 5);\n```\n\n## Solution 4: Service Constants\n\n```php\n\u002F\u002F app\u002FServices\u002FCacheService.php\nclass CacheService\n{\n    \u002F\u002F Cache key patterns\n    public const USER_KEY = 'user:%d';\n    public const USER_POSTS_KEY = 'user:%d:posts';\n    public const POST_KEY = 'post:%d';\n    public const TRENDING_KEY = 'trending:%s:page:%d';\n\n    \u002F\u002F Cache tags\n    public const TAG_USERS = 'users';\n    public const TAG_POSTS = 'posts';\n    public const TAG_COMMENTS = 'comments';\n\n    public static function getUserKey(int $userId): string\n    {\n        return sprintf(self::USER_KEY, $userId);\n    }\n\n    public static function getUserPostsKey(int $userId): string\n    {\n        return sprintf(self::USER_POSTS_KEY, $userId);\n    }\n\n    public static function rememberUser(int $userId, Closure $callback)\n    {\n        return Cache::tags([self::TAG_USERS])->remember(\n            self::getUserKey($userId),\n            config('app.cache_ttl.medium'),\n            $callback\n        );\n    }\n}\n\n\u002F\u002F Usage\n$user = CacheService::rememberUser($userId, fn() => User::find($userId));\n```\n\n## Solution 5: Validation Constants\n\n```php\n\u002F\u002F app\u002FRules\u002FValidationRules.php\nclass ValidationRules\n{\n    public const NAME_REGEX = '\u002F^[a-zA-Z\\s\\-\\']+$\u002F';\n    public const PHONE_REGEX = '\u002F^\\+?[1-9]\\d{1,14}$\u002F';\n    public const USERNAME_REGEX = '\u002F^[a-zA-Z0-9_]{3,20}$\u002F';\n    public const SLUG_REGEX = '\u002F^[a-z0-9\\-]+$\u002F';\n\n    public const PASSWORD_MIN = 8;\n    public const PASSWORD_MAX = 128;\n    public const BIO_MAX = 500;\n    public const COMMENT_MAX = 1000;\n\n    public static function password(): array\n    {\n        return [\n            'required',\n            'string',\n            'min:' . self::PASSWORD_MIN,\n            'max:' . self::PASSWORD_MAX,\n            Password::defaults(),\n        ];\n    }\n\n    public static function username(): array\n    {\n        return [\n            'required',\n            'string',\n            'regex:' . self::USERNAME_REGEX,\n            'unique:users,username',\n        ];\n    }\n}\n\n\u002F\u002F In FormRequest\npublic function rules(): array\n{\n    return [\n        'username' => ValidationRules::username(),\n        'password' => ValidationRules::password(),\n        'bio' => ['nullable', 'string', 'max:' . ValidationRules::BIO_MAX],\n    ];\n}\n```\n\n## Solution 6: HTTP Status Constants\n\n```php\n\u002F\u002F app\u002FHttp\u002FResponses\u002FApiResponse.php\nclass ApiResponse\n{\n    \u002F\u002F Standard HTTP codes as constants for clarity\n    public const OK = 200;\n    public const CREATED = 201;\n    public const ACCEPTED = 202;\n    public const NO_CONTENT = 204;\n    public const BAD_REQUEST = 400;\n    public const UNAUTHORIZED = 401;\n    public const FORBIDDEN = 403;\n    public const NOT_FOUND = 404;\n    public const VALIDATION_ERROR = 422;\n    public const SERVER_ERROR = 500;\n\n    \u002F\u002F Custom application codes\n    public const CODE_SUCCESS = 1000;\n    public const CODE_VALIDATION_FAILED = 2001;\n    public const CODE_RESOURCE_NOT_FOUND = 2002;\n    public const CODE_UNAUTHORIZED_ACTION = 2003;\n    public const CODE_RATE_LIMITED = 2004;\n\n    public static function success($data = null, string $message = 'Success'): JsonResponse\n    {\n        return response()->json([\n            'success' => true,\n            'code' => self::CODE_SUCCESS,\n            'message' => $message,\n            'data' => $data,\n        ], self::OK);\n    }\n\n    public static function error(string $message, int $httpCode = self::BAD_REQUEST, int $appCode = null): JsonResponse\n    {\n        return response()->json([\n            'success' => false,\n            'code' => $appCode ?? $httpCode,\n            'message' => $message,\n        ], $httpCode);\n    }\n}\n\n\u002F\u002F Usage\nreturn ApiResponse::success($user, 'User created successfully');\nreturn ApiResponse::error('Resource not found', ApiResponse::NOT_FOUND);\n```\n\n## Solution 7: Queue Priorities and Job Constants\n\n```php\n\u002F\u002F app\u002FJobs\u002FJobPriority.php\nclass JobPriority\n{\n    public const CRITICAL = 'critical';\n    public const HIGH = 'high';\n    public const NORMAL = 'default';\n    public const LOW = 'low';\n\n    public const MAX_TRIES = [\n        self::CRITICAL => 5,\n        self::HIGH => 3,\n        self::NORMAL => 3,\n        self::LOW => 1,\n    ];\n\n    public const TIMEOUT = [\n        self::CRITICAL => 300,  \u002F\u002F 5 minutes\n        self::HIGH => 180,      \u002F\u002F 3 minutes\n        self::NORMAL => 120,    \u002F\u002F 2 minutes\n        self::LOW => 60,        \u002F\u002F 1 minute\n    ];\n}\n\n\u002F\u002F app\u002FJobs\u002FProcessPayment.php\nclass ProcessPayment implements ShouldQueue\n{\n    public $tries = JobPriority::MAX_TRIES[JobPriority::HIGH];\n    public $timeout = JobPriority::TIMEOUT[JobPriority::HIGH];\n\n    public function __construct(\n        public Payment $payment\n    ) {}\n\n    public function handle(): void\n    {\n        \u002F\u002F Process payment\n    }\n\n    public function queue(): string\n    {\n        return JobPriority::HIGH;\n    }\n}\n```\n\n## Environment-Specific Constants\n\n```php\n\u002F\u002F app\u002FProviders\u002FAppServiceProvider.php\nclass AppServiceProvider extends ServiceProvider\n{\n    public function boot(): void\n    {\n        \u002F\u002F Define environment-specific constants\n        if (app()->environment('local', 'testing')) {\n            Config::set('app.debug_mode', true);\n            Config::set('app.cache_ttl.short', 1); \u002F\u002F Shorter cache in dev\n        }\n\n        if (app()->environment('production')) {\n            Config::set('app.debug_mode', false);\n            Config::set('app.rate_limit', 60); \u002F\u002F Stricter in production\n        }\n    }\n}\n```\n\n## Testing with Constants\n\n```php\ntest('order status transitions work correctly', function () {\n    $order = Order::factory()->create([\n        'status' => OrderStatus::PENDING\n    ]);\n\n    \u002F\u002F Valid transition\n    $order->transitionTo(OrderStatus::PROCESSING);\n    expect($order->status)->toBe(OrderStatus::PROCESSING);\n\n    \u002F\u002F Invalid transition\n    expect(fn() => $order->transitionTo(OrderStatus::PENDING))\n        ->toThrow(InvalidStateTransition::class);\n});\n\ntest('cache keys are consistent', function () {\n    $userId = 123;\n\n    $key1 = CacheService::getUserKey($userId);\n    $key2 = sprintf(CacheService::USER_KEY, $userId);\n\n    expect($key1)->toBe($key2)\n        ->and($key1)->toBe('user:123');\n});\n\ntest('validation rules are applied correctly', function () {\n    $data = ['username' => 'ab']; \u002F\u002F Too short\n\n    $validator = Validator::make($data, [\n        'username' => ValidationRules::username()\n    ]);\n\n    expect($validator->fails())->toBeTrue();\n});\n```\n\n## Best Practices\n\n1. **Group related constants**\n\n   ```php\n   class OrderConstants\n   {\n       \u002F\u002F Statuses\n       public const STATUS_PENDING = 'pending';\n       public const STATUS_PAID = 'paid';\n\n       \u002F\u002F Limits\n       public const MAX_ITEMS = 100;\n       public const MIN_TOTAL = 10.00;\n   }\n   ```\n\n2. **Use descriptive names**\n\n   ```php\n   \u002F\u002F BAD\n   const TIMEOUT = 30;\n\n   \u002F\u002F GOOD\n   const API_TIMEOUT_SECONDS = 30;\n   ```\n\n3. **Document units and meanings**\n\n   ```php\n   class RateLimits\n   {\n       \u002F** Maximum requests per minute for anonymous users *\u002F\n       public const ANONYMOUS_PER_MINUTE = 20;\n\n       \u002F** Maximum requests per minute for authenticated users *\u002F\n       public const AUTHENTICATED_PER_MINUTE = 60;\n\n       \u002F** Lockout duration in minutes after max attempts *\u002F\n       public const LOCKOUT_MINUTES = 15;\n   }\n   ```\n\n4. **Validate against constants**\n\n   ```php\n   public function setRole(string $role): void\n   {\n       if (!in_array($role, UserRole::ALL)) {\n           throw new InvalidArgumentException(\"Invalid role: {$role}\");\n       }\n\n       $this->role = $role;\n   }\n   ```\n\n5. **Use configuration for environment-specific values**\n\n   ```php\n   \u002F\u002F Don't use constants for environment-specific values\n   \u002F\u002F BAD: const API_KEY = 'abc123';\n\n   \u002F\u002F GOOD: Use config\n   'api_key' => env('EXTERNAL_API_KEY'),\n   ```\n\n6. **Create helper functions for complex constants**\n\n   ```php\n   class DateConstants\n   {\n       public static function secondsIn(string $unit): int\n       {\n           return match($unit) {\n               'minute' => 60,\n               'hour' => 3600,\n               'day' => 86400,\n               'week' => 604800,\n               default => throw new InvalidArgumentException(\"Unknown unit: {$unit}\")\n           };\n       }\n   }\n\n   \u002F\u002F Usage\n   $cacheTime = DateConstants::secondsIn('hour') * 2; \u002F\u002F 2 hours\n   ```\n\nRemember: Constants make your code self-documenting, reduce bugs from typos, and make refactoring much safer!\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fnoartem\u002Fskills\u002Flaravel-constants-and-configuration",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill laravel-constants-and-configuration",{"tool":40,"command":41},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill laravel-constants-and-configuration",{"tool":43,"command":44},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill laravel-constants-and-configuration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fnoartem\u002Fskills\u002Flaravel-constants-and-configuration\u002FSKILL.md",true,[],[49,63,73,82,88,95],{"skillNo":50,"name":51,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":52,"categories":53,"keywords":59,"publishedAt":21},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[54],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[60,61,62],"model","model hierarchy","model hierarchy skill",{"skillNo":64,"name":65,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":69,"publishedAt":21},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[68],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},[70,71,72],"MCP","zoom","zoom mcp",{"skillNo":74,"name":75,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":21},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[79,80,81,71],"sdk","zoom apps sdk","apps",{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":21},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[84],{"skillNo":89,"name":90,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":94,"publishedAt":21},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[93],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},[90],{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":21},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[97]]