[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EA8ET6DQMDTGD64PSYA5MP":3,"skill-same:01M6EA8ET6DQMDTGD64PSYA5MP":84},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":61,"commitSha":62,"skillDirectory":63,"forksCount":64,"repositoryHtmlUrl":65,"repositoryHomepageUrl":66,"ownerHtmlUrl":67,"ownerBlogUrl":6,"ownerDescription":68,"updatedAt":69,"install":70,"resources":83},"01M6EA8ET6DQMDTGD64PSYA5MP","elixir-antipatterns",null,"Core catalog of 8 critical Elixir\u002FPhoenix anti-patterns covering error handling, separation of concerns, Ecto queries, and testing.  Trigger: During Elixir code review, refactoring sessions, or when writing Phoenix\u002FEcto code.","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\u002FGentleman-Programming\u002FGentleman-Skills\u002Felixir-antipatterns\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"elixir antipatterns","elixir","catalog","separation","error","separation of concerns","ecto","trigger","critical","patterns","anti-patterns","code review","refactoring","error handling","code","core","sessions","review","writing","testing","2026-11-10 10:12:30",false,"---\nname: elixir-antipatterns\ndescription: >\n  Core catalog of 8 critical Elixir\u002FPhoenix anti-patterns covering error handling,\n  separation of concerns, Ecto queries, and testing. \n  Trigger: During Elixir code review, refactoring sessions, or when writing Phoenix\u002FEcto code.\nmetadata:\n  author: tsardinasGitHub\n  version: \"1.0\"\n---\n\n# Elixir Anti-Patterns\n\nCritical anti-patterns that compromise robustness and maintainability in Elixir\u002FPhoenix applications.\n\n> **Complement with**: `mix format` and `Credo` for style enforcement  \n> **Extended reference**: See `EXTENDED.md` for 40+ patterns and deep-dive examples\n\n---\n\n## When to Use\n\n**Topics:** Error handling (3 patterns) • Architecture (2 patterns) • Performance (2 patterns) • Testing (1 pattern)\n\nLoad this skill when:\n- Writing Elixir modules and functions\n- Working with Phoenix Framework (Controllers, LiveView)\n- Building Ecto schemas and database queries\n- Implementing BEAM concurrency (Task, GenServer)\n- Handling errors with tagged tuples\n- Writing tests with ExUnit\n\n---\n\n## Critical Patterns\n\nQuick reference to the 8 core patterns this skill enforces:\n\n1. **Tagged Tuples**: Return `{:ok, value} | {:error, reason}` instead of `nil` or exceptions\n2. **Explicit @spec**: Document error cases in function signatures\n3. **Context Separation**: Business logic in contexts, not LiveView\n4. **Preload Associations**: Use `Repo.preload\u002F2` to avoid N+1 queries\n5. **with Arrow Binding**: Use `\u003C-` for all failable operations in `with`\n6. **Database Indexes**: Index frequently queried columns\n7. **Test Assertions**: Every test must assert expected behavior\n8. **Cohesive Functions**: Group `with` chains >4 steps into functions\n\n> See `## Anti-Patterns` section below for detailed ❌ BAD \u002F ✅ CORRECT code examples.\n\n---\n\n## Code Examples\n\n### Example 1: Error Handling with Tagged Tuples\n\n```elixir\n# ✅ CORRECT - Errors as values, explicit in @spec\ndefmodule UserService do\n  @spec fetch_user(String.t()) :: {:ok, User.t()} | {:error, :not_found}\n  def fetch_user(id) do\n    case Repo.get(User, id) do\n      nil -> {:error, :not_found}\n      user -> {:ok, user}\n    end\n  end\nend\n\n# ❌ BAD - Exceptions for business errors\ndef fetch_user(id) do\n  Repo.get(User, id) || raise \"User not found\"\nend\n```\n\n### Example 2: Phoenix LiveView with Context Separation\n\n```\nArchitecture Layers:\n  User Request → LiveView (UI only) → Context (business logic) → Schema\u002FRepo (data)\n               ↓                    ↓                           ↓\n           handle_event()     Accounts.create_user()      Repo.insert()\n```\n\n```elixir\n# ✅ CORRECT - Thin LiveView, logic in context\ndefmodule MyAppWeb.UserLive.Index do\n  use MyAppWeb, :live_view\n  \n  def handle_event(\"create\", params, socket) do\n    case Accounts.create_user(params) do\n      {:ok, user} -> {:noreply, redirect(socket, to: ~p\"\u002Fusers\u002F#{user}\")}\n      {:error, changeset} -> {:noreply, assign(socket, changeset: changeset)}\n    end\n  end\nend\n\n# ❌ BAD - Business logic in LiveView\ndef handle_event(\"create\", %{\"user\" => params}, socket) do\n  if String.length(params[\"name\"]) \u003C 3 do\n    {:noreply, put_flash(socket, :error, \"Too short\")}\n  else\n    case Repo.insert(User.changeset(%User{}, params)) do\n      {:ok, user} -> send_email(user); redirect(socket)\n    end\n  end\nend\n```\n\n### Example 3: Ecto N+1 Query Optimization\n\n```elixir\n# ✅ CORRECT - Preload associations (2 queries total)\nusers = User |> Repo.all() |> Repo.preload(:posts)\nEnum.map(users, fn user -> process(user, user.posts) end)\n\n# Note: For complex filtering (e.g., WHERE posts.status = 'published'),\n# use join + preload in the query itself. See EXTENDED.md for advanced patterns.\n\n# ❌ BAD - Query in loop (101 queries for 100 users)\nusers = Repo.all(User)\nEnum.map(users, fn user ->\n  posts = Repo.all(from p in Post, where: p.user_id == ^user.id)\n  {user, posts}\nend)\n```\n\n---\n\n## Anti-Patterns\n\n### Error Management\n\n#### Don't: Use `raise` for Business Errors\n\n```elixir\n# ❌ BAD\ndef fetch_user(id) do\n  Repo.get(User, id) || raise \"User not found\"\nend\n\n# ✅ CORRECT\n@spec fetch_user(String.t()) :: {:ok, User.t()} | {:error, :not_found}\ndef fetch_user(id) do\n  case Repo.get(User, id) do\n    nil -> {:error, :not_found}\n    user -> {:ok, user}\n  end\nend\n```\n\n**Why**: `@spec` documents errors, pattern matching forces explicit handling.\n\n---\n\n#### Don't: Return `nil` for Errors\n\n```elixir\n# ❌ BAD - No context on failure\ndef find_user(email), do: Repo.get_by(User, email: email)\n\n# ✅ CORRECT - Explicit error reason\n@spec find_user(String.t()) :: {:ok, User.t()} | {:error, :not_found}\ndef find_user(email) do\n  case Repo.get_by(User, email: email) do\n    nil -> {:error, :not_found}\n    user -> {:ok, user}\n  end\nend\n```\n\n---\n\n#### Don't: Use `=` Inside `with` for Failable Operations\n\n```elixir\n# ❌ BAD - Validate errors silenced\nwith {:ok, user} \u003C- fetch_user(id),\n     validated = validate(user),  # ← Doesn't check for {:error, _}\n     {:ok, saved} \u003C- save(validated) do\n  {:ok, saved}\nend\n\n# ✅ CORRECT - All operations use \u003C-\nwith {:ok, user} \u003C- fetch_user(id),\n     {:ok, validated} \u003C- validate(user),\n     {:ok, saved} \u003C- save(validated) do\n  {:ok, saved}\nend\n```\n\n---\n\n### Architecture & Boundaries\n\n#### Don't: Put Business Logic in LiveView\n\n```elixir\n# ❌ BAD - Validation in view\ndef handle_event(\"create\", %{\"user\" => params}, socket) do\n  if String.length(params[\"name\"]) \u003C 3 do\n    {:noreply, put_flash(socket, :error, \"Too short\")}\n  else\n    case Repo.insert(User.changeset(%User{}, params)) do\n      {:ok, user} -> redirect(socket)\n    end\n  end\nend\n\n# ✅ CORRECT - Delegate to context\ndef handle_event(\"create\", params, socket) do\n  case Accounts.create_user(params) do\n    {:ok, user} -> {:noreply, redirect(socket, to: ~p\"\u002Fusers\u002F#{user}\")}\n    {:error, changeset} -> {:noreply, assign(socket, changeset: changeset)}\n  end\nend\n```\n\n**Why**: Contexts testable without Phoenix, logic reusable.\n\n---\n\n#### Don't: Chain More Than 4 Steps in `with`\n\n```elixir\n# ❌ BAD - Too many responsibilities\nwith {:ok, a} \u003C- step1(),\n     {:ok, b} \u003C- step2(a),\n     {:ok, c} \u003C- step3(b),\n     {:ok, d} \u003C- step4(c),\n     {:ok, e} \u003C- step5(d) do\n  {:ok, e}\nend\n\n# ✅ CORRECT - Group into cohesive functions\nwith {:ok, validated} \u003C- validate_and_fetch(id),\n     {:ok, processed} \u003C- process_business_rules(validated),\n     {:ok, result} \u003C- persist_and_notify(processed) do\n  {:ok, result}\nend\n```\n\n---\n\n### Data & Performance\n\n#### Don't: Query Inside Loops (N+1)\n\n```elixir\n# ❌ BAD - 101 queries for 100 users\nusers = Repo.all(User)\nEnum.map(users, fn user ->\n  posts = Repo.all(from p in Post, where: p.user_id == ^user.id)\nend)\n\n# ✅ CORRECT - 2 queries total\nUser |> Repo.all() |> Repo.preload(:posts)\n```\n\n**Impact**: 100 users with N+1 = 10 seconds vs 5ms with preload.\n\n---\n\n#### Don't: Query Without Indexes\n\n```elixir\n# ❌ BAD - No index on frequently queried column\n# Migration:\ncreate table(:users) do\n  add :email, :string\nend\n\n# ✅ CORRECT - Add index\ncreate table(:users) do\n  add :email, :string\nend\ncreate unique_index(:users, [:email])\n```\n\n**Why**: Full table scan on 1M+ rows vs instant index lookup.\n\n---\n\n### Testing\n\n#### Don't: Write Tests Without Assertions\n\n```elixir\n# ❌ BAD - What's being tested?\ntest \"creates user\" do\n  UserService.create_user(%{name: \"Juan\"})\nend\n\n# ✅ CORRECT - Assert expected behavior\ntest \"creates user successfully\" do\n  assert {:ok, user} = UserService.create_user(%{name: \"Juan\"})\n  assert user.name == \"Juan\"\nend\n```\n\n---\n\n## Quick Reference\n\n| Situation | Anti-Pattern | Correct Pattern |\n|-----------|--------------|-----------------|\n| **Error handling** | `raise \"Not found\"` | `{:error, :not_found}` |\n| **Missing data** | Return `nil` | `{:error, :not_found}` |\n| **Business logic** | In LiveView | In context modules |\n| **Associations** | `Enum.map` + `Repo.get` | `Repo.preload` |\n| **with chains** | `validated = fn()` | `{:ok, validated} \u003C- fn()` |\n| **Frequent queries** | No index | `create index(:table, [:column])` |\n| **Testing** | No assertions | `assert` expected behavior |\n| **Complex logic** | 6+ step `with` | Group into 3 functions |\n\n---\n\n## Resources\n\n- [Elixir Style Guide](https:\u002F\u002Fhexdocs.pm\u002Felixir\u002Fnaming-conventions.html)\n- [Phoenix Contexts](https:\u002F\u002Fhexdocs.pm\u002Fphoenix\u002Fcontexts.html)\n- [Ecto Query Performance](https:\u002F\u002Fhexdocs.pm\u002Fecto\u002FEcto.Query.html)\n- [ExUnit Best Practices](https:\u002F\u002Fhexdocs.pm\u002Fex_unit\u002FExUnit.html)\n- **Extended patterns**: See `EXTENDED.md` for 40+ anti-patterns\n","# Elixir Anti-Patterns\n\nCritical anti-patterns that compromise robustness and maintainability in Elixir\u002FPhoenix applications.\n\n> **Complement with**: `mix format` and `Credo` for style enforcement  \n> **Extended reference**: See `EXTENDED.md` for 40+ patterns and deep-dive examples\n\n---\n\n## When to Use\n\n**Topics:** Error handling (3 patterns) • Architecture (2 patterns) • Performance (2 patterns) • Testing (1 pattern)\n\nLoad this skill when:\n- Writing Elixir modules and functions\n- Working with Phoenix Framework (Controllers, LiveView)\n- Building Ecto schemas and database queries\n- Implementing BEAM concurrency (Task, GenServer)\n- Handling errors with tagged tuples\n- Writing tests with ExUnit\n\n---\n\n## Critical Patterns\n\nQuick reference to the 8 core patterns this skill enforces:\n\n1. **Tagged Tuples**: Return `{:ok, value} | {:error, reason}` instead of `nil` or exceptions\n2. **Explicit @spec**: Document error cases in function signatures\n3. **Context Separation**: Business logic in contexts, not LiveView\n4. **Preload Associations**: Use `Repo.preload\u002F2` to avoid N+1 queries\n5. **with Arrow Binding**: Use `\u003C-` for all failable operations in `with`\n6. **Database Indexes**: Index frequently queried columns\n7. **Test Assertions**: Every test must assert expected behavior\n8. **Cohesive Functions**: Group `with` chains >4 steps into functions\n\n> See `## Anti-Patterns` section below for detailed ❌ BAD \u002F ✅ CORRECT code examples.\n\n---\n\n## Code Examples\n\n### Example 1: Error Handling with Tagged Tuples\n\n```elixir\n# ✅ CORRECT - Errors as values, explicit in @spec\ndefmodule UserService do\n  @spec fetch_user(String.t()) :: {:ok, User.t()} | {:error, :not_found}\n  def fetch_user(id) do\n    case Repo.get(User, id) do\n      nil -> {:error, :not_found}\n      user -> {:ok, user}\n    end\n  end\nend\n\n# ❌ BAD - Exceptions for business errors\ndef fetch_user(id) do\n  Repo.get(User, id) || raise \"User not found\"\nend\n```\n\n### Example 2: Phoenix LiveView with Context Separation\n\n```\nArchitecture Layers:\n  User Request → LiveView (UI only) → Context (business logic) → Schema\u002FRepo (data)\n               ↓                    ↓                           ↓\n           handle_event()     Accounts.create_user()      Repo.insert()\n```\n\n```elixir\n# ✅ CORRECT - Thin LiveView, logic in context\ndefmodule MyAppWeb.UserLive.Index do\n  use MyAppWeb, :live_view\n  \n  def handle_event(\"create\", params, socket) do\n    case Accounts.create_user(params) do\n      {:ok, user} -> {:noreply, redirect(socket, to: ~p\"\u002Fusers\u002F#{user}\")}\n      {:error, changeset} -> {:noreply, assign(socket, changeset: changeset)}\n    end\n  end\nend\n\n# ❌ BAD - Business logic in LiveView\ndef handle_event(\"create\", %{\"user\" => params}, socket) do\n  if String.length(params[\"name\"]) \u003C 3 do\n    {:noreply, put_flash(socket, :error, \"Too short\")}\n  else\n    case Repo.insert(User.changeset(%User{}, params)) do\n      {:ok, user} -> send_email(user); redirect(socket)\n    end\n  end\nend\n```\n\n### Example 3: Ecto N+1 Query Optimization\n\n```elixir\n# ✅ CORRECT - Preload associations (2 queries total)\nusers = User |> Repo.all() |> Repo.preload(:posts)\nEnum.map(users, fn user -> process(user, user.posts) end)\n\n# Note: For complex filtering (e.g., WHERE posts.status = 'published'),\n# use join + preload in the query itself. See EXTENDED.md for advanced patterns.\n\n# ❌ BAD - Query in loop (101 queries for 100 users)\nusers = Repo.all(User)\nEnum.map(users, fn user ->\n  posts = Repo.all(from p in Post, where: p.user_id == ^user.id)\n  {user, posts}\nend)\n```\n\n---\n\n## Anti-Patterns\n\n### Error Management\n\n#### Don't: Use `raise` for Business Errors\n\n```elixir\n# ❌ BAD\ndef fetch_user(id) do\n  Repo.get(User, id) || raise \"User not found\"\nend\n\n# ✅ CORRECT\n@spec fetch_user(String.t()) :: {:ok, User.t()} | {:error, :not_found}\ndef fetch_user(id) do\n  case Repo.get(User, id) do\n    nil -> {:error, :not_found}\n    user -> {:ok, user}\n  end\nend\n```\n\n**Why**: `@spec` documents errors, pattern matching forces explicit handling.\n\n---\n\n#### Don't: Return `nil` for Errors\n\n```elixir\n# ❌ BAD - No context on failure\ndef find_user(email), do: Repo.get_by(User, email: email)\n\n# ✅ CORRECT - Explicit error reason\n@spec find_user(String.t()) :: {:ok, User.t()} | {:error, :not_found}\ndef find_user(email) do\n  case Repo.get_by(User, email: email) do\n    nil -> {:error, :not_found}\n    user -> {:ok, user}\n  end\nend\n```\n\n---\n\n#### Don't: Use `=` Inside `with` for Failable Operations\n\n```elixir\n# ❌ BAD - Validate errors silenced\nwith {:ok, user} \u003C- fetch_user(id),\n     validated = validate(user),  # ← Doesn't check for {:error, _}\n     {:ok, saved} \u003C- save(validated) do\n  {:ok, saved}\nend\n\n# ✅ CORRECT - All operations use \u003C-\nwith {:ok, user} \u003C- fetch_user(id),\n     {:ok, validated} \u003C- validate(user),\n     {:ok, saved} \u003C- save(validated) do\n  {:ok, saved}\nend\n```\n\n---\n\n### Architecture & Boundaries\n\n#### Don't: Put Business Logic in LiveView\n\n```elixir\n# ❌ BAD - Validation in view\ndef handle_event(\"create\", %{\"user\" => params}, socket) do\n  if String.length(params[\"name\"]) \u003C 3 do\n    {:noreply, put_flash(socket, :error, \"Too short\")}\n  else\n    case Repo.insert(User.changeset(%User{}, params)) do\n      {:ok, user} -> redirect(socket)\n    end\n  end\nend\n\n# ✅ CORRECT - Delegate to context\ndef handle_event(\"create\", params, socket) do\n  case Accounts.create_user(params) do\n    {:ok, user} -> {:noreply, redirect(socket, to: ~p\"\u002Fusers\u002F#{user}\")}\n    {:error, changeset} -> {:noreply, assign(socket, changeset: changeset)}\n  end\nend\n```\n\n**Why**: Contexts testable without Phoenix, logic reusable.\n\n---\n\n#### Don't: Chain More Than 4 Steps in `with`\n\n```elixir\n# ❌ BAD - Too many responsibilities\nwith {:ok, a} \u003C- step1(),\n     {:ok, b} \u003C- step2(a),\n     {:ok, c} \u003C- step3(b),\n     {:ok, d} \u003C- step4(c),\n     {:ok, e} \u003C- step5(d) do\n  {:ok, e}\nend\n\n# ✅ CORRECT - Group into cohesive functions\nwith {:ok, validated} \u003C- validate_and_fetch(id),\n     {:ok, processed} \u003C- process_business_rules(validated),\n     {:ok, result} \u003C- persist_and_notify(processed) do\n  {:ok, result}\nend\n```\n\n---\n\n### Data & Performance\n\n#### Don't: Query Inside Loops (N+1)\n\n```elixir\n# ❌ BAD - 101 queries for 100 users\nusers = Repo.all(User)\nEnum.map(users, fn user ->\n  posts = Repo.all(from p in Post, where: p.user_id == ^user.id)\nend)\n\n# ✅ CORRECT - 2 queries total\nUser |> Repo.all() |> Repo.preload(:posts)\n```\n\n**Impact**: 100 users with N+1 = 10 seconds vs 5ms with preload.\n\n---\n\n#### Don't: Query Without Indexes\n\n```elixir\n# ❌ BAD - No index on frequently queried column\n# Migration:\ncreate table(:users) do\n  add :email, :string\nend\n\n# ✅ CORRECT - Add index\ncreate table(:users) do\n  add :email, :string\nend\ncreate unique_index(:users, [:email])\n```\n\n**Why**: Full table scan on 1M+ rows vs instant index lookup.\n\n---\n\n### Testing\n\n#### Don't: Write Tests Without Assertions\n\n```elixir\n# ❌ BAD - What's being tested?\ntest \"creates user\" do\n  UserService.create_user(%{name: \"Juan\"})\nend\n\n# ✅ CORRECT - Assert expected behavior\ntest \"creates user successfully\" do\n  assert {:ok, user} = UserService.create_user(%{name: \"Juan\"})\n  assert user.name == \"Juan\"\nend\n```\n\n---\n\n## Quick Reference\n\n| Situation | Anti-Pattern | Correct Pattern |\n|-----------|--------------|-----------------|\n| **Error handling** | `raise \"Not found\"` | `{:error, :not_found}` |\n| **Missing data** | Return `nil` | `{:error, :not_found}` |\n| **Business logic** | In LiveView | In context modules |\n| **Associations** | `Enum.map` + `Repo.get` | `Repo.preload` |\n| **with chains** | `validated = fn()` | `{:ok, validated} \u003C- fn()` |\n| **Frequent queries** | No index | `create index(:table, [:column])` |\n| **Testing** | No assertions | `assert` expected behavior |\n| **Complex logic** | 6+ step `with` | Group into 3 functions |\n\n---\n\n## Resources\n\n- [Elixir Style Guide](https:\u002F\u002Fhexdocs.pm\u002Felixir\u002Fnaming-conventions.html)\n- [Phoenix Contexts](https:\u002F\u002Fhexdocs.pm\u002Fphoenix\u002Fcontexts.html)\n- [Ecto Query Performance](https:\u002F\u002Fhexdocs.pm\u002Fecto\u002FEcto.Query.html)\n- [ExUnit Best Practices](https:\u002F\u002Fhexdocs.pm\u002Fex_unit\u002FExUnit.html)\n- **Extended patterns**: See `EXTENDED.md` for 40+ anti-patterns\n",{"name":5,"metadata":57,"description":60},{"author":58,"version":59},"tsardinasGitHub","1.0","Core catalog of 8 critical Elixir\u002FPhoenix anti-patterns covering error handling, separation of concerns, Ecto queries, and testing.  Trigger: During Elixir code review, refactoring sessions, or when writing Phoenix\u002FEcto code.\n","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FGentleman-Programming\u002FGentleman-Skills\u002Felixir-antipatterns",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":8,"skillName":5,"commands":71,"prompt":81,"zipAvailable":82},[72,75,78],{"tool":73,"command":74},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill elixir-antipatterns",{"tool":76,"command":77},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill elixir-antipatterns",{"tool":79,"command":80},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill elixir-antipatterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FGentleman-Programming\u002FGentleman-Skills\u002Felixir-antipatterns\u002FSKILL.md",true,[],[85,97,107,116,122,129],{"skillNo":86,"name":87,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":93,"publishedAt":52},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[90],{"categoryNo":91,"categoryName":92,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[94,95,96],"model","model hierarchy","model hierarchy skill",{"skillNo":98,"name":99,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":103,"publishedAt":52},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[102],{"categoryNo":91,"categoryName":92,"taxonomyType":21,"taxonomyTypeDesc":22},[104,105,106],"MCP","zoom","zoom mcp",{"skillNo":108,"name":109,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":52},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[113,114,115,105],"sdk","zoom apps sdk","apps",{"skillNo":117,"name":118,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":52},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[118],{"skillNo":123,"name":124,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":128,"publishedAt":52},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[127],{"categoryNo":91,"categoryName":92,"taxonomyType":21,"taxonomyTypeDesc":22},[124],{"skillNo":130,"name":131,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":52},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[131]]