Diagram Design
cathrynlavery/diagram-design
Creates branded diagrams, from architecture, flowchart and sequence to charts and maps, as self-contained HTML with inline SVG, with import from draw.io, Mermaid and Excalidraw.
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…
$ npx skills add CliMA/EnsembleKalmanProcesses.jl --skill docstrings -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install CliMA/EnsembleKalmanProcesses.jl docstrings --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/CliMA/EnsembleKalmanProcesses.jl.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/docstrings .claude/skills/docstrings && rm -rf skills-srcUse ~/.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/
Install the "docstrings" agent skill from https://github.com/CliMA/EnsembleKalmanProcesses.jl/tree/main/.claude/skills/docstrings into .claude/skills/docstrings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "docstrings", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/CliMA/EnsembleKalmanProcesses.jl/tree/main/.claude/skills/docstringsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add CliMA/EnsembleKalmanProcesses.jl --skill docstrings -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install CliMA/EnsembleKalmanProcesses.jl docstrings --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CliMA/EnsembleKalmanProcesses.jl.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/docstrings .agents/skills/docstrings && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "docstrings" agent skill from https://github.com/CliMA/EnsembleKalmanProcesses.jl/tree/main/.claude/skills/docstrings into .agents/skills/docstrings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "docstrings", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add CliMA/EnsembleKalmanProcesses.jl --skill docstrings -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install CliMA/EnsembleKalmanProcesses.jl docstrings --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CliMA/EnsembleKalmanProcesses.jl.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/docstrings .cursor/skills/docstrings && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "docstrings" agent skill from https://github.com/CliMA/EnsembleKalmanProcesses.jl/tree/main/.claude/skills/docstrings into .cursor/skills/docstrings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "docstrings", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/CliMA/EnsembleKalmanProcesses.jl.git --path .claude/skills/docstrings--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add CliMA/EnsembleKalmanProcesses.jl --skill docstrings -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install CliMA/EnsembleKalmanProcesses.jl docstrings --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CliMA/EnsembleKalmanProcesses.jl.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/docstrings .gemini/skills/docstrings && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "docstrings" agent skill from https://github.com/CliMA/EnsembleKalmanProcesses.jl/tree/main/.claude/skills/docstrings into .gemini/skills/docstrings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "docstrings", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install CliMA/EnsembleKalmanProcesses.jl docstringsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add CliMA/EnsembleKalmanProcesses.jl --skill docstrings -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/CliMA/EnsembleKalmanProcesses.jl.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/docstrings .github/skills/docstrings && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "docstrings" agent skill from https://github.com/CliMA/EnsembleKalmanProcesses.jl/tree/main/.claude/skills/docstrings into .github/skills/docstrings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "docstrings", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add CliMA/EnsembleKalmanProcesses.jl --skill docstrings -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install CliMA/EnsembleKalmanProcesses.jl docstrings --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CliMA/EnsembleKalmanProcesses.jl.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/docstrings .opencode/skills/docstrings && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "docstrings" agent skill from https://github.com/CliMA/EnsembleKalmanProcesses.jl/tree/main/.claude/skills/docstrings into .opencode/skills/docstrings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "docstrings", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
docstringsAdd 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…
Docstrings is an agent skill from 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 checkdocs check. After writing docstrings, also updates docs/src/API/ pages so every exported symbol appears exactly once, organised into logical categories, with stale entries removed. Invoke this skill whenever the user mentions: docstring, missing doc, undocumented symbol, API doc, checkdocs warning, docs/src/API, @docs…
Its SKILL.md is about 5.5k 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 Development, covering Technical documentation. 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.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d10e521. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
python3From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Docstrings loads about 5.5k tokens when it runs. Until then it costs about 194 tokens; SKILL.md has 2,490 words of instructions outside code blocks.
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.
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.
The full file from CliMA/EnsembleKalmanProcesses.jl at commit d10e521, republished under its Apache-2.0 licence (© CliMA). 2,490 words, ~5,509 tokens.
.claude/skills/docstrings/SKILL.md (or your agent's skills folder).Add or normalise Julia docstrings on public symbols (exported types, functions,
and constants) across the package source. The goal is complete, consistent API
documentation that renders correctly under Documenter.jl and follows whichever
docstring convention is already established in the package — typically
DocStringExtensions macros such as $(TYPEDEF), $(TYPEDFIELDS), and
$(TYPEDSIGNATURES). Completing this skill makes the package's public API fully
self-documenting and satisfies any checkdocs requirement in the docs build.
Use an Explore subagent to read 2–3 symbols that already have complete docstrings to calibrate style. This avoids consuming the main context window with large file reads. Ask the Explore agent to return the verbatim docstring text for each symbol.
Identify:
$(TYPEDEF),
$(TYPEDFIELDS), $(TYPEDSIGNATURES), $(METHODLIST)).$(TYPEDFIELDS)?).$(TYPEDEF), manual # Constructor
section), or the new format (prose only, $(TYPEDEF) for the signature,
$(METHODLIST) for constructors). Normalise old-format structs to new-format
during Step 3.This detected baseline becomes the style target for every new or normalised docstring. Do not impose a different convention — match what is already there.
Discover the package name from Project.toml (the name = field). Then run:
grep -nE '^(function |struct |abstract type |mutable struct |const )' src/**/*.jlCross-file exports: exported names may be declared in a central module file
(e.g. src/PackageName.jl) while the definition lives in a different file.
Read the module file for all export statements so you catch every public symbol
regardless of where it is defined.
For each exported symbol, check whether a non-empty docstring immediately precedes the definition. Produce a prioritised list:
$(TYPEDEF),
or redundant manual # Constructor / # Constructors section alongside
$(METHODLIST).$(TYPEDSIGNATURES)) with
no prose.# Arguments,
# Examples, or field strings not describing semantic role).Also scan every function in the file for old-style docstrings, regardless of
whether it is exported. An old-style docstring is one that uses an indented
function-name header (e.g. my_func(arg1, arg2)) and/or an Args: /
Arguments: block with the `name` - description format. Convert these to
the $(TYPEDSIGNATURES) convention in the same editing pass — the whole file
should end up stylistically uniform.
For each candidate, write a docstring that matches the detected convention.
Simple getters for exported process/struct types (e.g.
get_prior_mean(p::MyProcess)) are public API and must be documented if
exported. A one-line $(TYPEDSIGNATURES) + short prose sentence suffices; no
# Arguments or # Examples is needed unless the semantics are non-obvious.
If a struct docstring starts with an indented type name (e.g. MyStruct{...}),
convert it to the new format:
$(TYPEDEF) immediately after the opening prose sentence.# Constructor or # Constructors section (listing
function signatures) with a # Constructors section containing only
$(METHODLIST). If $(METHODLIST) is already present alongside the manual
list, remove the manual list.# Constructor section if it
explains non-obvious behaviour; discard boilerplate signature repetition.$(METHODLIST) only lists methods whose name matches the struct type. Exported functions
that build an instance of the struct but carry a different name — factory functions such
as constrained_gaussian for ParameterDistribution — are invisible to $(METHODLIST)
and must be surfaced manually in the struct docstring.
When such functions exist, add a prose note inside the # Constructors section,
immediately before $(METHODLIST):
"""
Structure to hold a parameter distribution, always stored as an array of
distributions internally.
$(TYPEDEF)
# Fields
$(TYPEDFIELDS)
# Constructors
Recommended construction (for most problems) is via the `constrained_gaussian()`
utility (see its own docstring for details and a usage example).
$(METHODLIST)
"""
struct ParameterDistribution
...
endThe note should:
# Examples block exists on the factory function itself.The factory function still needs its own full docstring ($(TYPEDSIGNATURES),
# Arguments, # Examples if non-trivial). The struct-level note is a pointer,
not a replacement.
Detecting named constructors during Step 2: when enumerating candidates, flag
exported functions whose name differs from any type name but whose body or doc
clearly returns an instance of a specific struct. Common signals: the function name
ends with a domain term (e.g. constrained_gaussian, from_file), its return
statement calls the struct constructor directly, or the existing codebase already
mentions the relationship somewhere in prose.
When a function has multiple dispatch methods, document only the primary user-facing overload and leave all other overloads undocumented. Competing docstrings fragment the rendered API docs and create maintenance burden.
The primary overload is the method whose argument type is the broadest
user-facing type — e.g. ParameterDistribution rather than Parameterized
or Samples.
Type-parameter specialisations count as overloads. If the same function name
is defined for where {FT, P <: MyProcess{FT, TypeA}} and
where {FT, P <: MyProcess{FT, TypeB}}, these are two dispatch methods of the
same concept. Document only one — typically the first defined, or the more
general one — and leave the rest undocumented.
update_ensemble! is a specialised internal update hook called by the framework,
not by users directly. It must not be documented even if it is exported.
Convert any docstring that uses an indented function-name header or an Args: /
Arguments: section to the $(TYPEDSIGNATURES) style, even for internal
(non-exported) helpers. The canonical old-style markers are:
my_func(arg, ...) — replace with $(TYPEDSIGNATURES).Args: or Arguments: with `name` - description lines — replace
with a # Arguments section using - `name`: description format.Doing this in the same pass keeps the file stylistically uniform and prevents old-style docstrings from persisting as invisible technical debt.
$(TYPEDFIELDS) already renders them).[m/day].# Arguments section listing each
parameter as - `name`: description [unit if applicable].# Examples section with a jldoctest block so Documenter.jl
can verify the example stays correct as the code evolves.When editing files that contain non-ASCII characters (e.g. author names with accented letters like "Garbuno-Iñigo" or "Nüsken"), the file may store characters in Unicode NFD form while the Edit tool normalises to NFC, causing match failures. If an Edit call fails with a "not found" error on a string you can see in the file, use a Python one-liner to apply the replacement with NFD-normalised strings:
python3 - <<'EOF'
import unicodedata, pathlib
p = pathlib.Path("src/MyFile.jl")
text = p.read_text()
old = unicodedata.normalize('NFD', "the old string here")
new = unicodedata.normalize('NFD', "the new string here")
p.write_text(text.replace(old, new, 1))
EOFAfter a Python edit, re-read the file before making any further Edit calls to the same file (the Edit tool tracks file state from the last Read).
docs/src/API/ pagesAfter all source-file edits are applied, update the Documenter.jl API pages so
that every exported, documented symbol appears exactly once, organised into
logical categories. The goal is that a reader browsing docs/src/API/ sees a
complete, non-redundant index of the public API — nothing missing, nothing
stale.
Read docs/make.jl and extract the api array to see which display name maps
to which page path (e.g. "Inversion" => "API/Inversion.md"). For each page,
read its @meta block to find CurrentModule = .... This tells you which
module's exports the page is responsible for.
@docs entries per pageFor each API page, extract every symbol entry listed inside ```@docs ```
blocks. Some entries carry type-signature qualifiers (e.g.
get_obs(ekp::EnsembleKalmanProcess)) — track both the raw entry string and
the base name (everything before the first ().
Exported but not defined (phantom exports). Before anything else, check
that every exported name actually resolves to a definition — a function, type,
or constant — somewhere in the source files of that module. If an exported name
has no definition anywhere, it is a phantom export: remove the export
statement (or just that name from a multi-name export line) from the source
file. Do not add phantom exports to any API page.
Missing from the API. A symbol is missing from a page when it is
exported from that page's CurrentModule, its base name does not appear in any
@docs block on any API page, and it has a definition in the source. If it
lacks a docstring, go back and write one now (following the conventions from
Steps 1–3) before adding it to the API page — an undocumented entry in a
@docs block will cause the docs build to error. Every exported, defined
symbol must end up with a docstring and an API page entry.
Stale API entries. An entry is stale when the base name is no longer exported from the module, or the symbol no longer has a definition in the source.
Run all three checks before making edits so you can see the full diff in one pass.
Insert each missing symbol into the section of its API page that best matches
its role. Use the existing section headings on the page as the primary guide —
## Getter functions, ## Error metrics, etc. are already established
categories; add the new symbol to the most thematically fitting one.
When no existing section fits, create a new ## heading that names the
functional group (e.g. ## Accelerators, ## Utility functions) and open a
fresh ```@docs ``` block below it. Avoid catch-all sections like
## Miscellaneous; if you find yourself reaching for that, split more finely.
Broad heuristics for categorisation when the page has no existing sections to guide you:
get_ → ## Getter functionscompute_, construct_, build_ → a computation
or construction section## Error metricsFor a multiple-dispatch function where only the primary overload is documented
(per Step 3), list only that overload. If the existing page convention uses
type-qualified entries (e.g. foo(x::MyType)), follow that convention;
otherwise use the plain name.
For each stale API entry:
@docs block. If that empties the block, delete
the block. If that empties the section, delete the section heading too.export statement from the source file. For multi-name
export lines (e.g. export foo, bar, baz), remove only the stale name and
leave the rest intact.Each base name must appear on at most one API page. If you find a duplicate,
keep it on the page whose CurrentModule matches the module where the symbol
is defined, and remove it from the other page.
Find the package name from Project.toml, then confirm the package loads
without error:
julia --project -e 'import Pkg; Pkg.instantiate(); using <PackageName>'If a docs build is configured (docs/make.jl is present), run it and resolve
any checkdocs warnings introduced by the new docstrings.
Once the docs build is clean, ask the user: "Would you like to improve the docstrings skill itself using skill-creator? You can share suggestions, or I can analyse patterns from this session — recurring edge cases, formatting decisions, or anything that felt awkward — to refine the skill for next time."
These rules encode the conventions most Julia packages following DocStringExtensions expect. Apply them consistently.
"Return the...", "Compute..."), noun phrase for types and constants.$(TYPEDSIGNATURES) must be the
very first line of a function docstring and is the sole source of the method
signature — never write a manual indented signature as well.[m/day], [kg/m³], [day], etc."[Date]", "[Dict]") —
$(TYPEDFIELDS) already renders the type. Reserve square-bracket notation
exclusively for physical units.$(METHODLIST) to
function docstrings — $(TYPEDSIGNATURES) already surfaces all overloads.
$(METHODLIST) belongs only in struct docstrings (inside # Constructors).# Arguments section: add after the opening prose for any function with
more than two parameters, or where argument semantics are non-obvious. Format:
- `name`: description [unit].# Examples section: add for every non-trivial public function where a
minimal runnable example is feasible. Use jldoctest blocks with julia>
prompts and include expected output.jldoctest block, separate each julia> prompt from the next with
a blank line. Documenter.jl rejects blocks where two prompts appear
consecutively without an intervening blank line. If a statement produces no
output, end it with a semicolon and add a blank line before the next prompt.julia> using <PackageName> (followed by a blank line). Do not assume the
package is already in scope.| Criterion | Weight | What to check |
|---|---|---|
| Completeness | High | Every exported symbol has a non-empty docstring after the task is applied. |
| Convention parity | High | New docstrings use the same macro set and structural pattern as the best-documented symbols already present. Old-format struct docstrings have been normalised. |
| Informativeness | Medium | Prose answers "what, when, why". Units present for physical quantities. # Arguments section present where needed. # Examples jldoctest block present for non-trivial public functions. |
| No duplication | Medium | Prose does not duplicate macro-generated content. Field string literals do not restate the field's type. No redundant manual # Constructor section alongside $(METHODLIST). |
| API page coverage | High | Every exported, documented symbol appears exactly once across docs/src/API/ pages. No stale entries. Symbols are grouped into descriptive sections. |
| Correctness | High | Package loads without error; docs build (if configured) completes without new warnings. |
## Before — OLD format: indented type name, no $(TYPEDEF), manual # Constructor section
"""
Sampler{FT<:AbstractFloat, T <:SamplerType} <: Process
An ensemble Kalman Sampler process. with type Sampler Type (e.g., ALDI or EKS).
# Constructor
Sampler(prior::ParameterDistribution) # ALDI update (sampler_type="aldi")
Sampler(prior::ParameterDistribution; sampler_type = "eks") # EKS update
# Fields
$(TYPEDFIELDS)
# Constructors
$(METHODLIST)
"""
struct Sampler{FT <: AbstractFloat, T} <: Process
...
end
## After — NEW format: prose only, $(TYPEDEF) for signature, $(METHODLIST) for constructors
"""
An ensemble Kalman Sampler process parameterised by algorithm type `T <: SamplerType` (`ALDI` or `EKS`).
$(TYPEDEF)
# Fields
$(TYPEDFIELDS)
# Constructors
$(METHODLIST)
"""
struct Sampler{FT <: AbstractFloat, T} <: Process
...
end## Before — function with an empty stub docstring
"""
$(TYPEDSIGNATURES)
"""
function advance(x::MyStruct, dt::Float64)
...
end
## After — prose, Arguments, and Examples sections added
"""
$(TYPEDSIGNATURES)
Advance `x` by one time step of length `dt` [days] and return the updated state.
# Arguments
- `x`: current state to advance.
- `dt`: time step length [days].
# Examples
```jldoctest
julia> using MyPackage
julia> m = MyStruct(1.0, Date(2000, 1, 1), 10);
julia> advance(m, 0.5)
...""" function advance(x::MyStruct, dt::Float64) ... end
### Multiple-dispatch: type-parameter specialisations
```julia
## Before — both specialisations documented (anti-pattern)
"""
$(TYPEDSIGNATURES)
Returns the updated parameters using the EKS algorithm.
"""
function eks_update(ekp, u, g, process::PEKS) where {FT, PEKS <: Sampler{FT, EKS}}
...
end
"""
$(TYPEDSIGNATURES)
Returns the updated parameters using the ALDI algorithm.
"""
function eks_update(ekp, u, g, process::PALDI) where {FT, PALDI <: Sampler{FT, ALDI}}
...
end
## After — only the first overload documented; second left bare
"""
$(TYPEDSIGNATURES)
Return the updated parameter vectors using the EKS sampler algorithm
(Garbuno-Iñigo, Hoffmann, Li, Stuart 2019).
"""
function eks_update(ekp, u, g, process::PEKS) where {FT, PEKS <: Sampler{FT, EKS}}
...
end
function eks_update(ekp, u, g, process::PALDI) where {FT, PALDI <: Sampler{FT, ALDI}}
...
end## Before — getter with no docstring
get_prior_mean(process::Sampler) = process.prior_mean
## After — one-liner is enough
"""
$(TYPEDSIGNATURES)
Return the prior mean vector stored in `process`.
"""
get_prior_mean(process::Sampler) = process.prior_mean© 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
Just SKILL.md in .claude/skills/docstrings of CliMA/EnsembleKalmanProcesses.jl.
Open the folder on GitHubat commit d10e521
Docstrings 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Docstrings this skillCliMA/EnsembleKalmanProcesses.jl | 127 | — | ~5.5k | Automated safety check: Pass | Apache-2.0 | |
| Diagram Designcathrynlavery/diagram-design | 44k | 1 repos | ~7.5k | Automated safety check: Pass | MIT | |
| Simple Englishmoeru-ai/airi | 50k | 2 repos | ~4.6k | Automated safety check: Pass | MIT | |
| Get API Docs with chubandrewyng/context-hub | 14k | 2 repos | ~775 | Automated safety check: Pass | MIT | |
| Doc SyncJetBrains/ideavim | 10k | 2 repos | ~2.6k | Automated safety check: Pass | MIT | |
| Mailspring App ScreenshotsFoundry376/Mailspring | 18k | — | ~1.4k | Automated safety check: Pass | GPL-3.0 |
cathrynlavery/diagram-design
Creates branded diagrams, from architecture, flowchart and sequence to charts and maps, as self-contained HTML with inline SVG, with import from draw.io, Mermaid and Excalidraw.
moeru-ai/airi
Write or rewrite technical text with the rules of ASD-STE100 Simplified Technical English so it is clear, unambiguous, and free of AI slop.
andrewyng/context-hub
Fetches current documentation for third-party APIs and SDKs with the chub CLI before the agent writes code against them, instead of relying on remembered API shapes.
JetBrains/ideavim
Keeps IdeaVim documentation in sync with code changes. An agent skill from JetBrains/ideavim.
Foundry376/Mailspring
Captures screenshots of the running Mailspring dev app for docs, PRs or visual checks by launching it with a debugging port, driving the UI and clipping to an element.
Agents365-ai/drawio-skill
Creates and edits editable draw.io diagrams from descriptions, code, infrastructure files, SQL and API schemas, with sync, review, test and export tools.
CliMA/EnsembleKalmanProcesses.jl
Scaffold and maintain a SLURM/HPC job-dependency tree for an EnsembleKalmanProcesses.jl (EKP) calibration pipeline.
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…
CliMA/EnsembleKalmanProcesses.jl
Add concise Base.show and Base.summary methods to Julia types whose default REPL representation is unhelpful or overwhelming.
CliMA/EnsembleKalmanProcesses.jl
Rewrite vague, delayed, or low-context Julia error messages into structured, actionable diagnostics.
Categories
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…. jl.jl docs build passes its checkdocs check.
Docstrings fits situations like: mentions: docstring; undocumented symbol; checkdocs warning; asks to document a type.
Run `npx skills add CliMA/EnsembleKalmanProcesses.jl --skill docstrings -a claude-code`. Or copy the skill folder (.claude/skills/docstrings in CliMA/EnsembleKalmanProcesses.jl) into .claude/skills/docstrings in your project. Claude Code loads it when a task matches its description.
Run `npx skills add CliMA/EnsembleKalmanProcesses.jl --skill docstrings -a codex`. Or copy the skill folder (.claude/skills/docstrings in CliMA/EnsembleKalmanProcesses.jl) into .agents/skills/docstrings in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add CliMA/EnsembleKalmanProcesses.jl --skill docstrings -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/docstrings, .gemini/skills/docstrings, .github/skills/docstrings and .opencode/skills/docstrings in your project.
Going by SKILL.md and its folder, Docstrings needs the command-line tools its instructions call (python3). Our summary lists: Python 3.
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.
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.
Docstrings 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.
About 5.5k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Docstrings: Diagram Design (cathrynlavery/diagram-design, 44k stars), Simple English (moeru-ai/airi, 50k stars), Get API Docs with chub (andrewyng/context-hub, 14k stars) and Doc Sync (JetBrains/ideavim, 10k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
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.