Agent skill

Marimo Pair

by PhySpace in PhySpace/SimpleCADAPI

Drive a live marimo notebook as a workspace: run Python in the same kernel the user does, inspect live notebook state, and commit durable notebook changes.

Apache-2.0Auto-check passedData & Analytics

Install Marimo Pair

skills CLI
$ npx skills add PhySpace/SimpleCADAPI --skill marimo-pair -a claude-code

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

GitHub CLI
$ gh skill install PhySpace/SimpleCADAPI marimo-pair --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/PhySpace/SimpleCADAPI.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/marimo-pair .claude/skills/marimo-pair && 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
marimo-pair
GitHub stars
140
Token cost
~3k tokens
SKILL.md length
1,429 words
Files
8 (incl. scripts)
Skills in repo
3
Repo updated
First seen
Licence
Apache-2.0

At a glance

Drive a live marimo notebook as a workspace: run Python in the same kernel the user does, inspect live notebook state, and commit durable notebook changes.

  • Works in 3 steps: Run the inspection command once. → Wait for successful help(cm) output. → Then use cm.get_context() or another cm…
  • The user wants to start a marimo notebook
  • SKILL.md covers Required first kernel command, Connect to a Notebook, Scratchpad Scope and Marimo Rules, plus 3 more sections
  • Runs Shell scripts from its folder; calls bash

What it does

Marimo Pair is an agent skill from PhySpace/SimpleCADAPI. Drive a live marimo notebook as a workspace: run Python in the same kernel the user does, inspect live notebook state, and commit durable notebook changes. Use when the user wants to start a marimo notebook or pair on an active marimo session.

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 9 other files, including scripts (for example `reference/execution-context.md`, `reference/finding-marimo.md` and `reference/gotchas.md`).

It sits in Data & Analytics, covering Jupyter notebooks. It works with marimo and Python. The repository describes itself as: An agent-native CAD SDK for language models to create, inspect, and reconstruct complex, editable 3D models. The licence is Apache-2.0.

When your agent uses it

  • The user wants to start a marimo notebook
  • Pair on an active marimo session

Example prompts

  • “/marimo-pair”

Requirements

  • Python 3
  • A Bash shell
  • Pre-approved tools (allowed-tools): Bash(bash **/scripts/discover-servers.sh *), Bash(bash **/scripts/execute-code.sh *), Read

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Run the inspection command once.
  2. Wait for successful help(cm) output.
  3. Then use cm.get_context() or another cm API in a later call.

What it can do on your machine

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

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash(bash **/scripts/discover-servers.sh *)
    • Bash(bash **/scripts/execute-code.sh *)
    • Read

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 2 files in scripts/ (Shell), which the agent can run.

    Shell commands in SKILL.md call:

    • bash

    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

Marimo Pair loads about 3k tokens when it runs. Until then it costs about 64 tokens; SKILL.md has 1,429 words of instructions outside code blocks.

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

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); the scripts in this folder are not scanned.

SKILL.md

The full file from PhySpace/SimpleCADAPI at commit ea93070, republished under its Apache-2.0 licence (© PhySpace). 1,429 words, ~2,978 tokens.

Download SKILL.mdSave it as .claude/skills/marimo-pair/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.
name
marimo-pair
description
Drive a live marimo notebook as a workspace: run Python in the same kernel the user does, inspect live notebook state, and commit durable notebook changes. Use when the user wants to start a marimo notebook or pair on an active marimo session.
allowed-tools
Bash(bash **/scripts/discover-servers.sh *), Bash(bash **/scripts/execute-code.sh *), Read

marimo is a reactive Python runtime for building reproducible Python programs (marimo notebooks). Cells are connected by the variables they define and reference. Running a cell re-executes dependents in dataflow order. The active runtime holds the kernel namespace, cell state, and dataflow graph. The notebook (.py file) is the artifact the kernel writes from that state while a session is running.

A user interacts with the same runtime via a notebook UI with cells, outputs, and widgets.

WARNING. The active runtime is the source of truth. During a session, you SHOULD NOT modify the associated .py file directly. File edits WILL NOT reach the active kernel or user, and the kernel may overwrite them on save. Use marimo._code_mode (cm) for notebook changes. Reading disk is fine, but prefer ctx.cells[...].code for current cell code.

The harness reports the absolute path to this SKILL.md. Resolve bundled scripts/... and reference/... paths from its parent directory, even when the current working directory is a notebook workspace. In command examples, replace /absolute/path/to/marimo-pair with that directory.

Required first kernel command

Start every code-mode session with this dedicated command:

bash
bash /absolute/path/to/marimo-pair/scripts/execute-code.sh \
  --url http://localhost:2718 \
  -c "import marimo._code_mode as cm; help(cm)"

Follow this order for each kernel, including read-only tasks:

  1. Run the inspection command once.
  2. Wait for successful help(cm) output.
  3. Then use cm.get_context() or another cm API in a later call.

Do not run task-specific cm code before the inspection command succeeds.

Connect to a Notebook

Use the bundled execute-code.sh from the reported skill directory or MCP (execute_code(...)) to run Python in a live marimo kernel.

execute-code.sh always takes --url. If the user provides a notebook URL, run the required inspection against it directly:

bash
bash /absolute/path/to/marimo-pair/scripts/execute-code.sh \
  --url http://localhost:2718 \
  -c "import marimo._code_mode as cm; help(cm)"

After that command succeeds, pass task code with -c CODE, - for stdin, or a file path:

bash
bash /absolute/path/to/marimo-pair/scripts/execute-code.sh \
  --url http://localhost:2718 - <<'PY'
import marimo._code_mode as cm

async with cm.get_context() as ctx:
    cid = ctx.create_cell("x = df.head()")
    ctx.run_cell(cid)
PY

If the user gives no URL, find or start a notebook. Look for a running server with bash /absolute/path/to/marimo-pair/scripts/discover-servers.sh, MCP list_sessions(), or local process context, and pass the url it reports to --url. With one notebook open, the script targets it automatically; with several, pass --file with the notebook's file key.

If no server is running and the user wants a notebook, start marimo with --no-token (and without --headless) so it auto-registers for discovery. The notebook UI must be open for execute-code to target it. The right invocation depends on context (project tooling, global install, sandbox mode). If the notebook file contains a PEP 723 # /// script header, it MUST be opened with --sandbox — otherwise marimo ignores the inline dependencies. See finding-marimo.md for the full decision tree and execution-context.md for selector resolution, scripts, MCP, and shell quoting.

Scratchpad Scope

execute-code evaluates Python in marimo's scratchpad: a temporary namespace with a shallow copy of the kernel globals. Notebook variables are available by name, but new top-level bindings and rebindings are discarded after each call. In-place mutations to notebook-owned objects can persist because those names still reference live objects.

Each call reports stdout and stderr from the scratchpad, plus console output from notebook cells it causes to run, including reactive descendants.

Ordinary Python

Use ordinary Python in the scratchpad to inspect variables, sample data, test transformations, probe APIs, check imports, and read widget state.

python
print(df.head())

x = 10
print(x)

Here df comes from notebook globals, while x is a scratchpad-local binding. x exists for this call only and WILL NOT be added to notebook globals.

Persist with cm

Top-level scratchpad assignments and rebindings are temporary. To persist work, including new variables, you MUST submit changes through marimo._code_mode (cm).

marimo._code_mode is a PRIVATE, UNSTABLE agent API (note the leading underscore). It exists for tools like this skill to drive a live kernel from the scratchpad. DO NOT import it from notebook cells, library code, or anything a user would run — methods can change or disappear across marimo versions and kernels. Treat every import marimo._code_mode as cm as scratchpad-only.

Open a code-mode context to queue notebook changes.

python
import marimo._code_mode as cm

async with cm.get_context() as ctx:
    cid = ctx.create_cell("x = df.head()")
    ctx.run_cell(cid)

The scratchpad supports top-level async code. Use async with directly; wrapping it in asyncio.run(...) is unnecessary and can conflict with the kernel's event loop.

After this block exits and the new cell runs, x is notebook state. Later scratchpad calls can read x by name. Code later in the same scratchpad call should read ctx.globals["x"], because the scratchpad namespace was copied before the cell ran.

Inside the context, queued mutation methods are synchronous. Call them directly; do not await them. Each call queues an operation for marimo to apply when the context exits normally. If the block raises, the queue is discarded.

On clean exit, marimo applies packages, validates and applies structural cell changes, runs queued cells, then may run dependents. Validation is only structural since queued cell runs can still error. create_cell and edit_cell change notebook structure only. Use run_cell to execute.

create_cell currently defaults to hide_code=True, which collapses the code editor in the UI. Pass hide_code=False if the user wants created cells to be visible without manually expanding them.

Show full SKILL.md (627 more words)Show less

Marimo Rules

marimo imposes a small contract on notebook code so it can keep the notebook as a directed acyclic graph (DAG):

  • No cycles - cells cannot depend on each other in a cycle.
  • No public redefinitions across cells - each name has one owning cell.
  • No wildcard imports - import * prevents static analysis of definitions.

These rules keep the kernel, UI, and saved artifact consistent.

When cm submits a cell body, marimo parses its top-level definitions and references. Public names enter the graph. Names that start with _ are local to their cell and unavailable to other cells. If a cm edit violates the contract, marimo rejects the structural change and returns the validation error.

The Notebook's Shape

A notebook is an ordered collection of cells. ctx.cells is the document view and ctx.graph is the dataflow view.

python
for cell in ctx.cells:
    cell  # .id, .code, .name, .config, .status, .errors

ctx.cells["setup"]         # by name
ctx.cells[0]               # by position
list(ctx.cells.keys())     # all IDs, in notebook order

Cell IDs are opaque strings which can be queried from the notebook or captured from cm return values:

python
cid = ctx.create_cell("df = pd.read_csv('data.csv')")
print(cid)   # e.g. 'Hbol'

Alternatively, cells can be assigned and referenced by name. The graph can be used to understand its role in the dataflow.

python
for cid, impl in ctx.graph.cells.items():
    impl  # .defs, .refs   (sets of public names)

ctx.graph.descendants(cid)   # cells that re-run when this one changes
ctx.graph.ancestors(cid)     # cells this one depends on

In marimo, deletes are destructive so it can be useful to query the descendants prior to deleting to understand it's impact.

Writing Notebook Changes

The graph contract keeps marimo able to run and save the notebook. Passing those checks alone does not guarantee a useful artifact. Committed cells should still be readable, rerunnable, and editable.

Make durable edits that reuse the notebook's existing names, imports, dependencies, and UI model. Don't be lazy. Avoid one-off workarounds that pass cm validation but leave a brittle notebook.

Cell Bodies

Submit the code that belongs in the cell.

  • Submit cell contents - create_cell and edit_cell take cell contents, not saved-file @app.cell wrappers.
  • Read before replacing - for now, another editor may change a cell between scratchpad calls. Before edit_cell, read the current body from ctx.cells[...] and submit the full replacement.
  • Reuse notebook imports - if np already exists, use it or edit the owning import cell. DO NOT add import numpy as _np just to bypass the graph.
  • Define each public name once - a public name has one owning cell. Reassigning it in another cell fails with Multiply-defined names; edit the owning cell or give the result a new name. See gotchas.md.
  • Run cells deliberately - create_cell and edit_cell change structure only. Queue ctx.run_cell(...) when the cell should execute.
Cell Boundaries

A cell is also a rerun boundary. Put expensive or reusable computation upstream of presentation so UI edits stay cheap. Keep cheap, presentation-specific work with the view when that is easier to read.

Use mo.vstack and mo.hstack only when the composition is part of the UI. Narrative often reads better in an adjacent markdown cell.

Prefer cm-Managed Changes

Use cm APIs when they exist. Avoid direct file edits, shell package commands, and scratchpad-only state for changes that should persist.

  • Do not edit the .py artifact - DO NOT use Edit, Write, or NotebookEdit on the notebook file during a live session. Use ctx.edit_cell(...) even for small changes.
  • Manage packages through cm - use ctx.packages.add() or ctx.packages.remove() instead of direct uv or pip; confirm non-obvious dependency changes.
  • Avoid transient paths - persisted cells should not depend on /tmp/... unless the work is intentionally transient.
  • Delete deliberately - deleting a cell removes globals it defines. Reuse empty cells when convenient and delete cells left empty after edits.
UI and Widgets

Inspect the object before changing it. Different UI objects update through different paths.

  • Set mo.ui.* through cm - use ctx.set_ui_value(element, value) inside cm.get_context().
  • Set anywidget traitlets directly - synced traitlets are Python attributes, for example widget.value = 5.

For designing custom visual or interactive output, see rich-representations.md.

References

© PhySpace, 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

SKILL.md and 7 other files (scripts) in .agents/skills/marimo-pair of PhySpace/SimpleCADAPI.

  • SKILL.md
  • reference/execution-context.md
  • reference/finding-marimo.md
  • reference/gotchas.md
  • reference/notebook-improvements.md
  • reference/rich-representations.md
  • scripts/discover-servers.sh
  • scripts/execute-code.sh

Open the folder on GitHubat commit ea93070

Compare with similar skills

Marimo Pair 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.

Marimo Pair compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Marimo Pair this skillPhySpace/SimpleCADAPI140—~3kAutomated safety check: PassApache-2.0
Wasm Compatibilityericmjl/llamabot1822 repos~1.6kAutomated safety check: PassNone
Marimo Paircosanlab/nltools1311 repos~3kAutomated safety check: PassMIT
Marimo Notebookcosanlab/nltools1314 repos~2.1kAutomated safety check: PassMIT
Marimo Pair Vscodemarimo-team/marimo-lsp130—~2.7kAutomated safety check: PassApache-2.0
Marimobrycewang-stanford/Auto-Empirical-Research-Skills4.5k—~2.8kAutomated safety check: PassCustom licence

Similar skills

  • Wasm Compatibility

    ericmjl/llamabot

    Check if a marimo notebook is compatible with WebAssembly (WASM) and report any issues.

    182 GitHub starsUsed in 2 repos~1.6k tokens
    Data & AnalyticsAuto-check passed
  • Marimo Pair

    cosanlab/nltools

    Work inside a running marimo notebook's kernel — execute code, create cells, and build a notebook as an artifact.

    131 GitHub starsUsed in 1 repo~3k tokens
    Data & AnalyticsAuto-check passed
  • Marimo Notebook

    cosanlab/nltools

    Write a marimo notebook in a Python file in the right format.

    131 GitHub starsUsed in 4 repos~2.1k tokens
    Data & AnalyticsAuto-check passed
  • Marimo Pair Vscode

    marimo-team/marimo-lsp

    Drive a live marimo notebook in VS Code as a workspace: run Python in the same kernel the user does, inspect and explore live notebook state and data, prototype and debug code, and commit durable…

    130 GitHub stars~2.7k tokensUpdated yesterday
    Data & AnalyticsAuto-check passed
  • Marimo

    brycewang-stanford/Auto-Empirical-Research-Skills

    Reactive Python notebook system. An agent skill from brycewang-stanford/Auto-Empirical-Research-Skills.

    4.5k GitHub stars~2.8k tokensUpdated 2 days ago
    Data & AnalyticsAuto-check passed
  • Marimo Notebook

    minicoohei/ai-agent-camp

    marimo ノートブックを正しいフォーマットでPythonファイルに作成するスキル. An agent skill from minicoohei/ai-agent-camp.

    347 GitHub stars~1.5k tokensUpdated today
    Data & AnalyticsAuto-check passed

More from PhySpace/SimpleCADAPI

  • Simplecadapi

    PhySpace/SimpleCADAPI

    Build, assemble, inspect, reconstruct, and export parametric CAD models with the SimpleCADAPI Python SDK.

    140 GitHub stars~2.5k tokensUpdated 5 days ago
    Auto-check passed
  • Retro Marimo Pair

    PhySpace/SimpleCADAPI

    Session retrospective for improving marimo-pair and marimo.codemode.

    140 GitHub stars~1.6k tokensUpdated 5 days ago
    Auto-check passed

Works with

Questions about Marimo Pair

What does Marimo Pair do?

Drive a live marimo notebook as a workspace: run Python in the same kernel the user does, inspect live notebook state, and commit durable notebook changes. Marimo Pair is an agent skill from PhySpace/SimpleCADAPI. Drive a live marimo notebook as a workspace: run Python in the same kernel the user does, inspect live notebook state, and commit durable notebook changes.

When should I use Marimo Pair?

Marimo Pair fits situations like: the user wants to start a marimo notebook; pair on an active marimo session.

How do I install Marimo Pair in Claude Code?

Run `npx skills add PhySpace/SimpleCADAPI --skill marimo-pair -a claude-code`. Or copy the skill folder (.agents/skills/marimo-pair in PhySpace/SimpleCADAPI) into .claude/skills/marimo-pair in your project. Claude Code loads it when a task matches its description.

How do I install Marimo Pair in Codex?

Run `npx skills add PhySpace/SimpleCADAPI --skill marimo-pair -a codex`. Or copy the skill folder (.agents/skills/marimo-pair in PhySpace/SimpleCADAPI) into .agents/skills/marimo-pair in your project. Codex loads it when a task matches its description.

Can I use Marimo Pair 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 PhySpace/SimpleCADAPI --skill marimo-pair -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/marimo-pair, .gemini/skills/marimo-pair, .github/skills/marimo-pair and .opencode/skills/marimo-pair in your project.

What does Marimo Pair need to run?

Going by SKILL.md and its folder, Marimo Pair needs a shell for the scripts in its folder and the command-line tools its instructions call (bash). Our summary lists: Python 3; A Bash shell. Its frontmatter pre-approves these tools: Bash(bash **/scripts/discover-servers.sh *), Bash(bash **/scripts/execute-code.sh *), Read.

Does Marimo Pair 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 Marimo Pair 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Marimo Pair use?

Marimo Pair 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 Marimo Pair use?

About 3k tokens (SKILL.md is roughly 12k 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 Marimo Pair?

Skills that share tags, products or a category with Marimo Pair: Wasm Compatibility (ericmjl/llamabot, 182 stars), Marimo Pair (cosanlab/nltools, 131 stars), Marimo Notebook (cosanlab/nltools, 131 stars) and Marimo Pair Vscode (marimo-team/marimo-lsp, 130 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Marimo Pair?

PhySpace (a GitHub organization) maintains it in PhySpace/SimpleCADAPI, which has 140 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 2, 2026.

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