Extend Commands API
redis/lettuce
Add or extend Redis commands in the Lettuce client API end-to-end — a new core command, a family of new commands, an extension to an existing command's options, or a module/area command…
Add or extend Redis commands in the Jedis client API — a new core command, a family of new commands, an extension to an existing command's options, or a module command (Search/TimeSeries/JSON/Bloom).
The automated check flagged lines worth reading first. See the safety section below.
$ npx skills add redis/jedis --skill extend-commands-api -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install redis/jedis extend-commands-api --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/redis/jedis.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/extend-commands-api .claude/skills/extend-commands-api && 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 "extend-commands-api" agent skill from https://github.com/redis/jedis/tree/master/.agents/skills/extend-commands-api into .claude/skills/extend-commands-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extend-commands-api", 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/redis/jedis/tree/master/.agents/skills/extend-commands-apiType 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 redis/jedis --skill extend-commands-api -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install redis/jedis extend-commands-api --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/redis/jedis.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/extend-commands-api .agents/skills/extend-commands-api && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "extend-commands-api" agent skill from https://github.com/redis/jedis/tree/master/.agents/skills/extend-commands-api into .agents/skills/extend-commands-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extend-commands-api", 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 redis/jedis --skill extend-commands-api -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install redis/jedis extend-commands-api --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/redis/jedis.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/extend-commands-api .cursor/skills/extend-commands-api && 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 "extend-commands-api" agent skill from https://github.com/redis/jedis/tree/master/.agents/skills/extend-commands-api into .cursor/skills/extend-commands-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extend-commands-api", 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/redis/jedis.git --path .agents/skills/extend-commands-api--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 redis/jedis --skill extend-commands-api -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install redis/jedis extend-commands-api --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/redis/jedis.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/extend-commands-api .gemini/skills/extend-commands-api && 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 "extend-commands-api" agent skill from https://github.com/redis/jedis/tree/master/.agents/skills/extend-commands-api into .gemini/skills/extend-commands-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extend-commands-api", 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 redis/jedis extend-commands-apiInstalls 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 redis/jedis --skill extend-commands-api -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/redis/jedis.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/extend-commands-api .github/skills/extend-commands-api && 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 "extend-commands-api" agent skill from https://github.com/redis/jedis/tree/master/.agents/skills/extend-commands-api into .github/skills/extend-commands-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extend-commands-api", 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 redis/jedis --skill extend-commands-api -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install redis/jedis extend-commands-api --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/redis/jedis.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/extend-commands-api .opencode/skills/extend-commands-api && 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 "extend-commands-api" agent skill from https://github.com/redis/jedis/tree/master/.agents/skills/extend-commands-api into .opencode/skills/extend-commands-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extend-commands-api", 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.
extend-commands-apiAdd or extend Redis commands in the Jedis client API — a new core command, a family of new commands, an extension to an existing command's options, or a module command (Search/TimeSeries/JSON/Bloom).
Extend Commands API is an agent skill from redis/jedis, published by the product's own GitHub organization. Add or extend Redis commands in the Jedis client API — a new core command, a family of new commands, an extension to an existing command's options, or a module command (Search/TimeSeries/JSON/Bloom). Gathers evidence (Redis server PR, HLD document), plans the full implementation matrix, then implements with unit and integration tests following Jedis maintainer conventions. Runs supervised (plan mode, user approval) by default, or unattended for automation such as the RedisClientsBot parity pipeline.
Its SKILL.md is about 7.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 Databases, covering Planning and Integration testing. It works with Redis and Java. The licence is MIT.
2 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit bb5f01d. 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:
makeghmvnredis-clijavaFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.github.comgithub.comAlso links to:
hub.docker.comredis.ioFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
REDIS_CLUSTER_PASSWORDREDIS_STANDALONE_PASSWORDFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Extend Commands API loads about 7.2k tokens when it runs. Until then it costs about 131 tokens; SKILL.md has 3,465 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 patterns that need a careful read before installing.
gh pr view` / `gh pr diff` block below. Don't ask for permission.en block access to credential files (`~/.netrc`, gh config), soration environment using the **latest** `.env.vX.XX` file underls src/test/resources/env/.env.v* | sort -V | tail -1 # → e.g. .env.v8.10pinned in the `.env.vX.XX` file is too old for the target change. InteractivelyAutomated 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 redis/jedis at commit bb5f01d, republished under its MIT licence (© redis). 3,465 words, ~7,243 tokens.
.claude/skills/extend-commands-api/SKILL.md (or your agent's skills folder).Implement a new Redis command (or extend an existing one) in Jedis, following the conventions Jedis maintainers enforce in review.
This skill runs in one of two modes. The engineering rules in every section below are identical in both; only who answers questions and approves the plan differs.
Mode: unattended or the environment
has CLIENT_SKILL_MODE=unattended. Never switch to it on your own.In unattended mode the invoking prompt supplies the inputs a human would give:
the HLD path (normally ./HLD.md), the server PR reference, the test command, and
two running servers from the redislabs/client-libs-test image it names, password-
protected like the local Docker env and without TLS: a standalone ($REDIS_URL,
password $REDIS_STANDALONE_PASSWORD, i.e. foobared) and a 6-node cluster with 3
masters and 3 replicas ($REDIS_CLUSTER_URLS, password $REDIS_CLUSTER_PASSWORD,
i.e. cluster). $REDIS_ENDPOINTS_CONFIG_PATH already points at an endpoints.json
that describes them, passwords included, as standalone0, modules-docker (the
standalone; the image ships the modules) and cluster-stable. Jedis tests read that
variable (TestEnvUtil.getEndpointsConfigPath) and authenticate with the passwords in
it, so the integration tests run against both servers unchanged. Wherever a step below has an Unattended:
note, follow the note:
| Step | Supervised | Unattended |
|---|---|---|
| Phase 0.1 HLD | ask the user for the path | read the given HLD fully |
| Phase 0.2 server PR | gh, asking to run it outside the sandbox if needed | no gh at all: the given PR reference, the HLD's facts, else the unauthenticated GitHub REST API |
| Phase 0.3 environment / image tag | make start; ask for an image tag if the command is missing | no Docker: probe the given standalone and cluster; if the command is missing there, continue with gated tests |
| Phase 0.4 redis-cli scenarios | run against standalone0 | run against the given Redis URL; if redis-cli is unavailable, write them as unverified transcripts |
| Phase 1 plan + approval | plan mode, ask before editing | write the plan into the final report, then implement it in the same session |
| Running tests | make start, mvn -B verify, make stop | mvn -B test (unit), then the changed family's integration tests on standalone and cluster through $REDIS_ENDPOINTS_CONFIG_PATH (see Running the tests) |
| An open design question | ask the user | take the HLD's choice (else the most consistent existing Jedis convention) and list it as an open question in the report |
Unattended runs also follow these rules:
Change files. A run that ends without changes has failed. Stop without editing only when implementing is impossible, and say exactly why in the report.
Don't commit, push, or open a PR. The automation that invoked you does that.
Don't edit .github/ workflows, release/version files or pom.xml versions.
The formatter includes in pom.xml are the exception (see B.7).
Finish with a report covering, in plain text with no placeholders:
This feeds the PR description (see the PR hygiene checklist).
Do all of the following before writing any plan or code:
Ask the user for the HLD. Interactively ask the user for the path to a markdown file containing the High-Level Design for the command(s) (or confirm that no HLD exists). If a path is given, read it fully — it is the primary source for syntax, semantics, reply shape, and edge cases. Unattended: don't ask; read the HLD path the invoking prompt gives.
Find the server-side PR in the redis/redis GitHub repo.
Unattended: skip every gh command in this step: gh auth status, and the
gh search / gh pr view / gh pr diff block below. Don't ask for permission.
Use the server PR reference the invoking prompt gives. The HLD usually quotes
the syntax, the reply shapes and the first version. Fill any gaps from the
unauthenticated GitHub REST API (e.g.
https://api.github.com/repos/redis/redis/pulls/<num>/files, then the raw
src/commands/*.json file), and go on to "From the server PR, extract".
Supervised: first verify that gh works in the current (sandboxed)
environment:
gh auth statusSandboxes often block access to credential files (~/.netrc, gh config), so
gh may report unauthenticated here even though it works on the user's
machine. If gh auth status fails or reports no authentication, ask the
user for permission to run the gh commands outside the sandbox (e.g. with
the sandbox override for these specific read-only commands), explaining that
gh cannot reach its credentials from inside the sandbox. Only if the user
declines (or gh is genuinely not logged in anywhere) fall back to the
unauthenticated GitHub REST API or fetching
https://github.com/redis/redis/pulls?q=<command>.
Then search for the PR that adds/extends the command on the server:
gh search prs --repo redis/redis "<COMMAND NAME>" --limit 10
gh pr view <num> --repo redis/redis
gh pr diff <num> --repo redis/redis # look at src/commands/*.json for exact syntaxFrom the server PR,
extract: exact wire syntax (argument order and optionality), reply type per
RESP2/RESP3, error conditions, time complexity, and — critically — the first
server version carrying the feature (RC builds like 8.7.225 = Redis 8.8 RC
are used for test gating). Note whether the server marks the feature
experimental / in preview.
Verify the command exists on the "next" Redis OSS version. Start the
integration environment using the latest .env.vX.XX file under
src/test/resources/env/ (pick the highest version numerically, not
lexicographically — e.g. 8.10 > 8.8):
ls src/test/resources/env/.env.v* | sort -V | tail -1 # → e.g. .env.v8.10
make start version=8.10Then probe the standalone0 endpoint. Read its connection details from
src/test/resources/endpoints.json (currently redis://localhost:6379,
password foobared) and check the target command via redis-cli:
redis-cli -u redis://localhost:6379 -a foobared INFO server | grep redis_version
redis-cli -u redis://localhost:6379 -a foobared COMMAND INFO <COMMAND> # non-empty → command exists
redis-cli -u redis://localhost:6379 -a foobared COMMAND DOCS <COMMAND> # arity/args — compare with the server PRFor a NEW command, COMMAND INFO must return a non-empty reply. For an
EXTENDED command, additionally invoke it with the new syntax against a
scratch key and confirm the server accepts it (no ERR syntax error /
ERR unknown argument).
If the command/option is missing on the latest env version, the image tag
pinned in the .env.vX.XX file is too old for the target change. Interactively
ask the user for a redislabs/client-libs-test image tag that contains it
(e.g. an RC/edge/milestone build — tags are listed at
https://hub.docker.com/r/redislabs/client-libs-test/tags; you may check them
yourself and suggest candidates). Then restart the environment with that tag
and re-run the probes:
make stop
make start CLIENT_LIBS_TEST_IMAGE_TAG=<tag>If the user has no tag to offer (or the probe still fails), report it and
proceed anyway: the implementation can continue, but integration tests will
be gated/skipped until a redislabs/client-libs-test image ships the change.
Keep the environment running for later test runs, or make stop if you
won't need it soon.
Unattended: no Docker, no make start/make stop, no image-tag question.
The servers already run the target image. Probe the standalone with the same
INFO server / COMMAND INFO / COMMAND DOCS checks (e.g.
redis-cli -u "$REDIS_URL" COMMAND INFO <COMMAND>; the URL carries the
credentials), and the cluster with redis-cli -c -h "$REDIS_CLUSTER_HOST" -p "$REDIS_CLUSTER_START_PORT" -a "$REDIS_CLUSTER_PASSWORD" --no-auth-warning CLUSTER INFO
(expect cluster_state:ok). If the command is missing, continue anyway with
gated integration tests, and say so in the report.
Create redis-cli showcase test cases. Once the command is available on
the running environment, derive a small set of redis-cli scenarios from the
HLD and the server PR and run them against standalone0. These serve two
purposes at once:
redis-cli -3 too if RESP3 replies differ), edge cases and error
conditions called out in the HLD (empty/missing key, out-of-range args,
conflicting options), so the Java implementation is built against observed
replies, not assumptions.foo/bar (e.g. rate-limit counters for a bounded INCR, sensor
readings for a time-series aggregator).Save the scenarios as a commented script in a scratch file (one block per
use-case: a one-line "what this demonstrates" comment, the redis-cli
commands, and the observed reply pasted back as comments). Carry this
material forward: it feeds the Phase 1 plan (as the explanation of the
feature and the source of expected values for tests), the Java test
assertions, and the PR description. If the command could not be made
available on any image (see step 3), still write the scenarios from the
HLD/PR as expected transcripts and mark them unverified.
Unattended: run the scenarios against $REDIS_URL instead of
standalone0. For a keyed command, also run one through the cluster. Always
pass the Redis command as arguments: a bare redis-cli waits on stdin and
hangs a headless run.
redis-cli -u "$REDIS_URL" <COMMAND> <args...>
redis-cli -c -h "$REDIS_CLUSTER_HOST" -p "$REDIS_CLUSTER_START_PORT" \
-a "$REDIS_CLUSTER_PASSWORD" --no-auth-warning <COMMAND> <args...>If redis-cli isn't installed, write them as unverified expected transcripts. Keep the scratch file out of the change; carry the
scenarios into the report instead.
Read docs/integration-testing.md in the Jedis repo — it defines the test
environment, endpoint discovery, *Test vs *IT naming, and how to run tests.
Trace one analogous existing command end-to-end in the codebase (same command group, similar reply shape) so the plan mirrors real code, not guesswork.
Determine the @since version:
mvn help:evaluate -Dexpression=project.version -q -DforceStdoutStrip -SNAPSHOT (e.g. 8.0.0-SNAPSHOT → @since 8.0).
Using the evidence, classify the change with the decision tree below, enumerate the exact file-by-file touch list, the test matrix, and the gating annotations. Open the plan with a short "what this feature enables" section built from the redis-cli showcase scenarios (Phase 0 step 4), including one or two representative command/reply transcripts, so the reader sees the use-case before the file list.
A. Extension of an existing command that fits an existing params class (e.g. new enum value / new option token):
IParams.addParams(CommandArguments) delegation carries the new option through
automatically, for both String and binary surfaces.Rawable
(bytes come from SafeEncoder.encode(name()) — self-wiring).this, extend
addParams(), and update equals/hashCode in sync.*BuilderFactory to branch on
reply size. Jedis does not defensively copy response collections (stated
maintainer convention).B. New core command(s) — the FULL matrix, every layer:
Protocol.java — new Command enum constant(s); new Keyword constants for
sub-tokens, grouped under a // <FEATURE> keywords comment, alphabetical.
Never add a Keyword that duplicates a token already carried by a dedicated
Rawable enum (dead keywords get flagged in review).commands/: <Group>Commands, <Group>BinaryCommands,
<Group>PipelineCommands, <Group>PipelineBinaryCommands. For a whole new
command family, create four new <Family>*Commands interfaces and add one
extends entry to JedisCommands, JedisBinaryCommands, PipelineCommands,
PipelineBinaryCommands.CommandObjects — String and byte[] factory methods side by side under a
// <Feature> commands section. ClusterCommandObjects needs overrides ONLY
for multi-key commands requiring slot checks; single-key commands need nothing.UnifiedJedis — one-line @Override delegating to
executeCommand(commandObjects.xxx(...)).PipeliningBase — appendCommand(commandObjects.xxx(...)) returning
Response<T>.Jedis (legacy) — checkIsInMultiOrPipeline(); connection.executeCommand(commandObjects.xxx(...)).pom.xml — add every new file to the formatter-maven-plugin includes list
(this repo format-enforces an allowlist; new files must be registered).C. Extension needing new overloads / a new params class (hybrid): new methods go through the full matrix of B; the option plumbing follows the params conventions below.
D. Module command (search / timeseries / json / bloom):
*BinaryCommands variants
for modules; never create them.TimeSeriesProtocol.TimeSeriesCommand/TimeSeriesKeyword,
SearchProtocol.SearchCommand/SearchKeyword, …), each an enum implementing
ProtocolCommand/Rawable with SafeEncoder.encode()-cached bytes.Reducer subclasses) build a List<Object> via
getOwnArgs(); the parent computes narg automatically. Canonicalize clause
order at serialization time regardless of builder call order.TimeSeriesBuilderFactory, SearchBuilderFactory); search aggregation results
are loosely typed and often absorb new reply content with no parsing changes.byte[] overloads. Numeric/structural
args (long index, ranges, booleans, enums) stay identical.foo(String) and
foo(byte[]) setters (see ArgrepParams).String→byte[],
List<String>→List<byte[]>); count/index/model results stay shared.params/)IParams with addParams(CommandArguments args). Fluent setters
return this; provide a static factory named after the class
(increxParams(), rangeParams()).BaseFooParams<T extends BaseFooParams<T>> with a private
self() cast, plus two concrete subclasses — compile-time type safety over a
polymorphic single class.equals/hashCode (needed for Mockito matching in mocked tests)
and keep them in sync with every new field. toString is not required on
params classes.IllegalArgumentException /
IllegalStateException messages, consistent wording across sibling classes
(e.g. "Aggregators must be non-null and non-empty"). Required-config checks may
run at serialization time. No client-side server-version checks — an old server
returning an error is acceptable and should be noted in the PR description.SetParams).BuilderFactory / resps/)LONG_LIST, DOUBLE_LIST, STRING, ENCODED_OBJECT_MAP, …). Maintainers
actively reject bespoke response classes for 2-element arrays and the like.redis.clients.jedis.util.KeyValue<K,V> for pair replies.resps/: public String constants for reply field names, a
Map<String,Object>-taking constructor, typed getters, plus a raw-map accessor
for forward compatibility; subclass for FULL/extended variants.Long — never Optional/OptionalLong
in the command API; consistency with existing signatures (e.g. zrank) wins.aropAggregate/aropBitwise/aropCount)
rather than one polymorphic method. But mode selected by argument type uses
overloads of one name (increx(key, long, …) / increx(key, double, …)),
with the mode keyword (BYINT/BYFLOAT) implied by the overload.SafeEncoder.encode() — never String.getBytes().Protocol.toByteArray().args/ and implement Rawable with
raw = SafeEncoder.encode(name()) cached in the constructor.@since, @ExperimentalUnifiedJedis,
Jedis, PipeliningBase, CommandObjects) carry none.<b><a href="https://redis.io/commands/xxx">XXX Command</a></b>, prose semantics, Time complexity: O(...), @param,
@return, @since <version>. Binary variants get short javadoc with
@see to the String variant. Pipeline variants: one line — "Pipeline variant
of {@link ...}" + @since.@since on every new public method and class, computed from pom.xml.redis.clients.jedis.annots.Experimental and label the PR experimental.
Do NOT use @Experimental for stable GA features.Follow docs/integration-testing.md for environment, layout, and naming. The
established per-command test layers (write all that apply):
params/FooParamsTest, plain *Test, no Redis):
@Nested groups (ValidationTests, AddParamsTests, overload-equivalence),
asserting exact wire args and order with
redis.clients.jedis.util.CommandArgumentsMatchers
(hasArgumentCount, hasArguments) and RawableFactory.from(...); also test
the equals/hashCode contract.@Mock CommandObject<T>
fields to MockedCommandObjectsTestBase (name them by TYPE, e.g.
listLongCommandObject — reuse existing ones when the type matches), then
when/verify tests in mocked/unified/UnifiedJedis<Group>CommandsTest and
mocked/pipeline/PipeliningBase<Group>CommandsTest.commands/unified/<Group>CommandsTestBase when one exists; for a new family,
create <Family>CommandsTestBase extends UnifiedJedisCommandsTestBase plus
thin per-topology runners — standalone
(RedisClientCommandsTestHelper.getClient(protocol)) and cluster
(ClusterCommandsTestHelper.getCleanCluster(protocol)). New concrete
integration classes MUST be named *IT — never *IntegrationTest, never
@Tag("integration") on new classes.s1{:}) so keys share a slot; tests semantically
incompatible with cluster get @Test @Override + @Disabled("<reason>")
empty bodies.Jedis coverage: extend commands/jedis/<Group>*CommandsTest
(which extends JedisCommandsTestBase) — can be minimal (smoke/missing-key)
when the unified base covers behavior fully. Binary variants get their own
integration tests (reviewers ask for these explicitly).Cross-cutting test conventions:
@ParameterizedClass +
@MethodSource("redis.clients.jedis.commands.CommandsTestsParameters#respVersions")
(or #jedisRespVersions for legacy) — no per-test work; just make sure new
classes inherit the right base.@SinceRedisVersion("<RC build>")
(e.g. "8.7.225" for 8.8) at the shared base-class level ONCE — do not repeat
it on subclasses (maintainers remove redundant ones). Command not yet in any
GA server → @EnabledOnCommand("<COMMAND>") (capability probe via COMMAND
INFO). Module presence as precondition → assumeTrue(hasCommand(...)) probes.
Environment exclusions → @ConditionalOnEnv(value = TestEnvUtil.ENV_..., enabled = false) (e.g. skip Redis Enterprise for brand-new features).hashCode()
literals).Jedis pins the CI JDK (Java 8) for the test build — check
.github/workflows/ for the exact version and use a matching local JDK. Verify
with java -version before running anything; a newer JDK may fail the build or
silently produce the wrong bytecode target.
Unit tests (Surefire, no Redis): mvn -B test, or mvn -Dtest=FooParamsTest test.
Integration tests (Failsafe) need the Docker env and the verify lifecycle:
make start version=8.8 # pick the version that carries the new command
mvn -B verify # or: mvn -Dtest=FooIT verify
make stopNever run integration coverage via mvn test/surefire:test — Failsafe owns
*IT classes. If a brand-new command isn't in any published
redislabs/client-libs-test tag yet, say so: the integration tests will be
skipped/gated (that is expected and acceptable — @EnabledOnCommand /
@SinceRedisVersion handle it), but they must still be written and compile.
Unattended: no make start/make stop. The servers are already running
and $REDIS_ENDPOINTS_CONFIG_PATH points the tests at them. Run:
Unit tests: mvn -B test, or the test command the invoking prompt gives.
The changed family's integration tests on both topologies, through Failsafe only. Two kinds of runner exist:
@Tag("integration") *Test classes (Failsafe's
it-tagged execution), namely the unified standalone runner
RedisClient<Family>CommandsTest, the cluster runner
Cluster<Family>CommandsTest and the legacy commands/jedis/<Family>CommandsTest*IT classes (the it-suffix execution), a
standalone runner in commands/unified/client/<module>/ (e.g.
BloomRedisClientCommandsIT, on modules-docker) and a cluster runner in
commands/unified/cluster/<module>/ (e.g. BloomClusterCommandsIT, on
cluster-stable; the cluster image loads the modules too)Select them with one wildcard that covers both kinds and every topology, plus an explicit name for any new runner that doesn't match it:
mvn -B -DskipUnitTests=true -Dit.failIfNoSpecifiedTests=false \
-Dit.test='*<Family>*Commands*' verify-Dit.failIfNoSpecifiedTests=false is needed because each Failsafe execution
sees the same filter and one of them usually matches nothing. That also means
verify can pass having run no test, so don't trust the exit code alone.
Prove it ran: read target/failsafe-reports/*.txt (one file per class, named
by its fully qualified class name) and list every class that ran with its counts.
A class in package redis.clients.jedis.commands.unified.cluster (any
sub-package) is a cluster run; anything else is standalone. Don't go by the
name prefix: module runners are <Family>ClusterCommandsIT, and one is
FTHybridCommandsClusterIT. At least one standalone class and one cluster class
must report Tests run: > 0 for the changed commands. This applies to module
families too. If either topology ran nothing, fix the filter and rerun. Don't
report success.
Tests that need endpoints the file doesn't have (sentinel, TLS, ACL users,
cluster-unbound) are out of scope: list them as not run. Report passed /
failed / skipped per topology, and the classes run.
pom.xml formatter-plugin includes.@since (and @Experimental if preview) on all new public API.Protocol.Keyword constants.equals/hashCode on params updated and unit-tested.docs/ updated if user-facing behavior/configuration changed; migration
guide entry if anything breaks.© redis, MIT. 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 .agents/skills/extend-commands-api of redis/jedis.
Open the folder on GitHubat commit bb5f01d
Extend Commands API 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 |
|---|---|---|---|---|---|---|
| Extend Commands API this skillredis/jedis | 12k | — | ~7.2k | Automated safety check: Warn | MIT | |
| Extend Commands APIredis/lettuce | 5.8k | — | ~7.7k | Automated safety check: Notes | MIT | |
| Writing Testsvert-x3/vertx-redis-client | 142 | — | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| Io ConnectorsKilo-Org/kilo-marketplace | 190 | — | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| Go Redis Client Test Runnerredis/go-redis | 22k | — | ~786 | Automated safety check: Pass | BSD-2-Clause | |
| Writing Javadocredis/lettuce | 5.8k | — | ~809 | Automated safety check: Pass | MIT |
redis/lettuce
Add or extend Redis commands in the Lettuce client API end-to-end — a new core command, a family of new commands, an extension to an existing command's options, or a module/area command…
vert-x3/vertx-redis-client
Testing patterns for Vert.x Redis Client: test frameworks, async testing, test locations, container setup, and how to run tests.
Kilo-Org/kilo-marketplace
Guides development and usage of I/O connectors in Apache Beam.
redis/go-redis
Explains how to run go-redis tests: the Docker Compose stack, make targets, focusing a single Ginkgo spec, the e2e suite and the version environment variables.
redis/lettuce
A skill your agent uses when writing or editing Javadoc for Lettuce public API — new methods, classes, deprecations, or when a reviewer asks to fix or improve doc comments.
wujun728/jun_java_plugin
一键生成完整业务模块代码(SQL/Entity/DAO/XML/Repository/Service/Controller/Mapper/POJO),用于创建新的业务功能
redis/jedis
Generate a clear, concise GitHub PR title and description from the diff between two local git branches, and save it to prDescription.md in the repo root.
Categories
Add or extend Redis commands in the Jedis client API — a new core command, a family of new commands, an extension to an existing command's options, or a module command (Search/TimeSeries/JSON/Bloom). Extend Commands API is an agent skill from redis/jedis, published by the product's own GitHub organization. Add or extend Redis commands in the Jedis client API — a new core command, a family of new commands, an extension to an existing command's options, or a module command (Search/TimeSeries/JSON/Bloom).
Extend Commands API fits situations like: tasks that involve Planning; tasks that involve Integration testing.
Run `npx skills add redis/jedis --skill extend-commands-api -a claude-code`. Or copy the skill folder (.agents/skills/extend-commands-api in redis/jedis) into .claude/skills/extend-commands-api in your project. Claude Code loads it when a task matches its description.
Run `npx skills add redis/jedis --skill extend-commands-api -a codex`. Or copy the skill folder (.agents/skills/extend-commands-api in redis/jedis) into .agents/skills/extend-commands-api 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 redis/jedis --skill extend-commands-api -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/extend-commands-api, .gemini/skills/extend-commands-api, .github/skills/extend-commands-api and .opencode/skills/extend-commands-api in your project.
Going by SKILL.md and its folder, Extend Commands API needs the command-line tools its instructions call (make, gh, mvn, redis-cli and java) and credentials named REDIS_CLUSTER_PASSWORD and REDIS_STANDALONE_PASSWORD. Our summary lists: Docker.
SKILL.md names 4 domains. In commands or code: api.github.com and github.com; the agent is likely to contact these when it follows the instructions. As links in the text: hub.docker.com and redis.io. This is read from the text; nothing was executed.
Our automated static check of SKILL.md flagged 2 warning(s): tells the agent its actions are pre-authorized / not to stop for confirmation; mentions a credentials file (ssh keys, cloud or package-manager tokens). Read the flagged lines before installing; the check is not a guarantee either way.
Extend Commands API is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.2k tokens (SKILL.md is roughly 29k 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 Extend Commands API: Extend Commands API (redis/lettuce, 5.8k stars), Writing Tests (vert-x3/vertx-redis-client, 142 stars), Io Connectors (Kilo-Org/kilo-marketplace, 190 stars) and Go Redis Client Test Runner (redis/go-redis, 22k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
redis (a GitHub organization, an official publisher) maintains it in redis/jedis, which has 12,365 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 8, 2026.
Source: redis/jedis on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.