Sandbox
@graph-robots/open-robot-skills

Robot skills and tool bundles for GaP

This repo is a skill registry for graph-as-policy. Each bundle lives in its own directory with a `SKILL.md`, and the engine discovers them automatically by path to build robot graphs for manipulation, perception, and tool use. The registry also exposes the same bundles through a Claude Code marketplace file.

41 stars7 forksPythonUpdated 8d ago
Who it's for

Builders who want reusable robot manipulation and perception bundles for GaP or Claude Code.

What it delivers

You can add robot capabilities to your agent workflows without wiring each skill by hand.

What it does

Skill bundles

Reusable manipulation and perception skills under `skills/`, each in its own directory with its own `SKILL.md` and scripts.

Tool bundles

Model-backed callable bundles under `tools/` for motion planning, geometry, segmentation, detection, and VLM calls.

Policy bundles

Closed-loop VLA policies under `policies/` surfaced through the policy plane instead of the skill registry.

Path-based discovery

GaP finds the registry automatically when it sits next to the `graph-as-policy` checkout, or when `GAP_SKILLS_PATH` is set.

Claude Code marketplace

`.claude-plugin/marketplace.json` indexes the bundles so Claude Code can load them as agent skills.

Validation tests

A test suite checks bundle loading, contracts, behavior preservation, and model/tool assumptions.

How to get it

  1. 1Both tables are generated — regenerate after adding a bundle
    uv run gap skills table --format markdown --kind skill   # and --kind tool
  2. 2One bundle = one directory = one PR. Scaffold it
    uv run gap skills new my-skill --kind skill    # or --kind tool
  3. 3Check yourself before the PR
    uv run gap skills check && uv run gap skills test my-skill && uv run pytest tests -q
  4. 4To drive GaP itself from Claude Code — search these registries, check capabilities,…
    claude plugin marketplace add graph-robots/graph-as-policy
    claude plugin install gap@gap

README

open-robot-skills

What your robot can do, one directory at a time.

A curated, contributable library of manipulation skills and model-backed tool bundles for GaP — graph as policy, in the Anthropic Agent Skills format. The LLM pipeline composes these bundles into executable robot graphs; every bundle is one directory, one SKILL.md, one PR.

Skills Tools Format: Agent Skills PRs Welcome License: Apache 2.0

Clone this repo next to the graph-as-policy checkout (or set GAP_SKILLS_PATH) and every GaP command — gap run, gap generate, gap benchmark — discovers it automatically; no flags, no registration.

New to GaP? Start with the libero_quickstart example or the 15-minute tour, then come back here when you want to add a capability.

Contents

Skills — what the robot can do

Manipulation strategies. A skill owns subgraphs in generated workflows: its SKILL.md body is the guidance the subgraph agent reads, its scripts/ are the canonical recipes the graph executes, and its declared exit_conditions are what downstream routing keys on. Closed-loop VLA policies (pi05-libero, molmoact-libero) now live under policies/ with kind=policy — they share the bundle format but are surfaced to graphs through the policy plane, not the skill registry.

BundleDescriptionToolsExtra
anchoring-a-free-endPins one end of a cable with the support hand before any crossing is attempted — asks the support-hand planner for the anchor grasp as joint-space legs, refuses it when its worst IK error is past the limit, streams the legs, closes the jaws to the plan's own width and dwells for the fingers' travel, and carries the solved chain and grasp orientation out on the exit so later pay-outs seed from them.open-robot-skills[anchoring-a-free-end]
computing-feature-mating-posesComputes approach, engaged, and mate TCP poses from a held feature in the hand and a fixture feature, resolving free mate symmetries from the current robot pose without executing motion.open-robot-skills[computing-feature-mating-poses]
executing-feature-matingExecutes a supplied feature-mating plan for an already-held rigid object - collision-aware planner legs tracked to millimetre precision, Cartesian servo for short corrections and fixture crossings, contact-controlled seating - then releases and retreats along the fixture axis or straight up.open-robot-skills[executing-feature-mating]
executing-held-object-motionExecutes an ordered, collision-aware pose sequence for an already-grasped rigid object without releasing it - the escape from support, clear-space rotation, fixture transit and orientation-locked local legs of a carry plan, or only the free-space approach waypoint of a placement plan.open-robot-skills[executing-held-object-motion]
grasping-direct-ikDirect IK align-then-descend grasping.open-robot-skills[grasping-direct-ik]
grasping-linear-featureFit the full 3D axis of an elongated segmented feature and grasp it with a perpendicular, inclination-aware parallel-jaw pose.open-robot-skills[grasping-linear-feature]
grasping-short-axisDeterministic short-axis-aligned grasp with CuRobo.open-robot-skills[grasping-short-axis]
grasping-with-plannerTop-down grasping via a fast axis-locked linear descend with a collision-aware cuRobo fallback.open-robot-skills[grasping-with-planner]
perceiving-deformable-linear-objectsRead a cable's ordered 3D centreline from one RGB-D frame and keep it current across a task — seed it from an unobstructed survey, re-fit it cold whenever the whole rod is in view, and fall back to tracking the carried prior only when the fresh fit comes back short.open-robot-skills[perceiving-deformable-linear-objects]
perceiving-functional-featuresLocates a language-described functional part of a rigid object or fixture from calibrated RGB-D and fits a typed loop, shaft, tip, aperture, surface, or region feature with a metric centre, axis, and radius, either inside an already-segmented parent or end to end from a described object, protruding shaft, directed tip, or lidded aperture.open-robot-skills[perceiving-functional-features]
perceiving-next-itemLoop-head perception for pack-all / clean-all-items tasks.open-robot-skills[perceiving-next-item]
perceiving-object-partsHierarchical perception for subpart targeting.open-robot-skills[perceiving-object-parts]
perceiving-objectsFast single-path 3D object perception.open-robot-skills[perceiving-objects]
perceiving-objects-oneshotLightweight one-shot 3D object perception.open-robot-skills[perceiving-objects-oneshot]
perceiving-routing-fixturesSurvey a cable-routing bench from one overhead RGB-D frame — find every station (spool, cleat) by colour, roundness and height off the work surface, fit the cable's ordered centreline through a text-prompted segmenter, derive the side each crossing owes from the instruction's alternation, and place the physical seat beside each post.open-robot-skills[perceiving-routing-fixtures]
perceiving-sorting-pairsDiscovers a labelled four-compartment destination from RGB-D and repeatedly perceives one remaining source object with its matching metric destination region, using an identity table the graph supplies for what each label looks like and what its graspable part is called.open-robot-skills[perceiving-sorting-pairs]
placing-held-featureMove a held object so one of its declared features lands on a target point — a ring onto a hook, a tip into a hole, a plug at a bore.open-robot-skills[placing-held-feature]
planning-held-object-motionPlans the carry and engagement phases for an already-held rigid object: a clearance-first lift, the smallest feasible symmetry-equivalent reorientation, an orientation-locked transit above the fixture, or a direct plan to the approach pose; then a typed engagement or a straight linear insertion, optionally re-observing the held tip from the wrist first.open-robot-skills[planning-held-object-motion]
plugging-a-cable-endCarries a cable's held free end into a terminal port after the last crossing — finds the port by vision as the terminal block furthest from the run's anchored end, takes the delivering hand and its working height from the support-hand planner, stages the carry three sides of a rectangle around the seated crossings at a hand's depth above the bench, drops into the mouth, opens the jaws and retreats along the bench.open-robot-skills[plugging-a-cable-end]
proposing-short-axis-graspsPropose top-down grasps whose jaws close ACROSS an elongated object's short axis, derived from its oriented box.open-robot-skills[proposing-short-axis-grasps]
proposing-side-graspsPropose horizontal (side-entry) grasps swept around an object's oriented box — twelve azimuths ranked by jaw margin.open-robot-skills[proposing-side-grasps]
reconstructing-collision-worldsReconstructs a planner collision world from calibrated RGB-D views alone, excluding the grasp target, the robot, and a perceived fixture mask, dropping depth-edge slivers and invalid-depth sheets, and carving the free space an intentional-contact goal needs as an approach tube along a fixture axis or a corridor through a lid aperture.open-robot-skills[reconstructing-collision-worlds]
registering-held-objectsReobserves a grasped rigid object from the wrist cameras, estimates its functional feature in the TCP frame, and fits attached collision spheres, retaining the grasp-time transform at low confidence when the object is not seen.open-robot-skills[registering-held-objects]
seating-a-cable-crossingStreams one planned crossing leg of a cable onto a routing station, lets the rod settle, then LOOKS — segments the rod, fits its centreline and counts how much of the curve lies inside the station's seat box on the side the route requires — and reports the fraction honestly rather than assuming the crossing took.open-robot-skills[seating-a-cable-crossing]
selecting-reachable-graspWalk a ranked list of candidate grasp poses and take the first the arm can actually reach — IK solves it, the solution lands where it was asked, and (where sim.clearance is available) the arm is clear of the scene there.open-robot-skills[selecting-reachable-grasp]
tipping-over-a-surface-edgeTurn a body over on the surface it rests on instead of carrying it — pinch two opposite walls LOOSELY and off centre so the pads act as a pin joint, lift so the surface and gravity stand the body up on its own edge, then press it onto the surface and pull the pins toward you about whichever edge is grounded until it is just past balance, and let go.open-robot-skills[tipping-over-a-surface-edge]
tracking-objectsLong-running skill that drives the SAM3 tracker from the graph-scoped observation stream.tracking-objects.trackopen-robot-skills[tracking-objects]
transporting-objectsMove the currently-held object to a destination and release.open-robot-skills[transporting-objects]
verifying-a-cable-routeJudge a finished cable route from a camera rather than from an evaluator — re-read the cable's centreline from the clear-view camera (tracking the carried prior when the support hand still hides one end), test that rod material lies on the owed side of every station within the seat's reach, and that the hand has left the rod.open-robot-skills[verifying-a-cable-route]
verifying-graspsLifts a just-grasped object a few centimetres, reobserves it from the wrist camera or the overhead camera, and confirms from metric depth that it clears the support surface and rides within reach of the hand, routing not_held otherwise.open-robot-skills[verifying-grasps]
verifying-placementConfirms from one RGB-D view that a released object went through an aperture, accepting either that it vanished into the container or that its visible centre lies below the rim within the opening's footprint, and routing not_placed when it is still visible above or beside the aperture.open-robot-skills[verifying-placement]

Tools — what the robot can compute

Model-backed typed callables — one bundle per model, no task strategy. Tool bundles never own subgraphs; they appear in the flat tool catalog every subgraph agent (and every skill script) calls through ctx.tool(...). Each bundle's SKILL.md documents its setup: dependencies (declared in the bundle's own pyproject.toml), environment variables, weights, and quirks.

BundleDescriptionToolsExtra
curoboNVIDIA cuRobo motion planning — collision-free trajectories to grasp goalsets, transport with an attached object, constrained linear moves, single-pose planning, geometric IK, batch grasp feasibility, and joint-trajectory collision validation.curobo.batch_grasp_feasibility, curobo.cloud_to_attachment, curobo.plan_directed_linear, curobo.plan_grasp_motion, curobo.plan_linear, curobo.plan_to_grasp_poses, curobo.plan_to_pose, curobo.plan_with_grasped_object, curobo.solve_ik, curobo.validate_joint_trajectory_grasped, curobo.validate_joint_trajectory_robot
curveOrdered centrelines of deformable linear objects — skeletonises a cable, rope or hose mask, recovers one traversal order through occlusion breaks and self-crossings (TrackDLO's chain merge), back-projects the ordered pixels through depth onto the object's axis as an arc-length-parameterised polyline, and carries a known centreline onto the next frame with motion imputed for hidden stretches.curve.fit_centerline, curve.track_centerline
gemini-erOpen-vocabulary 2D object detection via the Gemini Robotics-ER API — one call returns pixel-space bounding boxes with labels and scores for a text query.gemini-er.detect
geometryPure-math 3D geometry toolbox — back-project masks and depth to point clouds, DBSCAN-filter noise, fit oriented bounding boxes, derive top-down/front grasp poses, and reconstruct collision worlds from RGB-D frames.geometry.build_world_config, geometry.cloud_to_attachment, geometry.compute_drop_position, geometry.compute_feature_mate, geometry.compute_obb, geometry.compute_xy_distance, geometry.depth_to_point_cloud, geometry.exclude_robot_points, geometry.filter_and_compute_obb, geometry.filter_noise, geometry.fit_linear_feature, geometry.fit_planar_feature, geometry.front_grasp_from_obb, geometry.iou, geometry.mask_to_world_points, geometry.pixel_to_world_point, geometry.pose_distance, geometry.rotate_quat_z90, geometry.select_top_down_grasp, geometry.top_down_grasp_candidates, geometry.top_down_grasp_from_obb, geometry.transform_points
grounding-dinoGrounding DINO zero-shot object detection — natural-language queries to labeled 2D bounding boxes with confidence scores.grounding-dino.detect
molmoVisual pointing and Q&A via the Molmo VLM served from a self-hosted vLLM endpoint (OpenAI-compatible API).molmo.point_prompt, molmo.query, molmo.query_yes_no
sam3Segment Anything 3 — text-, point-, and box-prompted instance segmentation, plus a stateful streaming video tracker that carries object identity through SAM3's memory bank.sam3.segment_box, sam3.segment_point, sam3.segment_text, sam3.tracker_close, sam3.tracker_init, sam3.tracker_update
vlmFree-form and yes/no visual question answering against a hosted vision-language model (OpenRouter API by default; Vertex AI Gemini selectable by config).vlm.query, vlm.query_yes_no

Both tables are generated — regenerate after adding a bundle:

uv run gap skills table --format markdown --kind skill   # and --kind tool

Install

Tool and policy bundles now own their own pyproject.toml; install them per-bundle with uv run gap skills install <bundle> (or --all), not via top-level extras. From the GaP checkout:

cd ../graph-as-policy
uv sync                                       # engine + sim baseline (LIBERO included)
uv run gap skills install --all               # every bundle in this registry
uv run gap skills install sam3 grounding-dino geometry   # …or pick a subset
CUDA_HOME=/usr/local/cuda uv run gap skills install curobo  # CuRobo compiles CUDA at install
uv run gap skills check --download           # verify bundles + prefetch model weights

uv.lock pins the exact environment of the acceptance benchmark run. Two deliberate knobs keep it solvable (documented in pyproject.toml): sam3's over-strict numpy==1.26 metadata pin is relaxed via override-dependencies, and nvidia-curobo builds unisolated against the environment's torch.

Verify a checkout

uv run gap skills check             # per-bundle PASS/WARN/FAIL; non-zero exit on FAIL
uv run gap skills check --download  # + prefetch model weights (HF_TOKEN for gated repos)
uv run gap skills table             # the catalog above (--format markdown|json)
uv run gap check                    # capability report: which bundles can run HERE
uv run gap tools list               # the flat tool catalog with live schemas

gap skills check runs the engine-side format validation (frontmatter shape per bundle kind, referenced resource paths, allowed_tools resolution, declared type names, one extra per bundle) plus an import probe that maps missing dependencies to their install line — the same install-verification step the GaP quickstart runs. Missing weights are a WARN, not a FAIL — nothing installs behind your back.

gap check answers the operational question instead: per bundle, are the deps importable, the declared gap.requires: met (GPU, env vars), the weights cached — and which skills are therefore runnable right now, with a fix hint per failure.

This repo is one skill registry — the canonical example. GaP merges any number of them by precedence (your lab's fork can shadow individual bundles here): gap registry init scaffolds a new one, gap registry add <name> <path> layers it on top, gap registry list shows the active set. See the engine's docs/skills.md.

Contributing a bundle

One bundle = one directory = one PR. Scaffold it:

uv run gap skills new my-skill --kind skill    # or --kind tool

That creates the layout (SKILL.md + scripts/ or tools.py) and a unit-test skeleton (tests/test_my_skill.py); then:

  1. Write the SKILL.md. Spec frontmatter (name == dirname, third-person description ending in a "Use when…" sentence — it is the coordinator's entire view of your bundle), GaP extensions under the gap: key (allowed_tools, exit_conditions, canonical_scripts, …).

  2. Declare operational requirements — a gap.requires: block ({gpu: true, env: [MY_API_KEY], env_any: [...], weights: true}; requires: {} when it needs nothing — mandatory for tool bundles, the test suite enforces it). gap check derives runnability from this. Bundles that download weights may add a filesystem-only weights_cached() -> bool | None next to prefetch() in tools.py.

  3. Declare dependencies once — add one extra named after your bundle in pyproject.toml (empty list if it has none) and run uv lock.

  4. Lazy-load models. Importing your tools.py must not import torch/transformers; load weights on first call (the test suite enforces this).

  5. Test it without hardware using gap.testing (FakeContext, make_test_observation) — flesh out the scaffolded test; uv run gap skills test my-skill (or plain uv run pytest tests -q) must stay green on a workstation without a robot or accelerator; model-touching smokes go behind the gpu marker.

  6. Check yourself before the PR:

    uv run gap skills check && uv run gap skills test my-skill && uv run pytest tests -q
    

The full authoring guide — bundle anatomy, the skill-facing ctx API, exit-condition design, streaming skills — is in gap/docs/skills.md.

Use with Claude Code

.claude-plugin/marketplace.json indexes every bundle, so this checkout doubles as a Claude Code plugin marketplace: the same SKILL.md files that drive GaP's graph generation are loadable as agent skills.

To drive GaP itself from Claude Code — search these registries, check capabilities, run/generate graphs, author new tested bundles — install the engine's agent skill from the GaP repo (it also re-exports this registry's bundles, so one marketplace covers both):

claude plugin marketplace add graph-robots/graph-as-policy
claude plugin install gap@gap

License

Apache-2.0 for this repo's code and docs; model weights and the pinned upstream packages (SAM3, Grounding DINO, cuRobo, …) keep their own licenses — see gap/NOTICE.md for the attribution table.

Respect the original skill developers' licenses. Skills in this library may wrap, port, or build on code published by third-party skill developers. The original developer's license always governs that skill's code: keep the upstream license and attribution in the skill's folder, preserve them when redistributing, and check them before commercial use. Contributions that derive from existing work must declare their provenance and include the original license alongside the skill.

Files in the repo

Repository payload11 top-level entries
  • .claude-plugin
  • policies
  • skills
  • tests
  • tools
  • .gitignore
  • .python-version
  • LICENSE
  • pyproject.toml
  • README.md
  • uv.lock

Discussion (0)

Ask about usage, or say what you built with it

Sign in to join the discussion.

No comments yet. Be the first to say what this is good for.

More skills

obra/
superpowers

An agentic skills framework & software development methodology that works.

285k
1 add

Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.

117k
1 add
Vincentwei1021/
anything2explainer

Topic in, narrated explainer video out. A Claude Code / Codex skill that turns any topic into a black-canvas motion-graphics explainer video with TTS voiceover, subtitles and a chapter progress bar. Chinese or English; every frame drawn in code with Remotion.

666

Open-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)

71k