Agent skill

Add Interfaces

by partcad in partcad/partcad

Enrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically.

Apache-2.0Auto-check passedGame Development

Install Add Interfaces

skills CLI
$ npx skills add partcad/partcad --skill add-interfaces -a claude-code

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

GitHub CLI
$ gh skill install partcad/partcad add-interfaces --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/partcad/partcad.git skills-src && mkdir -p .claude/skills && cp -r skills-src/ai-agents/common/skills/add-interfaces .claude/skills/add-interfaces && 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
add-interfaces
GitHub stars
503
Token cost
~3.3k tokens
SKILL.md length
1,656 words
Files
1
Skills in repo
12
Repo updated
First seen
Licence
Apache-2.0

At a glance

Enrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically.

  • Works in 7 steps: Resolve the part and how it connects → Understand the geometry (render and/or… → Design the interfaces and port coordinates → …
  • /pc:add-interfaces
  • SKILL.md covers 1. Resolve the part and how it…, 2. Understand the geometry…, 3. Design the interfaces and… and 4. Attach the interfaces to…, plus 3 more sections
  • Calls python

What it does

Add Interfaces is an agent skill from partcad/partcad. Enrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically. Use for /pc:add-interfaces or when the user asks to add interfaces, ports, connectors, or mating information to a part, or to make parts snap/connect/assemble together.

Its SKILL.md is about 3.3k 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 Game Development. It works with Python. The repository describes itself as: Package manager for things. Start designing modular hardware! PartCAD is the standard for documenting manufacturable physical products (a.k.a. Digital Thread or TDP). It comes… The licence is Apache-2.0.

When your agent uses it

  • /pc:add-interfaces
  • The user asks to add interfaces
  • Mating information to a part
  • Make parts snap/connect/assemble together

Example prompts

  • “/add-interfaces”

Requirements

  • Python 3

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Resolve the part and how it connects
  2. Understand the geometry (render and/or read the source)
  3. Design the interfaces and port coordinates
  4. Attach the interfaces to the part with implements
  5. Validate by mating two instances and rendering
  6. Iterate
  7. Finalize

What it can do on your machine

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

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • python

    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

Add Interfaces loads about 3.3k tokens when it runs. Until then it costs about 80 tokens; SKILL.md has 1,656 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~80
When it runs · the whole SKILL.md, loaded when a task matches
~3.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); files beside SKILL.md are not scanned.

SKILL.md

The full file from partcad/partcad at commit 37fddfa, republished under its Apache-2.0 licence (© partcad). 1,656 words, ~3,282 tokens.

Download SKILL.mdSave it as .claude/skills/add-interfaces/SKILL.md (or your agent's skills folder).
name
add-interfaces
description
Enrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically. Use for /pc:add-interfaces or when the user asks to add interfaces, ports, connectors, or mating information to a part, or to make parts snap/connect/assemble together.

pc:add-interfaces

Add interfaces, ports, and implements: metadata to an existing PartCAD part so PartCAD can mate it to other parts by connection rather than by hand-placed coordinates. The text after the command ($ARGUMENTS) names the target part (and, optionally, how it is meant to connect). You decide the interface types and the exact port coordinates by examining the geometry, and you prove they are right twice: by drawing them on the part itself (pc render --with-all, step 4) and by mating two instances in a throwaway assembly and rendering that (step 5). Hard requirement: the enriched part passes pc test and the validation assembly renders correctly connected.

Interfaces are the reusable half of this: define the connector once, then every part that has that feature implements: it, and any two compatible parts mate. Reference: docs/source/configuration.rst (the "Interfaces" and "Parts" sections) and the feature_interface example (connect-interfaces.assy).

1. Resolve the part and how it connects

$ARGUMENTS is the object name (a part by default). Read its desc:/requirements:/summary: from partcad.yaml. Make sure PartCAD is available as /pc:init describes (pc, then partcad, then python -m partcad_cli.click.command).

Decide what connects to what: which physical feature on this part joins to a feature on another part (a bolt hole to a screw, a plug to a socket, a stud to a receptacle, a rail to a slot). Each such feature becomes a port; a named set of ports is an interface. A male feature and the female feature it enters are two different, complementary interfaces that mates: each other.

2. Understand the geometry (render and/or read the source)

You need each connection feature's position and orientation in the part's own coordinate frame, in millimeters. Get them two ways and cross-check:

  • Render it to see orientation and where the origin sits:

    sh
    mkdir -p /tmp/pc-render
    pc render -t png -O /tmp/pc-render <part>        # one isometric PNG

    To see other angles, place the part at rotated locations in a throwaway .assy and render that. Run /pc:describe on the part for a written read of the shape.

    Once the part already has some ports, add --with-ports to see them drawn on that same picture — see "Look at the ports" below. That is also how you check a port you have just written before doing anything else with it.

  • Read the exact coordinates from the source when you can — the CAD script, the STEP/BREP, or (for a generated/meshed part) the upstream data file. Exact numbers beat measuring off a render.

Confirm the origin and axes by reasoning about the render: where is (0,0,0), and which way is "up" for this part (it is not always +Z — a mesh-imported part can land with +Y up). Every port coordinate below is in this frame.

3. Design the interfaces and port coordinates

A port is an OCCT Location, [[x,y,z],[ax,ay,az],angle_deg]: translate to [x,y,z], then rotate angle_deg about axis [ax,ay,az]. Optionally give it a sketch: (a 2D boundary) so it is visible when rendered.

Follow the port-matching convention so mates are unambiguous:

  • Use the port's Z axis as the main direction. A male port's Z points outward (out of the material); the female port it enters has Z pointing inward. When two ports mate, their origins coincide and their Z axes are opposite — PartCAD flips the incoming part 180 deg about [1,1,0], which sends +Z -> -Z.
  • Orient each port's X axis toward the "next" equivalent port (right-hand rule). If several ports are interchangeable (e.g. the 4 corners of a bolt pattern, or a grid of studs), a consistent circular X orientation makes any aligned pair align all of them.

Useful consequence to place features precisely: if you orient the two ports so the 180 deg flip cancels the rotation, the mated part ends up translated by target_port_position - source_port_position with no rotation. So the mating offset is carried entirely by the two port positions — put the female (receiving) port on the part's own mating plane and the stacking/insertion depth falls out automatically, per part. Verify any non-obvious orientation cheaply, without rendering, using the pure-Python partcad.geom.Location (__mul__, .inverse(), .as_packed()) against the assembly's mate formula target_loc * target_port * turn(180@[1,1,0]) * source_port.inverse().

Declare it in partcad.yaml:

yaml
sketches:
  <port-boundary>:            # optional, for visualization
    type: basic
    circle: <radius>
interfaces:
  <male-iface>:
    desc: <what it is; note Z points outward>
    ports:
      <port>:
        sketch: <port-boundary>
    mates:
      <female-iface>:
        # freedom of movement, if any; omit or use 0 for a rigid seat
        moveZ: { min: 0, max: 0, default: 0 }
  <female-iface>:
    desc: <the complementary receptacle; Z points inward>
    ports:
      <port>:
        sketch: <port-boundary>

Interfaces can inherits: others (share ports/parameters) and declare parameters: (moveX/Y/Z, turnX/Y/Z, or a custom dir:) for parametrized mating such as a slotted hole. Reuse an existing interface if one already fits rather than inventing a new one.

4. Attach the interfaces to the part with implements:

A part implements an interface, placing that interface's ports onto the part. Place each occurrence with its own Location; use several named instances to place the same interface at several spots:

yaml
parts:
  <part>:
    # ...existing config...
    implements:
      <male-iface>:
        <instanceA>: [[x, y, z], [ax, ay, az], angle]
        <instanceB>: [[x, y, z], [ax, ay, az], angle]
      <female-iface>:
        <instanceA>: [[x, y, z], [ax, ay, az], angle]

If the part is served by an external / plugin-backed package (a dynamic catalog with no static partcad.yaml entry to edit), do not try to edit the source. Enrich it in a consuming package instead: add a type: enrich part there that points at the upstream part with source: and carries the added implements:. Enrich copies your implements: onto the resolved part:

yaml
parts:
  <local-name>:
    type: enrich
    source: //path/to/upstream/pkg:<upstream-part>
    implements:
      <fully-qualified-iface-name>:      # e.g. //my/consuming/pkg:<male-iface>
        <instance>: [[x, y, z], [ax, ay, az], angle]

Use fully-qualified interface names in an enriched part's implements: (the enriched part is instantiated in the upstream package's namespace, so a bare name would resolve there, not in your package). For the consuming package to resolve //path/to/upstream/pkg:<part>, that upstream package must be reachable from the invocation root — the simplest arrangement is to make the consuming package a sub-package of the upstream one and run pc from the upstream root. If enrich cannot carry the metadata for a given part, fall back to a local wrapper (type: alias, or a thin re-declared part) that adds the implements:.

Show full SKILL.md (752 more words)Show less
Look at the ports

implements: is what actually puts the ports on the part, so this is the first moment there is anything to look at — and the cheapest check there is, before any assembly exists. A port is a coordinate frame and an interface is a named set of them, so neither shows up in an ordinary render; pc render draws them when asked:

sh
pc render -t png -O /tmp/pc-render --with-ports <part>        # every port marked and named
pc render -t png -O /tmp/pc-render --with-interfaces <part>   # every interface, joined to its ports
pc render -t png -O /tmp/pc-render --with-all <part>          # both

View the PNG and read it against what you wrote:

  • Each port is a coordinate frame. The long arrow is +Z — the direction a part travels along when it is connected through that port. A male port's +Z points out of the material, a female port's points into it. An arrow pointing the wrong way is the single most common mistake, and it is obvious here.
  • The frame sits at the port's origin. If it is off the feature it is supposed to name — beside the hole rather than in it, on the wrong face, at the part origin because the location: was omitted — the coordinates are wrong.
  • The short arrows are X and Y: use them to check the roll convention (X toward the "next" equivalent port).
  • --with-interfaces names each instance once and draws a line out to every port in it, so a bolt pattern that should be one interface with four ports reads as exactly that. Four separate names means four instances — usually not what was intended. The small outlines are the port boundary sketches.

Every port drawn is also listed in the log with the exact name to write in an ASSY file — look for the N port(s) drawn on the projection: line and the indented list under it. That is where the with:/to:/withInstance:/ toInstance: values below come from; do not guess them.

5. Validate by mating two instances and rendering

This is the real proof the coordinates are right. Scaffold a throwaway assembly that connects two parts purely through the interfaces:

sh
pc add assembly assy check.assy
yaml
# check.assy
links:
  - part: <part-or //pkg:part>
    name: a
  - part: <the mating part>
    name: b
    connect:
      with: <b's interface>          # omit if unambiguous
      withInstance: <b's instance>   # if the interface has several
      name: a
      to: <a's interface>
      toInstance: <a's instance>

connect: mates by interface; location/connectPorts/connect are mutually exclusive per node. Mark the assembly manufacturable: false so pc test passes, then:

sh
pc test -a <name>                                     # geometry instantiates + mates resolve
pc render -a -t png -O /tmp/pc-render <name>          # writes /tmp/pc-render/<name>.png
pc render -a -t png -O /tmp/pc-render --with-ports <name>   # the same, with every port drawn

View the PNG and check the two parts are actually connected the way the real feature connects: mating faces touching, correct offset/grid, no unintended interpenetration and no gap. A wrong port position shows up as a gap or overlap; a wrong orientation shows up as the incoming part rotated or facing the wrong way.

Then view the --with-ports PNG, which is what says why. On an assembly the option walks every part and draws each one's ports where the assembly put them, so the two ports that were supposed to mate are two frames on the same picture:

  • Connected correctly: the two frames sit on top of each other with their +Z arrows pointing in opposite directions.
  • Two frames a fixed distance apart: the port position is off by exactly that much, on the part whose frame is not where the feature is.
  • Two frames at the same place but with +Z arrows agreeing rather than opposing, or rolled against each other: the orientation is wrong, not the position.
  • A frame nowhere near the feature it names: the implements: location is wrong, not the interface.

Names on the picture are the instance path (<part-instance>:<port>), and the same list is written to the log, so you can tell which of two identical-looking frames belongs to which part.

6. Iterate

Adjust the port coordinates/orientations and repeat step 5 until the render is correct — no fixed retry count. Read the --with-ports render each time rather than guessing from the plain one: it distinguishes a wrong position from a wrong orientation, which the plain render does not. Re-check with a second instance placed at a different port (an offset, not just the aligned case) to confirm the whole interface is consistent, not just one lucky pair.

7. Finalize

Summarize the interfaces you defined (with the male/female Z convention), which ports/instances you placed and where, where you stored them (the part's package, or the consuming package for a plugin-backed part), and how to view a connected example (pc inspect -a <name>, or pc render -a -t png --with-all <name> for a picture with the connection metadata on it).

If the part's ports are worth keeping a picture of — a catalog part other packages will mate against — declare the drawing as a file type so pc render keeps it up to date instead of leaving it to be redrawn by hand:

yaml
parts:
  <part>:
    render:
      svg-with-ports:
        package: //builtin/render
        path: render_svg.py
        extension: ports.svg
        with_ports: true

See examples/feature_interface, which does exactly this for a part and for the assembly it belongs to.

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

Just SKILL.md in ai-agents/common/skills/add-interfaces of partcad/partcad.

Open the folder on GitHubat commit 37fddfa

Compare with similar skills

Add Interfaces 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.

Add Interfaces compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Add Interfaces this skillpartcad/partcad503—~3.3kAutomated safety check: PassApache-2.0
Image to Three.js Modelimg2threejs/img2threejs18k1 repos~8.2kAutomated safety check: PassApache-2.0
2D Map and Scene Generator0x0funky/agent-sprite-forge4.3k—~2.9kAutomated safety check: PassMIT
Bambu Studio AIheyixuan2/bambu-studio-ai219—~4.3kAutomated safety check: PassMIT
Spine AnimationGenielabsOpenSource/spine-animation-ai515—~17kAutomated safety check: PassCC-BY-NC-4.0
Unreal BridgeTornLux/UnrealBridge305—~8.4kAutomated safety check: NotesMIT

Similar skills

  • Image to Three.js Model

    img2threejs/img2threejs

    Rebuilds the object in a reference image as a procedural, animation-ready Three.js model written entirely in code, using staged sculpting with quality checks.

    18k GitHub starsUsed in 1 repo~8.2k tokens
    Game DevelopmentAuto-check passed
  • 2D Map and Scene Generator

    0x0funky/agent-sprite-forge

    Plans and builds 2D game maps and scenes, from tilemaps and parallax backgrounds to HD-2D plates, with collision checks, a playable HTML preview and Tiled, Godot or LDtk export.

    4.3k GitHub stars~2.9k tokensUpdated yesterday
    Game DevelopmentAuto-check passed
  • Bambu Studio AI

    heyixuan2/bambu-studio-ai

    End-to-end 3D printing for Bambu Lab printers. An agent skill from heyixuan2/bambu-studio-ai.

    219 GitHub stars~4.3k tokensUpdated 18 days ago
    Game DevelopmentAuto-check passed
  • Spine Animation

    GenielabsOpenSource/spine-animation-ai

    Create Spine 2D skeletal animations from pre-existing character assets (separated body-part PNGs, atlas spritesheet, or a full character image).

    515 GitHub stars~17k tokensUpdated 1 mo ago
    Game DevelopmentAuto-check passed
  • Unreal Bridge

    TornLux/UnrealBridge

    Execute Python scripts inside a running Unreal Engine 5.3+ editor via TCP bridge.

    305 GitHub stars~8.4k tokensUpdated 7 days ago
    Game DevelopmentAuto-check: notes
  • 2D Sprite Generator

    0x0funky/agent-sprite-forge

    Produces game-ready 2D characters, creatures, props, icons and effects as master stills, sheets or clips, and exports frames for common game engines.

    4.3k GitHub stars~3.6k tokensUpdated yesterday
    Game DevelopmentAuto-check passed

More from partcad/partcad

All 12 skills in this repo
  • Convert

    partcad/partcad

    Convert a CAD file or a PartCAD object to another geometry format - STEP, BREP, STL, 3MF, OBJ, IGES, glTF, three.js, SVG, DXF, URDF, ASSY - with pc convert for an object a package declares (which…

    503 GitHub stars~1.5k tokensUpdated today
    Auto-check passed
  • Describe

    partcad/partcad

    Write a narratable, accessibility-oriented text description of an existing PartCAD part, assembly, or sketch from its measured bounding box and volume, from renders taken at several viewing angles…

    503 GitHub stars~2.1k tokensUpdated today
    Auto-check passed
  • Export

    partcad/partcad

    Write a CAD file out of an object a PartCAD package declares - STEP, BREP, STL, 3MF, OBJ, IGES, glTF, three.js, URDF for 3D, SVG or DXF for a sketch, or a file type the package implements itself -…

    503 GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • Gen Part

    partcad/partcad

    Generate a PartCAD part from a natural-language description (and optional reference images/requirements) by authoring a CAD script and validating it with the PartCAD CLI.

    503 GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • Gen Sketch

    partcad/partcad

    Generate a PartCAD 2D sketch from a natural-language description by authoring the sketch (build123d / cadquery / dxf / svg / basic) and validating it with the PartCAD CLI.

    503 GitHub stars~672 tokensUpdated today
    Auto-check passed
  • Init

    partcad/partcad

    Initialize a PartCAD package in the current directory by running the installed PartCAD CLI (pc init / partcad init).

    503 GitHub stars~492 tokensUpdated today
    Auto-check passed

Works with

Questions about Add Interfaces

What does Add Interfaces do?

Enrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically. Add Interfaces is an agent skill from partcad/partcad. Enrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically.

When should I use Add Interfaces?

Add Interfaces fits situations like: /pc:add-interfaces; the user asks to add interfaces; mating information to a part; make parts snap/connect/assemble together.

How do I install Add Interfaces in Claude Code?

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

How do I install Add Interfaces in Codex?

Run `npx skills add partcad/partcad --skill add-interfaces -a codex`. Or copy the skill folder (ai-agents/common/skills/add-interfaces in partcad/partcad) into .agents/skills/add-interfaces in your project. Codex loads it when a task matches its description.

Can I use Add Interfaces 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 partcad/partcad --skill add-interfaces -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-interfaces, .gemini/skills/add-interfaces, .github/skills/add-interfaces and .opencode/skills/add-interfaces in your project.

What does Add Interfaces need to run?

Going by SKILL.md and its folder, Add Interfaces needs the command-line tools its instructions call (python). Our summary lists: Python 3.

Does Add Interfaces 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 Add Interfaces 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. Review the folder before installing.

What licence does Add Interfaces use?

Add Interfaces 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 Add Interfaces use?

About 3.3k tokens (SKILL.md is roughly 13k 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 Add Interfaces?

Skills that share tags, products or a category with Add Interfaces: Image to Three.js Model (img2threejs/img2threejs, 18k stars), 2D Map and Scene Generator (0x0funky/agent-sprite-forge, 4.3k stars), Bambu Studio AI (heyixuan2/bambu-studio-ai, 219 stars) and Spine Animation (GenielabsOpenSource/spine-animation-ai, 515 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Add Interfaces?

partcad (a GitHub organization) maintains it in partcad/partcad, which has 503 GitHub stars. The repository holds 12 skills in this directory. The repository was last updated on October 8, 2026.

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