用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/TheBushidoCollective/han --skill dialyzer-analysis命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | dialyzer-analysis |
| user-invocable | false |
| description | Use when analyzing and fixing Dialyzer warnings and type discrepancies in Erlang/Elixir code. |
| allowed-tools | [] |
Understanding and fixing Dialyzer warnings in Erlang and Elixir code.
@spec add(integer(), integer()) :: integer()
def add(a, b), do: a + b
@spec get_user(pos_integer()) :: {:ok, User.t()} | {:error, atom()}
def get_user(id) do
# implementation
end
@type user :: %{
id: pos_integer(),
name: String.t(),
email: String.t(),
role: :admin | :user | :guest
}
@spec process_users([user()]) :: {:ok, [user()]} | {:error, String.t()}
@spec map_values(map(), (any() -> any())) :: map()
@spec filter_list([t], (t -> boolean())) :: [t] when t: any()
# Warning: pattern match is not exhaustive
case value do
:ok -> :success
# Missing :error case
end
# Fixed
case value do
:ok -> :success
:error -> :failure
_ -> :unknown
end
# Warning: function has no local return
def always_raises do
raise "error"
end
# Fixed with spec
@spec always_raises :: no_return()
def always_raises do
raise "error"
end
# Warning: unmatched return
def process do
{:error, "failed"} # Return value not used
:ok
end
# Fixed
def process do
case do_something() do
{:error, reason} -> handle_error(reason)
:ok -> :ok
end
end
# Warning: unknown function
SomeModule.undefined_function()
# Fixed: ensure function exists or handle dynamically
if Code.ensure_loaded?(SomeModule) and
function_exported?(SomeModule, :function_name, 1) do
SomeModule.function_name(arg)
end
@type result :: :ok | {:ok, any()} | {:error, String.t()}
@spec handle_result(result()) :: any()
def handle_result(:ok), do: nil
def handle_result({:ok, value}), do: value
def handle_result({:error, msg}), do: Logger.error(msg)
@opaque internal_state :: %{data: map(), timestamp: integer()}
@spec new() :: internal_state()
def new, do: %{data: %{}, timestamp: System.system_time()}
@spec process_conn(Plug.Conn.t()) :: Plug.Conn.t()
@spec format_date(Date.t()) :: String.t()
Dialyzer uses success typing:
# Dialyzer infers: integer() -> integer()
def double(x), do: x * 2
# More specific spec
@spec double(pos_integer()) :: pos_integer()
def double(x) when x > 0, do: x * 2
any()mix dialyzer --format dialyzer
mix dialyzer --explain
mix dialyzer lib/my_module.ex