Marimo Pair

SKILL开发
开发 未标注权限 许可证不明确

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.

一句话选型结论

按资料字段整理

Marimo Pair是开发类的 Agent Skill,安装方式:GitHub 仓库,权限级别未标注,许可证不明确,没有现成安装命令,需按说明手动放置 SKILL.md。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类开发 安装方式GitHub 仓库 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 agent-skills
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

GitHub 仓库
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    按安装说明或仓库 README,把 SKILL.md 放到客户端的 skills 目录(一般一个技能一个文件夹)。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

开发
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方lefant仓库 agent-skills · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式GitHub 仓库安装包 lefant/agent-skills
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 2026-08-20
正文体量11.0 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
写代码与改 bug

按需求补代码、定位并修掉报错。

读仓库与生成改动

让模型读懂项目结构,再给出可落地的改动。

跑测试与排查故障

按现象排查问题,补测试用例并复跑。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 基础信息齐全,可以先按说明装一个试试。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有现成安装命令,要按安装说明或仓库 README 手动放置。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在开发场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
Marimo Pair当前 未标注权限 GitHub 仓库 未标注 未标注 无
技能审查员 浏览器控制 ClawHub 市场 877.9 万 OpenClaw 有
Vercel React 最佳实践 浏览器控制 GitHub 仓库 849.1 万 Codex、Claude、Cursor 有
GitHub 代码协作 联网访问 ClawHub 市场 763.3 万 OpenClaw 有
网页设计指南 联网访问 GitHub 仓库 668.6 万 Codex、Claude、Cursor 有
本体论 只读 ClawHub 市场 663.7 万 OpenClaw 有

SKILL.md 全文

11.0 KB
模型实际读到的说明书原文,来自技能仓库

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.

Connect to a Notebook

Use the bundled script (bash scripts/execute-code.sh) 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,
target it directly:

bash scripts/execute-code.sh --url http://localhost:2718 -c "print('connected')"

Pass code with -c CODE, - for stdin, or a file path:

bash 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 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.

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.

At session start, inspect what cm exposes in the active kernel:

import marimo._code_mode as cm

help(cm)

Open a code-mode context to queue notebook changes.

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.

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. A top-level name enters the graph unless it is private with a
leading underscore.

# Public definitions: values, total, i, value, mean
values = np.array([1, 2, 3])
total = 0
for i, value in enumerate(values):
    total += value
mean = total / len(values)
mean
# Public definition: mean
_values = np.array([1, 2, 3])
_total = 0
for _i, _value in enumerate(_values):
    _total += _value
mean = _total / len(_values)
mean

Use private names for intermediates that no other cell should read. Public
names define the notebook-level dataflow. 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.

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:

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.

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 public names intentionally - use public names for values later
    cells should reference. Use private _name bindings or function locals for
    same-cell intermediates.
  • 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.

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

  • execution-context.md — scripts, MCP, auth, startup, and shell quoting
  • finding-marimo.md — choosing the right marimo invocation
  • gotchas.md — name redefinition, cached module proxies, and notebook traps
  • rich-representations.md — custom widgets and visualizations
  • notebook-improvements.md — improving existing notebooks

常见问题

5 问
答案由本站依据条目字段整理
Marimo Pair怎么安装?

没有现成安装命令:按安装说明或仓库 README,把 SKILL.md 放进客户端的 skills 目录(一般一个技能一个文件夹)。

Marimo Pair支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

Marimo Pair权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

Marimo Pair收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

Marimo Pair用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。