Agent skill

Base Show

by CliMA in CliMA/EnsembleKalmanProcesses.jl

Add concise Base.show and Base.summary methods to Julia types whose default REPL representation is unhelpful or overwhelming.

Apache-2.0Auto-check passedTesting & QA

Install Base Show

skills CLI
$ npx skills add CliMA/EnsembleKalmanProcesses.jl --skill base-show -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install CliMA/EnsembleKalmanProcesses.jl base-show --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/CliMA/EnsembleKalmanProcesses.jl.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/base-show .claude/skills/base-show && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
base-show
GitHub stars
127
Token cost
~5.2k tokens
SKILL.md length
1,610 words
Files
1
Skills in repo
5
Repo updated
First seen
Licence
Apache-2.0

At a glance

Add concise Base.show and Base.summary methods to Julia types whose default REPL representation is unhelpful or overwhelming.

  • Works in 7 steps: Audit existing show methods (retrofit… → Enumerate concrete types → Classify show noisiness → …
  • The user mentions that a type prints badly in the REPL
  • SKILL.md covers Workflow, Common patterns, Quality criteria and Formatting rules, plus 1 more section
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Base Show is an agent skill from CliMA/EnsembleKalmanProcesses.jl. Add concise Base.show and Base.summary methods to Julia types whose default REPL representation is unhelpful or overwhelming. Use this skill whenever the user mentions that a type prints badly in the REPL, asks to improve how an object is displayed or printed, wants a custom show, summary, or repr for a Julia type, or says the REPL output is noisy, verbose, or hard to read. Also trigger when the user asks to "make the REPL output nicer", "add a show method", "add a summary method", "customize display", or "fix…

Its SKILL.md is about 5.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Testing & QA, covering Unit testing. The repository describes itself as: Derivative-free parameter calibration and uncertainty quantification for expensive models using ensemble Kalman methods. The licence is Apache-2.0.

When your agent uses it

  • The user mentions that a type prints badly in the REPL
  • Asks to improve how an object is displayed
  • Wants a custom show
  • Repr for a Julia type

Example prompts

  • “make the REPL output nicer”
  • “add a show method”
  • “add a summary method”
  • “/base-show”

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Audit existing show methods (retrofit mode)
  2. Enumerate concrete types
  3. Classify show noisiness
  4. Write show and summary methods
  5. Write unit tests
  6. Verify
  7. Offer to improve the skill

What it can do on your machine

Read from SKILL.md and the folder at commit d10e521. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are julia).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Base Show loads about 5.2k tokens when it runs. Until then it costs about 196 tokens; SKILL.md has 1,610 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~196
When it runs · the whole SKILL.md, loaded when a task matches
~5.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from CliMA/EnsembleKalmanProcesses.jl at commit d10e521, republished under its Apache-2.0 licence (© CliMA). 1,610 words, ~5,221 tokens.

Download SKILL.mdSave it as .claude/skills/base-show/SKILL.md (or your agent's skills folder).
name
base-show
description
Add concise Base.show and Base.summary methods to Julia types whose default REPL representation is unhelpful or overwhelming. Use this skill whenever the user mentions that a type prints badly in the REPL, asks to improve how an object is displayed or printed, wants a custom show, summary, or repr for a Julia type, or says the REPL output is noisy, verbose, or hard to read. Also trigger when the user asks to "make the REPL output nicer", "add a show method", "add a summary method", "customize display", or "fix what prints when I type a variable name". This skill produces compact, informative Base.show and Base.summary methods and matching unit tests — invoke it proactively whenever show, summary, display, print, repr, or REPL output is mentioned in a Julia context.

base-show

Add concise Base.show(io::IO, ::MIME"text/plain", x::T) and Base.summary(io::IO, x::T) methods to Julia types whose default REPL representation is unhelpful or overwhelming. Julia's default show dumps every field recursively; types that hold DataFrames, large dictionaries, nested arrays, or many scalar fields produce screens of unreadable text at the REPL.

Base.show(io, MIME"text/plain", x) must also handle the :compact IOContext key. When Julia renders an object as an element inside a container (e.g. printing a Vector{MyType}), it sets :compact => true on io. Without a compact branch the full multi-line output is repeated for every element, producing an unreadable wall of text. The compact branch must produce exactly one line (no newlines), giving the same kind of at-a-glance hint as Base.summary.

This skill produces both methods and accompanying unit tests so that interactive use of the package is pleasant without losing key summary information.

Workflow

Step 0 — Audit existing show methods (retrofit mode)

Skip this step if you are adding show methods to types that have none. Apply it when the user asks to retrofit existing show methods — e.g. to add the compact branch to methods that were written before this protocol existed.

Find MIME methods that lack the compact branch:

grep -n 'MIME"text/plain"' src/show.jl

For each match, check whether the function body contains get(io, :compact. Any that do not are candidates for retrofit.

Detect the old forwarding anti-pattern (infinite-recursion risk):

grep -nA2 'function Base\.show(io::IO, x::' src/ | grep 'show(io, MIME'

If this matches, a 2-arg show(io, x) is calling the MIME method — the wrong direction. Once the MIME method gains a compact branch that calls show(io, x), you get infinite recursion. Flag every match and reverse the direction: the 2-arg method becomes the compact one-liner, and the MIME method calls it via show(io, x) in its compact branch.

Identify pre-existing bespoke 2-arg shows:

A bespoke 2-arg show is one that already exists but does not follow summary style — for example, it may omit the type name entirely or use a different format. Check each existing Base.show(io::IO, x::T) against its paired Base.summary. If the outputs differ substantially, the 2-arg show is bespoke and needs a custom compact test (see Step 4).

Step 1 — Enumerate concrete types

List every concrete (non-abstract) struct defined in the package source:

grep -nrE '^(mutable )?struct ' src/

Exclude abstract type declarations — they cannot be instantiated and do not need show methods.

Step 2 — Classify show noisiness

For each concrete type, decide whether its default show output would be noisy. A type is noisy if it holds at least one of:

  • A DataFrame or similar tabular collection
  • A Dict with potentially many entries
  • A large or variable-length Array
  • Another struct that is itself noisy
  • More than approximately six fields in total

Also run:

grep -nrE 'Base\.(show|summary)' src/

Skip any type that already has a custom Base.show or Base.summary method — do not overwrite existing customization.

Step 3 — Write show and summary methods

For each noisy type without existing methods, write both a Base.show and a Base.summary method.

Base.show — always write two overloads together:

julia
# 3-arg MIME method: full REPL display, with compact fallback
function Base.show(io::IO, ::MIME"text/plain", x::T)
    if get(io, :compact, false)
        show(io, x)   # delegate to the 2-arg compact method
    else
        println(io, "T")
        println(io, "  field_name : ", summary_value)
        # ...
    end
end

# 2-arg method: single-line compact representation (no newline)
function Base.show(io::IO, x::T)
    print(io, "T (key_hint)")
end

The 3-arg (MIME) non-compact branch must:

  • Print the type name (and any cheap size hints) on the first line.
  • Follow with 1–5 concise summary lines: counts, sizes, or ranges of important fields. Never print collection contents.
  • Produce at most 10 lines of output for any valid instance, including edge cases such as empty collections or zero-element structs.

The 2-arg method (compact representation) must:

  • Produce exactly one line with no trailing newline.
  • Match Base.summary style: type name followed by the most essential identifying hint in parentheses — e.g. "T (N_ens=100, 5 iter)".
  • Remain O(1): no loops, no collection materialisation.

Julia calls the 2-arg method when rendering elements inside containers (arrays, dicts, etc.), passing io with :compact => true. The MIME method's compact branch delegates to it so both paths produce the same single-line output.

Base.summary — single-line description used when the object appears inside a container or is printed in a broader context (e.g., as an element of a Vector):

julia
function Base.summary(io::IO, x::T)
    print(io, "T (key_hint)")
end

The method must:

  • Fit on one line — no newlines.
  • Convey the most important size or identity hint (e.g., number of elements, key dimension), so the reader immediately knows what they are looking at.
  • Remain cheap: O(1) field accesses only.

Good examples of what to put in the hint: "847 basins", "1000×365 grid", "empty". Avoid repeating the type name verbatim as the only content — add value.

Placement: place both methods adjacent to their type definition in the same source file, or gather all show/summary methods in a dedicated src/show.jl included from the main module file. Follow whatever convention is already present in the package; default to src/show.jl if no prior convention exists.

If creating src/show.jl, add include("show.jl") to the main module file after the type definitions it references.

Step 4 — Write unit tests

Write one test block per type, covering show (full and compact), and summary. Each test block must:

  • Construct a minimal valid instance of the type.
  • For full show: capture output with sprint(show, MIME("text/plain"), instance) and assert that it contains the type name and that line count does not exceed 10.
  • For compact show: capture out2 = sprint(show, instance) (2-arg) and assert it contains the type name and has no '\n'. Also capture out3 = sprint(show, MIME("text/plain"), instance; context=:compact => true) and assert out2 == out3 — both compact paths must agree.
  • For summary: capture output with sprint(summary, instance) and assert that it contains the type name and produces exactly one line (no '\n' in output).

Bespoke 2-arg shows (retrofit case): Some types may already have a 2-arg show that intentionally does not include the type name or follow summary style — the method is doing something custom. Using a shared check_compact(x, typename) helper will fail the typename assertion for these. Instead, write a hand-rolled compact test:

julia
s2 = sprint(show, instance)
@test !occursin('\n', s2)                                              # no newline
@test s2 == sprint(show, MIME("text/plain"), instance; context = :compact => true)  # paths agree

Avoid asserting exact strings so that cosmetic changes to the output do not break tests.

Step 5 — Verify

Run the package test suite:

julia --project -e 'using Pkg; Pkg.test()'

Confirm that all new tests pass and no pre-existing tests regress.

Show full SKILL.md (650 more words)Show less
Step 6 — Offer to improve the skill

After the tests pass and the REPL output looks good, ask the user: "Would you like to improve the base-show skill itself using skill-creator? You can suggest changes to the workflow or quality criteria, or I can analyse what came up during this session to identify improvements to the skill."

Common patterns

Two-overload pattern (always write both together)

Always define the 2-arg and 3-arg MIME overloads as a pair. The MIME method's compact branch calls the 2-arg method, so both display paths (REPL and in-container) converge on the same one-liner without repetition:

julia
function Base.show(io::IO, ::MIME"text/plain", x::MyProcess)
    if get(io, :compact, false)
        show(io, x)
    else
        println(io, "MyProcess")
        # ... full multi-line body ...
    end
end

function Base.show(io::IO, x::MyProcess)
    print(io, "MyProcess (", nameof(typeof(x.process)), ", N_ens=", x.N_ens, ")")
end

Without the 2-arg method, [ekp] in a Vector falls back to Julia's default field dump. Without the compact branch in the MIME method, the same dump appears whenever the object is embedded in a container that happens to call show(io, MIME"text/plain", x) with :compact => true.

Truncate long collections with "… and N more"

When a type holds a variable-length collection, cap the loop to keep output bounded:

julia
function Base.show(io::IO, ::MIME"text/plain", x::ParameterDistribution)
    n = length(x.name)
    println(io, "ParameterDistribution with ", n, " entr", n == 1 ? "y" : "ies")
    max_show = 8
    for i in 1:min(n, max_show)
        println(io, "  '", x.name[i], "': ", sprint(summary, x.distribution[i]))
    end
    n > max_show && println(io, "  … and ", n - max_show, " more")
end
Conditional fields

Only print a field when it carries information:

julia
if !isnothing(x.prior_mean)
    println(io, "  prior_dim: ", length(x.prior_mean))
end
Pluralisation in summary

Match English grammar for counts that can be 0 or 1:

julia
print(io, "Observation (", n, " block", n == 1 ? "" : "s", ", dim=", dim, ")")
Arrow notation for mappings

Use → in summary when the type represents a transformation between spaces:

julia
print(io, "PairedDataContainer (", m_in, "×", n_in, " → ", m_out, "×", n_out, ")")
Unicode in mathematical contexts

Use × for matrix dimensions, → for transformations, ∞ for unbounded constraints, and |u| for set sizes. These are rendered cleanly in all modern Julia terminals and communicate mathematical meaning concisely.

julia
# Constraint summary: Constraint{NoConstraint} (−∞, ∞)
lb = get(bounds, "lower_bound", "-∞")
ub = get(bounds, "upper_bound", "∞")
print(io, "Constraint{$(T)} ($(lb), $(ub))")
Use nameof for parametric type identity

When a type carries a type-parameter that identifies its variant, use nameof rather than printing the full parameterised name:

julia
# Sampler{Float64} (prior_dim=12) — not the raw Sampler{Float64, ...} dump
print(io, "Sampler{", nameof(get_sampler_type(x)), "} (prior_dim=", length(x.prior_mean), ")")
Section separators in show.jl

When collecting all methods in a dedicated show.jl, organise by type family with aligned comment rulers:

julia
# ── DataContainers ────────────────────────────────────────────────────────────
# ── Observations ─────────────────────────────────────────────────────────────
# ── EnsembleKalmanProcess ────────────────────────────────────────────────────

Quality criteria

CriterionPriorityDefinition
CoverageHighEvery type classified as noisy in Step 2 has a Base.show (both overloads) and a Base.summary method.
Compact supportHighThe 3-arg MIME show checks get(io, :compact, false) and calls the 2-arg show(io, x) in the compact branch. The 2-arg method produces exactly one line with no newline.
Brevity — showHighFull (non-compact) show output is at most 10 lines for any valid instance, including edge cases.
Brevity — summaryHighSummary output is exactly one line (no newlines) for any valid instance.
SafetyHighNeither method throws on any valid instance.
Allocation-safetyHighAll data access is O(1): use length(), size(), isempty(), or first() on lazy iterators. Never call collect(), sort(), filter(), or any function that materialises a new collection.
Test robustnessMediumTests assert structural properties, not exact strings. Cosmetic changes do not break tests.
No regressionHighPre-existing tests continue to pass; no unintended changes to other source files.

Formatting rules

  • MIME show signature: Base.show(io::IO, ::MIME"text/plain", x::MyType)
  • MIME show structure: always starts with if get(io, :compact, false); show(io, x); else ... end.
  • MIME show full branch — first line: type name via println(io, "TypeName"). Cheap size hints may follow on the same line.
  • MIME show full branch — subsequent lines: indented two spaces for readability.
  • 2-arg show signature: Base.show(io::IO, x::MyType)
  • 2-arg show content: one print call (no println), type name followed by a parenthesised hint matching Base.summary style, e.g. print(io, "MyType (847 basins)").
  • summary signature: Base.summary(io::IO, x::MyType)
  • summary content: one print call (no println), type name followed by a parenthesised hint, e.g. print(io, "MyType (847 basins)").
  • No collection contents: print only counts, sizes, or ranges — never iterate and print elements.
  • No allocations: use length(), size(), isempty(), and first() on lazy iterators such as values(dict). Do not call collect(), sort(), or any function that copies a collection.
  • Tests — MIME full show: use sprint(show, MIME("text/plain"), x) to capture output without side effects.
  • Tests — compact show: use sprint(show, MIME("text/plain"), x; context=:compact => true) to exercise the compact branch, and sprint(show, x) to test the 2-arg method directly.
  • Tests — summary: use sprint(summary, x) to capture the one-line description.

Examples

Example 1 — matrix-carrying type (size hint)
julia
# Scenario: a type wraps a parameter matrix and a forward-model output matrix.

# Before (default Julia show — prints the full matrix)
julia> pdc
PairedDataContainer{Float64}(inputs=DataContainer{Float64}(data=[...50×100 matrix...]),
  outputs=DataContainer{Float64}(data=[...30×100 matrix...]))

# After — custom show (two overloads)
function Base.show(io::IO, ::MIME"text/plain", x::PairedDataContainer)
    if get(io, :compact, false)
        show(io, x)
    else
        m_in,  n_in  = size(x.inputs.data)
        m_out, n_out = size(x.outputs.data)
        println(io, "PairedDataContainer")
        println(io, "  inputs : ", m_in,  " × ", n_in,  " params × samples")
        println(io, "  outputs: ", m_out, " × ", n_out, " obs × samples")
    end
end

function Base.show(io::IO, x::PairedDataContainer)
    m_in, n_in   = size(x.inputs.data)
    m_out, n_out = size(x.outputs.data)
    print(io, "PairedDataContainer (", m_in, "×", n_in, " → ", m_out, "×", n_out, ")")
end

# julia> pdc
# PairedDataContainer
#   inputs : 50 × 100  params × samples
#   outputs: 30 × 100  obs × samples

# julia> [pdc, pdc]
# 2-element Vector{PairedDataContainer{Float64}}:
#  PairedDataContainer (50×100 → 30×100)
#  PairedDataContainer (50×100 → 30×100)

# After — custom summary (arrow notation for a mapping type; matches 2-arg show)
function Base.summary(io::IO, x::PairedDataContainer)
    m_in, n_in   = size(x.inputs.data)
    m_out, n_out = size(x.outputs.data)
    print(io, "PairedDataContainer (", m_in, "×", n_in, " → ", m_out, "×", n_out, ")")
end
Example 2 — collection-carrying type with truncation
julia
# Scenario: a type holds N named parameter distributions; N can be large.

# Before (default Julia show — prints every distribution in full)
julia> prior
ParameterDistribution{Parameterized, Constraint{NoConstraint}, String}(
  distribution=[Parameterized(Normal{Float64}(μ=0.0, σ=1.0)), ...],
  constraint=[[Constraint{NoConstraint}(bounds=nothing)], ...],
  name=["amplitude", "length_scale", "noise_var", ...])

# After — custom show (two overloads)
function Base.show(io::IO, ::MIME"text/plain", x::ParameterDistribution)
    if get(io, :compact, false)
        show(io, x)
    else
        n = length(x.name)
        println(io, "ParameterDistribution with ", n, " entr", n == 1 ? "y" : "ies")
        max_show = 8
        for i in 1:min(n, max_show)
            n_con = length(batch(x)[i])
            println(io, "  '", x.name[i], "': ", sprint(summary, x.distribution[i]),
                    " [", n_con, " constraint", n_con == 1 ? "" : "s", "]")
        end
        n > max_show && println(io, "  … and ", n - max_show, " more")
    end
end

function Base.show(io::IO, x::ParameterDistribution)
    n = length(x.name)
    print(io, "ParameterDistribution (", n, " entr", n == 1 ? "y" : "ies", ")")
end

# julia> prior
# ParameterDistribution with 3 entries
#   'amplitude'   : Parameterized (Normal) [1 constraint]
#   'length_scale': Parameterized (LogNormal) [1 constraint]
#   'noise_var'   : Parameterized (Uniform) [1 constraint]

# julia> [prior, prior]
# 2-element Vector{ParameterDistribution{...}}:
#  ParameterDistribution (3 entries)
#  ParameterDistribution (3 entries)

# After — summary (matches 2-arg show)
function Base.summary(io::IO, x::ParameterDistribution)
    n = length(x.name)
    print(io, "ParameterDistribution (", n, " entr", n == 1 ? "y" : "ies", ")")
end
Example 3 — stateful iterative process
julia
# Scenario: a mutable struct accumulates state across EKI iterations.

# Before (default Julia show — dumps every matrix stored in the struct)
julia> ekp
EnsembleKalmanProcess{Float64, ...}(u=[50×100 matrix, 50×100 matrix, ...],
  g=[...], Δt=[0.5, 0.5], rng=MersenneTwister(...), N_ens=100, ...)

# After — custom show (two overloads)
function Base.show(io::IO, ::MIME"text/plain", x::EnsembleKalmanProcess)
    if get(io, :compact, false)
        show(io, x)
    else
        n_iter = length(x.u) - 1
        n_par  = size(x.u[1].data, 1)
        println(io, "EnsembleKalmanProcess")
        println(io, "  process    : ", nameof(typeof(x.process)))
        println(io, "  N_ens      : ", x.N_ens)
        println(io, "  N_par      : ", n_par)
        println(io, "  n_iter     : ", n_iter)
        println(io, "  scheduler  : ", nameof(typeof(x.scheduler)))
        println(io, "  accelerator: ", nameof(typeof(x.accelerator)))
    end
end

function Base.show(io::IO, x::EnsembleKalmanProcess)
    n_iter = length(x.u) - 1
    print(io, "EnsembleKalmanProcess (", nameof(typeof(x.process)),
          ", N_ens=", x.N_ens, ", ", n_iter, " iter)")
end

# julia> ekp
# EnsembleKalmanProcess
#   process    : Inversion
#   N_ens      : 100
#   N_par      : 50
#   n_iter     : 5
#   scheduler  : DefaultScheduler
#   accelerator: DefaultAccelerator

# julia> [ekp, ekp]
# 2-element Vector{EnsembleKalmanProcess{...}}:
#  EnsembleKalmanProcess (Inversion, N_ens=100, 5 iter)
#  EnsembleKalmanProcess (Inversion, N_ens=100, 5 iter)

# After — summary (matches 2-arg show)
function Base.summary(io::IO, x::EnsembleKalmanProcess)
    n_iter = length(x.u) - 1
    print(io, "EnsembleKalmanProcess (", nameof(typeof(x.process)),
          ", N_ens=", x.N_ens, ", ", n_iter, " iter)")
end
Unit tests
julia
@testset "PairedDataContainer show" begin
    pdc = PairedDataContainer(rand(50, 100), rand(30, 100))
    out = sprint(show, MIME("text/plain"), pdc)
    @test occursin("PairedDataContainer", out)
    @test count(==('\n'), out) <= 10
end

@testset "PairedDataContainer show compact" begin
    pdc = PairedDataContainer(rand(50, 100), rand(30, 100))
    # exercise via the 2-arg method directly
    out2 = sprint(show, pdc)
    @test occursin("PairedDataContainer", out2)
    @test !occursin('\n', out2)
    # exercise via the MIME method with compact context
    out3 = sprint(show, MIME("text/plain"), pdc; context=:compact => true)
    @test out2 == out3   # both paths must agree
end

@testset "PairedDataContainer summary" begin
    pdc = PairedDataContainer(rand(50, 100), rand(30, 100))
    out = sprint(summary, pdc)
    @test occursin("PairedDataContainer", out)
    @test !occursin('\n', out)    # must be exactly one line
end

© CliMA, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/base-show of CliMA/EnsembleKalmanProcesses.jl.

Open the folder on GitHubat commit d10e521

Compare with similar skills

Base Show next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Base Show compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Base Show this skillCliMA/EnsembleKalmanProcesses.jl127—~5.2kAutomated safety check: PassApache-2.0
TDD WorkflowhellangleZ/burn-in-cceverywhere-ralph11211 repos~2.4kAutomated safety check: PassNone
Testing OpenLogi UIAprilNEA/OpenLogi23k—~1.1kAutomated safety check: PassApache-2.0
Go Testingcxuu/golang-skills1701 repos~1.3kAutomated safety check: PassApache-2.0
Contractssamchon/nestia2.2k—~1.3kAutomated safety check: PassMIT
Cohesion Over TestabilityEpicenterHQ/epicenter4.8k—~2kAutomated safety check: PassCustom licence

Similar skills

  • TDD Workflow

    hellangleZ/burn-in-cceverywhere-ralph

    A skill your agent uses when writing new features, fixing bugs, or refactoring code.

    112 GitHub starsUsed in 11 repos~2.4k tokens
    Testing & QAAuto-check passed
  • Testing OpenLogi UI

    AprilNEA/OpenLogi

    Verifies OpenLogi's native GPUI interface with focused tests, the component gallery and a mock agent, choosing the evidence that fits each change.

    23k GitHub stars~1.1k tokensUpdated 3 days ago
    Testing & QAAuto-check passed
  • Go Testing

    cxuu/golang-skills

    A skill your agent uses when writing, reviewing, or improving Go test code — including table-driven tests, subtests, parallel tests, test helpers, test doubles, and assertions with cmp.Diff.

    170 GitHub starsUsed in 1 repo~1.3k tokens
    Testing & QAAuto-check passed
  • Contracts

    samchon/nestia

    Defines self-acknowledgments for production declarations and tests.

    2.2k GitHub stars~1.3k tokensUpdated today
    Testing & QAAuto-check passed
  • Cohesion Over Testability

    EpicenterHQ/epicenter

    Collapse test-shaped production boundaries while preserving behavior and coverage.

    4.8k GitHub stars~2k tokensUpdated today
    Testing & QAAuto-check passed
  • JS-in-HTML Testing

    liaohch3/claude-tap

    Tests JavaScript embedded in an HTML file in two layers: pytest checks of the logic ported to Python, and Playwright runs in a real browser for the DOM.

    3.3k GitHub stars~924 tokensUpdated 15 days ago
    Testing & QAAuto-check passed

More from CliMA/EnsembleKalmanProcesses.jl

  • Slurm Pipeline Manager

    CliMA/EnsembleKalmanProcesses.jl

    Scaffold and maintain a SLURM/HPC job-dependency tree for an EnsembleKalmanProcesses.jl (EKP) calibration pipeline.

    127 GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Math Auditor

    CliMA/EnsembleKalmanProcesses.jl

    Run an adversarial mathematical-accuracy review of a Julia package's src/ and test/ directories, producing a dated markdown report plus concise, self-contained fix-prompt markdowns suitable for…

    127 GitHub stars~2.6k tokensUpdated today
    Auto-check passed
  • Docstrings

    CliMA/EnsembleKalmanProcesses.jl

    Add or normalise Julia docstrings on public symbols (exported types, functions, and constants) so the package's public API is fully self-documenting and the Documenter.jl docs build passes its…

    127 GitHub stars~5.5k tokensUpdated today
    Auto-check passed
  • Error Message Manager

    CliMA/EnsembleKalmanProcesses.jl

    Rewrite vague, delayed, or low-context Julia error messages into structured, actionable diagnostics.

    127 GitHub stars~8.2k tokensUpdated today
    Auto-check passed

Categories

Questions about Base Show

What does Base Show do?

Add concise Base.show and Base.summary methods to Julia types whose default REPL representation is unhelpful or overwhelming. jl.summary methods to Julia types whose default REPL representation is unhelpful or overwhelming.

When should I use Base Show?

Base Show fits situations like: the user mentions that a type prints badly in the REPL; asks to improve how an object is displayed; wants a custom show; repr for a Julia type.

How do I install Base Show in Claude Code?

Run `npx skills add CliMA/EnsembleKalmanProcesses.jl --skill base-show -a claude-code`. Or copy the skill folder (.claude/skills/base-show in CliMA/EnsembleKalmanProcesses.jl) into .claude/skills/base-show in your project. Claude Code loads it when a task matches its description.

How do I install Base Show in Codex?

Run `npx skills add CliMA/EnsembleKalmanProcesses.jl --skill base-show -a codex`. Or copy the skill folder (.claude/skills/base-show in CliMA/EnsembleKalmanProcesses.jl) into .agents/skills/base-show in your project. Codex loads it when a task matches its description.

Can I use Base Show in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add CliMA/EnsembleKalmanProcesses.jl --skill base-show -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/base-show, .gemini/skills/base-show, .github/skills/base-show and .opencode/skills/base-show in your project.

What does Base Show need to run?

SKILL.md names no scripts, command-line tools or credentials: Base Show is instructions for the agent only.

Does Base Show access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Base Show safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Base Show use?

Base Show is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Base Show use?

About 5.2k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Base Show?

Skills that share tags, products or a category with Base Show: TDD Workflow (hellangleZ/burn-in-cceverywhere-ralph, 112 stars), Testing OpenLogi UI (AprilNEA/OpenLogi, 23k stars), Go Testing (cxuu/golang-skills, 170 stars) and Contracts (samchon/nestia, 2.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Base Show?

CliMA (a GitHub organization) maintains it in CliMA/EnsembleKalmanProcesses.jl, which has 127 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 7, 2026.

Source: CliMA/EnsembleKalmanProcesses.jl on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.