
Rozenite Agent Sdk
- 50 installs
- 641 repo stars
- Updated August 4, 2026
- callstackincubator/rozenite
rozenite-agent-sdk is a Claude skill for using Rozenite for Agents through the @rozenite/agent-sdk package in Node.js or TypeScript to inspect and call devtools tools programmatically.
About
This skill provides code-first access to Rozenite for Agents through the @rozenite/agent-sdk package in Node.js or TypeScript. It is used to write scripts, wrappers, automations, benchmarks, or agent runtimes that call Rozenite programmatically instead of driving the rozenite agent CLI. The default flow creates an agent client, opens a session, and inspects or calls tools across domains such as network, react, and memory. A developer uses it to script devtools inspection of a running React Native app.
- Code-first access to Rozenite devtools via @rozenite/agent-sdk in Node.js or TypeScript
- Flow: createAgentClient -> withSession -> inspect or call tools across domains like network, react, memory
- Uses session.domains.list() as the source of truth for live built-in and plugin domains
Rozenite Agent Sdk by the numbers
- 50 all-time installs (skills.sh)
- Ranked #311 of 596 Debugging skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
rozenite-agent-sdk capabilities & compatibility
Free; requires the @rozenite/agent-sdk package and a running Rozenite target.
- Capabilities
- devtools automation · debugging · agent tooling · sdk integration
- Use cases
- debugging · orchestration
- Pricing
- Free
What rozenite-agent-sdk says it does
Use Rozenite for Agents through `@rozenite/agent-sdk` in Node.js or TypeScript code.
Default flow: `createAgentClient()` -> `client.withSession(...)` -> inspect or call tools -> exit.
Use `session.domains.list()` as the source of truth for live built-in and runtime domains.
npx skills add https://github.com/callstackincubator/rozenite --skill rozenite-agent-sdkAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 50 |
|---|---|
| repo stars | ★ 641 |
| Last updated | August 4, 2026 |
| Repository | callstackincubator/rozenite ↗ |
What it does
Script Rozenite devtools programmatically via @rozenite/agent-sdk to inspect network, react, and memory domains.
Who is it for?
Code-first, programmatic Rozenite devtools automation via @rozenite/agent-sdk.
Skip if: Shell-driven or reusable CLI sessions, where rozenite-agent is preferred instead.
When should I use this skill?
When Codex needs to write or run scripts, wrappers, automations, benchmarks, or agent runtimes that call Rozenite programmatically.
What you get
A Node.js or TypeScript script that opens a Rozenite session and inspects or calls devtools tools across live domains.
- Node ESM scripts calling Rozenite tools
- devtools domain and tool inspection
By the numbers
- built-in domains: network, react, memory
Files
Rozenite Agent SDK
Use this skill when the user wants code-first access to Rozenite for Agents.
Read references/code-patterns.md for copy-pastable examples.
Rules
- Prefer throwaway Node ESM scripts that import
@rozenite/agent-sdk. - Default flow:
createAgentClient()->client.withSession(...)-> inspect or call tools -> exit. - Use
session.domains.list()as the source of truth for live built-in and runtime domains. - Use
session.tools.list({ domain })andsession.tools.getSchema({ domain, tool })only when you need live inspection or argument confirmation. - Prefer typed plugin SDK descriptors from any available official plugin
./sdkexport and call tools assession.tools.call(descriptor, args). - Fall back to
session.tools.call({ domain, tool, args })only when no matching./sdkdescriptor is available or the tool is discovered dynamically at runtime. - When you discover tools through
session.tools.list({ domain }), treat the returnedshortNameas the canonical tool name to pass back into a later call-by-name invocation. Do not invent camelCase aliases or normalize tool names yourself. - Prefer stable SDK domain identifiers such as built-in domain IDs (
network,react,memory) and plugin IDs (@rozenite/storage-plugin,@rozenite/tanstack-query-plugin) over CLI-only live domain tokens likeat-rozenite__storage-plugin. - If paged results should be merged automatically, use
autoPaginate. - If a plugin only mounts after navigation, navigate first, then refresh the live view with
session.domains.list()orsession.tools.list(...)before calling the plugin tool. - For advanced session control with
client.openSession()orclient.attachSession(sessionId), see the reference patterns. - If a script encounters an unexpected runtime error, let the script fail clearly. Do not hide the failure by printing placeholder JSON.
Handoff
- Use
rozenite-agentinstead when the task is shell-driven, needs a reusable CLI session, operates directly throughrozenite agent ..., or requires target enumeration before choosing adeviceId.
Code Patterns
Use these patterns as starting points for SDK-based Rozenite agent work.
Default Session Lifecycle
import { createAgentClient } from '@rozenite/agent-sdk';
const client = createAgentClient();
const result = await client.withSession(async (session) => {
const domains = await session.domains.list();
return {
sessionId: session.id,
domains: domains.map((domain) => domain.id),
};
});Use this for most scripts. withSession(...) opens the session, runs your work, and closes the session automatically.
Typed Plugin Call
import { createAgentClient } from '@rozenite/agent-sdk';
import { storageTools } from '@rozenite/storage-plugin/sdk';
const client = createAgentClient();
const result = await client.withSession(async (session) => {
return await session.tools.call(storageTools.readEntry, {
adapterId: 'mmkv',
storageId: 'user-storage',
key: 'username',
});
});Prefer typed descriptors like this when an official plugin exports them from ./sdk and the current package can actually resolve that dependency.
Official agent-enabled plugin SDK entrypoints include:
@rozenite/controls-plugin/sdk@rozenite/file-system-plugin/sdk@rozenite/mmkv-plugin/sdk@rozenite/network-activity-plugin/sdk@rozenite/react-navigation-plugin/sdk@rozenite/redux-devtools-plugin/sdk@rozenite/storage-plugin/sdk@rozenite/tanstack-query-plugin/sdk
Inspecting Domains And Tools
import { createAgentClient } from '@rozenite/agent-sdk';
const client = createAgentClient();
const result = await client.withSession(async (session) => {
const tools = await session.tools.list({
domain: 'network',
});
const schema = await session.tools.getSchema({
domain: 'network',
tool: 'listRequests',
});
return {
toolNames: tools.map((tool) => tool.shortName),
listRequestsInput: schema.inputSchema,
};
});Use this when you need to see what a domain exposes before you decide which tool to call.
Call by Name Fallback
import { createAgentClient } from '@rozenite/agent-sdk';
const client = createAgentClient();
const requests = await client.withSession(async (session) => {
return await session.tools.call<
{ limit: number },
{ items: Array<{ id: string }> }
>({
domain: 'network',
tool: 'listRequests',
args: { limit: 20 },
});
});Use this when the package does not expose a matching descriptor, or when you already know the domain and tool name.
Discover Then Call by Name
import { createAgentClient } from '@rozenite/agent-sdk';
const client = createAgentClient();
const storages = await client.withSession(async (session) => {
const tools = await session.tools.list({
domain: '@rozenite/storage-plugin',
});
const listStorages = tools.find((tool) => tool.shortName === 'list-storages');
if (!listStorages) {
throw new Error('Storage plugin did not expose list-storages.');
}
return await session.tools.call({
domain: '@rozenite/storage-plugin',
tool: listStorages.shortName,
args: {},
});
});When you discover tools at runtime, use the returned shortName exactly as-is. Do not guess camelCase or other aliases.
Pagination
import { createAgentClient } from '@rozenite/agent-sdk';
const client = createAgentClient();
const requests = await client.withSession(async (session) => {
return await session.tools.call<
{ limit: number },
{ items: Array<{ id: string }> }
>({
domain: 'network',
tool: 'listRequests',
args: { limit: 50 },
autoPaginate: { pagesLimit: 3, maxItems: 100 },
});
});Use this when a tool returns paged results and you want the SDK to follow cursors and merge pages for you.
Typed Plugin Fallback Network Call
import { createAgentClient } from '@rozenite/agent-sdk';
import { networkActivityTools } from '@rozenite/network-activity-plugin/sdk';
const client = createAgentClient();
const requests = await client.withSession(async (session) => {
return await session.tools.call(networkActivityTools.listRequests, {
limit: 20,
});
});Use this when the built-in network domain is unavailable and the app exposes the network activity plugin instead.
Target Handoff
import { createAgentClient } from '@rozenite/agent-sdk';
const client = createAgentClient();
const deviceId = 'device-id-from-rozenite-agent';
const result = await client.withSession(
{ deviceId },
async (session) => {
return {
sessionId: session.id,
deviceId: session.info.deviceId,
};
},
);When more than one simulator, emulator, or device may be connected, use the rozenite-agent skill to enumerate and choose the live target first. Then pass the chosen deviceId into the SDK flow instead of duplicating target-discovery logic here.
Advanced: Manual Session Lifecycle
import { createAgentClient } from '@rozenite/agent-sdk';
const client = createAgentClient();
const session = await client.openSession();
try {
const domains = await session.domains.list();
console.log(domains.map((domain) => domain.id));
} finally {
await session.stop();
}Use this only when the session must survive across separate steps or function boundaries. Prefer withSession(...) for everything else.
Advanced: Attach Existing Session
import { createAgentClient } from '@rozenite/agent-sdk';
const client = createAgentClient();
const session = await client.attachSession('session-1');
const result = await session.domains.list();Use this when another step already created a session and you need to reconnect to it by sessionId. Prefer withSession(...) when you can keep the whole task in one callback.
Lazy Plugin Refresh
import { createAgentClient } from '@rozenite/agent-sdk';
const client = createAgentClient();
const storageDomain = await client.withSession(async (session) => {
await session.tools.call({
domain: '@rozenite/react-navigation-plugin',
tool: 'navigate',
args: { name: 'StoragePlugin' },
});
const domains = await session.domains.list();
return domains.find(
(domain) => domain.pluginId === '@rozenite/storage-plugin',
);
});Navigate first when a plugin only mounts on a specific screen, then refresh the live domain list before using the newly mounted plugin.