Agent skill

Add Device

by deepmodeling in deepmodeling/Uni-Lab-OS

Guide for adding new devices to Uni-Lab-OS (接入新设备). An agent skill from deepmodeling/Uni-Lab-OS.

GPL-3.0Auto-check passed

Install Add Device

skills CLI
$ npx skills add deepmodeling/Uni-Lab-OS --skill add-device -a claude-code

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

GitHub CLI
$ gh skill install deepmodeling/Uni-Lab-OS add-device --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/deepmodeling/Uni-Lab-OS.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.cursor/skills/add-device .claude/skills/add-device && 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-device
GitHub stars
178
Token cost
~3.1k tokens
SKILL.md length
408 words
Files
1
Skills in repo
10
Repo updated
First seen
Licence
GPL-3.0

At a glance

Guide for adding new devices to Uni-Lab-OS (接入新设备). An agent skill from deepmodeling/Uni-Lab-OS.

  • The user wants to add/integrate a new device
  • SKILL.md covers 接入工作流, 设备类别(物模型), 通信协议和指令来源 and 对齐已有实现(强制), plus 7 more sections
  • Calls python
  • Create a device driver

What it does

Add Device is an agent skill from deepmodeling/Uni-Lab-OS. Guide for adding new devices to Uni-Lab-OS (接入新设备). Uses @device decorator + AST auto-scanning instead of manual YAML. Walks through device category, communication protocol, driver creation with decorators, and graph file setup. Use when the user wants to add/integrate a new device, create a device driver, write a device class, or mentions 接入设备/添加设备/设备驱动/物模型.

Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

The repository describes itself as: A Platform for Laboratory Automation. The licence is GPL-3.0.

When your agent uses it

  • The user wants to add/integrate a new device
  • Create a device driver
  • Write a device class
  • Mentions 接入设备/添加设备/设备驱动/物模型

Example prompts

  • “/add-device”

Requirements

  • Python 3

What it can do on your machine

Read from SKILL.md and the folder at commit 43923ec. 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 Device loads about 3.1k tokens when it runs. Until then it costs about 93 tokens; SKILL.md has 408 words of instructions outside code blocks.

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

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 deepmodeling/Uni-Lab-OS at commit 43923ec, republished under its GPL-3.0 licence (© deepmodeling). 408 words, ~3,126 tokens.

Download SKILL.mdSave it as .claude/skills/add-device/SKILL.md (or your agent's skills folder).
name
add-device
description
Guide for adding new devices to Uni-Lab-OS (接入新设备). Uses @device decorator + AST auto-scanning instead of manual YAML. Walks through device category, communication protocol, driver creation with decorators, and graph file setup. Use when the user wants to add/integrate a new device, create a device driver, write a device class, or mentions 接入设备/添加设备/设备驱动/物模型.

添加新设备到 Uni-Lab-OS

本 Skill 是自包含的设备接入指南,不依赖外部文档。迁移给别人时,只复制 .cursor/skills/add-device/SKILL.md 即可获得核心规则、模板、验证方式和常见错误清单。

开始实现前,仍应搜索 unilabos/devices/ 获取同类别已有设备的接口、参数名、状态字符串和返回值风格作为参考。


接入工作流

按下面顺序推进,并在工作中维护进度:

text
设备接入进度:
- [ ] 1. 确定设备类别(物模型)和对外单位
- [ ] 2. 确定通信协议
- [ ] 3. 收集指令协议(SDK、厂商文档、寄存器表、HTTP API、用户口述)
- [ ] 4. 对齐同类设备接口(搜索 unilabos/devices/)
- [ ] 5. 创建驱动 unilabos/devices/<category>/<file>.py
- [ ] 6. 验证可导入、注册表扫描、启动测试
- [ ] 7. 如需要,配置实验图文件

设备类别(物模型)

优先使用已有类别。只有确实无法归类时才使用 custom。

类别 ID说明标准属性标准动作
temperature加热、冷却、温控temp, temp_target, statusset_temperature, stop
pump_and_valve泵、阀门、注射器见子类型表见子类型表
motor电机、步进马达position, statusenable, move_position, move_speed, stop
heaterstirrer加热搅拌一体机temp, stir_speed, statusset_temperature, stir, stop
balance天平、称重weight, unit, statustare, read_weight
sensor传感器(液位、温度等)value, level, statusread_value, set_threshold
liquid_handling液体处理机器人status, deck_statetransfer_liquid, aspirate, dispense
robot_arm机械臂arm_pose, arm_statusmoveit_task, pick_and_place
workstation工作站、组合设备workflow_sequence, material_infocreate_order, scheduler_start, scheduler_stop
virtual虚拟、模拟设备按模拟的真实设备定义按模拟的真实设备定义
custom不属于以上类别用户自定义用户自定义

pump_and_valve 子类型:

子类型最小通用属性最小通用动作单位约定
注射泵(syringe pump)status, valve_position, positioninitialize, set_valve_position, set_position, pull_plunger, push_plunger, stop_operation体积=mL, 速度=mL/s
电磁阀(solenoid valve)status, valve_positionopen, close, set_valve_position无
蠕动泵(peristaltic pump)status, speedstart, stop, set_speed流速=mL/min

对外暴露的属性和动作参数必须使用用户友好的物理单位(mL、ul、degC、RPM 等),硬件原始值转换放在驱动内部。

通信协议和指令来源

先确认通信方式,再确认具体指令协议。物模型只定义设备“应该做什么”,不会告诉你硬件“具体发什么字节/请求”。

协议常用 config 参数常用依赖现有抽象
Serial (RS232/RS485)port, baudrate, timeoutpyserial直接使用 serial.Serial
Modbus RTUport, baudrate, slave_idpymodbusdevice_comms/modbus_plc/
Modbus TCPhost, port, slave_idpymodbusdevice_comms/modbus_plc/
TCP Sockethost, port, timeoutstdlib直接使用 socket
HTTP APIurl, token, timeoutrequestsdevice_comms/rpc.py
OPC UAurlopcuadevice_comms/opcua_client/
无通信(虚拟)无无在动作中模拟行为

必须从以下来源之一获得指令细节:

来源处理方式
现成 SDK/驱动代码读取代码,提取指令逻辑,包装进 Uni-Lab-OS 类
协议文档/手册解析命令、响应、校验、寄存器、错误码
用户口述按描述实现指令编解码,标出不确定点
标准协议使用标准实现,例如 Modbus 寄存器表、SCPI
虚拟设备跳过硬件通信,在动作方法中维护模拟状态

对齐已有实现(强制)

实现前必须搜索 unilabos/devices/ 中同类别设备:

  • 参数名必须与已有设备保持一致;动作方法参数名是接口契约,不要随意改成 volume_ml、target_temp_c 这类新名字。
  • status 字符串值要和同类设备一致,优先使用英文稳定值,例如 Idle、Running、Error。
  • 状态属性用 @property + @topic_config() 明确声明。
  • 返回值使用结构化 dict,至少包含 success,需要给前端展示的信息放在 message、data、error 等字段。

架构选择

场景推荐方式
简单设备纯 Python 类 + @device
工作站/组合设备WorkstationBase 或项目内已有工作站模式
液体处理LiquidHandlerAbstract / PyLabRobot 相关模式
Modbus 设备复用 device_comms/modbus_plc/ 或项目内 Modbus 示例
OPC UA 设备复用 device_comms/opcua_client/
外部独立包使用 create-device-package skill

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

装饰器参考

@device — 设备类装饰器
python
from unilabos.registry.decorators import device

# 单设备
@device(
    id="my_device.vendor",           # 注册表唯一标识(必填)
    category=["temperature"],         # 分类标签列表(必填)
    description="设备描述",            # 设备描述
    display_name="显示名称",           # UI 显示名称(默认用 id)
    icon="DeviceIcon.webp",           # 图标文件名
    version="1.0.0",                  # 版本号
    device_type="python",             # "python" 或 "ros2"
    handles=[...],                    # 端口列表(InputHandle / OutputHandle)
    model={...},                      # 3D 模型配置
    hardware_interface=HardwareInterface(...),  # 硬件通信接口
)

# 多设备(同一个类注册多个设备 ID,各自有不同的 handles 等配置)
@device(
    ids=["pump.vendor.model_A", "pump.vendor.model_B"],
    id_meta={
        "pump.vendor.model_A": {"handles": [...], "description": "型号 A"},
        "pump.vendor.model_B": {"handles": [...], "description": "型号 B"},
    },
    category=["pump_and_valve"],
)
@action — 动作方法装饰器
python
from unilabos.registry.decorators import action

@action                              # 无参:注册为 UniLabJsonCommand 动作
@action()                            # 同上
@action(description="执行操作")       # 带描述
@action(
    action_type=HeatChill,           # 指定 ROS Action 消息类型
    goal={"temperature": "temp"},    # Goal 字段映射
    feedback={},                     # Feedback 字段映射
    result={},                       # Result 字段映射
    handles=[...],                   # 动作级别端口
    goal_default={"temp": 25.0},     # Goal 默认值
    placeholder_keys={...},          # 参数占位符
    always_free=True,                # 不受排队限制
    auto_prefix=True,                # 强制使用 auto- 前缀
    parent=True,                     # 从父类 MRO 获取参数签名
)

自动识别规则:

  • 带 @action 的公开方法 → 注册为动作(方法名即动作名)
  • 不带 @action 的公开方法 → 自动注册为 auto-{方法名} 动作
  • _ 开头的方法 → 不扫描
  • @not_action 标记的方法 → 排除
参数文档 → JSON Schema 元数据

在 __init__ 和 action 方法 docstring 的 Args: 小节里,使用以下格式生成入参 schema 的显示信息:

python
"""
Args:
    param[显示名称]: 参数说明,会写入 JSON Schema 的 description。
"""
  • param[显示名称] 的显示名称会写入 goal property 的 title。
  • : 后面的说明会写入 goal property 的 description。
  • 如果只写 param: 参数说明,title 会兜底为字段名,description 使用参数说明。
  • 如果没有写参数文档,生成器也会兜底补齐 title=<字段名> 和 description="",但新设备应优先写清楚显示名和说明。
特殊参数类型:ResourceSlot / DeviceSlot

需要前端选择资源或设备时,用特殊类型注解,registry 会自动生成 placeholder_keys:

python
from typing import List
from unilabos.registry.placeholder_type import DeviceSlot, ResourceSlot

@action(description="转移液体")
def transfer(self, source: ResourceSlot, target: ResourceSlot, volume_ul: float) -> dict:
    """
    Args:
        source[源资源]: 源容器或孔位。
        target[目标资源]: 目标容器或孔位。
        volume_ul[体积(ul)]: 转移体积。
    """
    return {"success": True}

@action(description="同步设备")
def sync_devices(self, devices: List[DeviceSlot]) -> dict:
    return {"success": True, "count": len(devices)}
@topic_config — 状态属性配置
python
from unilabos.registry.decorators import topic_config

@property
@topic_config(
    period=5.0,            # 发布周期(秒),默认 5.0
    print_publish=False,   # 是否打印发布日志
    qos=10,                # QoS 深度,默认 10
    name="custom_name",    # 自定义发布名称(默认用属性名)
)
def temperature(self) -> float:
    return self.data.get("temperature", 0.0)
辅助装饰器
python
from unilabos.registry.decorators import not_action, always_free

@not_action          # 标记为非动作(post_init、辅助方法等)
@always_free         # 标记为不受排队限制(查询类操作)

设备模板

python
import logging
from typing import Any, Dict, Optional

from unilabos.ros.nodes.base_device_node import BaseROS2DeviceNode
from unilabos.registry.decorators import action, device, not_action, topic_config

@device(
    id="my_device",
    category=["my_category"],
    description="设备描述",
    display_name="设备显示名",
)
class MyDevice:
    """设备类说明。"""

    _ros_node: BaseROS2DeviceNode

    def __init__(self, device_id: Optional[str] = None, config: Optional[Dict[str, Any]] = None, **kwargs):
        """
        初始化设备。

        Args:
            device_id[设备ID]: 设备实例 ID,默认使用 my_device。
            config[设备配置]: 设备启动配置。
        """
        self.device_id = device_id or "my_device"
        self.config = config or {}
        self.logger = logging.getLogger(f"MyDevice.{self.device_id}")
        self.data: Dict[str, Any] = {"status": "Idle"}

    @not_action
    def post_init(self, ros_node: BaseROS2DeviceNode) -> None:
        self._ros_node = ros_node

    @action
    async def initialize(self) -> bool:
        self.data["status"] = "Ready"
        return True

    @action
    async def cleanup(self) -> bool:
        self.data["status"] = "Offline"
        return True

    @action(description="执行操作")
    def my_action(self, param: float = 0.0, name: str = "") -> Dict[str, Any]:
        """
        带 @action 装饰器 → 注册为 'my_action' 动作。

        Args:
            param[操作数值]: 操作使用的数值参数。
            name[操作名称]: 操作名称或备注。
        """
        return {"success": True}

    def get_info(self) -> Dict[str, Any]:
        """无 @action → 自动注册为 'auto-get_info' 动作"""
        return {"device_id": self.device_id}

    @property
    @topic_config()
    def status(self) -> str:
        return self.data.get("status", "Idle")

    @property
    @topic_config(period=2.0)
    def temperature(self) -> float:
        return self.data.get("temperature", 0.0)
要点
  • _ros_node: BaseROS2DeviceNode 类型标注放在类体顶部
  • __init__ 签名固定为 (self, device_id=None, config=None, **kwargs)
  • post_init 用 @not_action 标记,参数类型标注为 BaseROS2DeviceNode
  • 运行时状态存储在 self.data 字典中
  • 设备文件放在 unilabos/devices/<category>/ 目录下

通信实现片段

Serial 文本指令:

python
def _send_command(self, cmd: str) -> str:
    self.ser.write(f"{cmd}\r\n".encode())
    return self.ser.readline().decode().strip()

RS-485 响应解析要先定位帧头,不要用硬编码索引直接解析原始响应:

python
def _normalize_response(self, raw: str, start_marker: str = "/") -> str:
    pos = raw.find(start_marker)
    return raw[pos:] if pos >= 0 else raw

自定义二进制帧:

python
def _build_frame(self, func_code: int, data: bytes) -> bytes:
    frame = bytearray([0xFE, func_code]) + bytearray(data)
    checksum = sum(frame[1:]) % 256
    frame.append(checksum)
    return bytes(frame)

Modbus 寄存器映射:

python
REGISTER_MAP = {
    "temp_target": {"addr": 0x000B, "scale": 10},
}

def set_temperature(self, temp: float, **kwargs) -> bool:
    reg = REGISTER_MAP["temp_target"]
    value = int(float(temp) * reg["scale"]) & 0xFFFF
    self.client.write_register(reg["addr"], value, slave=self.slave_id)
    self.data["temp_target"] = temp
    return True

HTTP API 映射:

python
API_MAP = {
    "set_temperature": {
        "method": "POST",
        "endpoint": "/api/temperature",
        "body_key": "target",
    },
}

SDK 封装:

python
from my_device_sdk import DeviceController

class MyDevice:
    def __init__(self, device_id=None, config=None, **kwargs):
        self.config = config or {}
        self.controller = DeviceController(port=self.config.get("port", "COM1"))

验证

无需手写注册表 YAML。@device 装饰器 + AST 扫描会在启动或检查时生成注册表条目。

bash
# 1. 模块可导入
python -c "from unilabos.devices.<category>.<file> import <ClassName>"

# 2. 启动测试
unilab -g <graph>.json

# 3. 仅检查注册表
unilab --check_mode --skip_env_check

仅在旧代码无 @device、需要覆盖特殊字段、或做 --complete_registry 旧设备补全时,才考虑 YAML。新设备默认不要手写 YAML。

图文件节点模板

实验图 JSON 中的 class 对应 @device(id=...),config 会传入 __init__ 的 config 字典:

json
{
  "id": "my_device_1",
  "name": "我的设备",
  "children": [],
  "parent": null,
  "type": "device",
  "class": "my_device",
  "position": {"x": 0, "y": 0, "z": 0},
  "config": {
    "port": "/dev/ttyUSB0",
    "baudrate": 9600
  },
  "data": {}
}

工作站需要同时配置 deck 和 children:

json
{
  "nodes": [
    {
      "id": "my_station",
      "type": "device",
      "class": "my_workstation",
      "children": ["my_deck"],
      "config": {},
      "deck": {
        "data": {
          "_resource_child_name": "my_deck",
          "_resource_type": "unilabos.resources.my_module:MyDeck"
        }
      }
    },
    {
      "id": "my_deck",
      "type": "deck",
      "class": "MyDeckClass",
      "parent": "my_station",
      "config": {"type": "MyDeckClass", "setup": true}
    }
  ]
}

常见错误清单

  • 缺少 @device:设备不会被 AST 扫描发现。
  • 只有 @property 没有 @topic_config():属性不会稳定广播到 status_types。
  • post_init 没有 @not_action:会被误暴露为动作。
  • self.data = {}:空字典会导致属性读取和 schema 初始数据不稳定,必须预填充每个状态键。
  • 动作参数重命名:不要把同类设备已有的 volume 改成 volume_ml,参数名是接口契约。
  • status 使用中文或临时文本:前端和工作流依赖稳定英文状态值。
  • async 方法中使用 time.sleep():应使用 await self._ros_node.sleep(seconds)。
  • 硬编码串口响应索引:RS-485 响应前可能有噪声字节,应先定位帧头。
  • 把硬件寄存器单位暴露给用户:对外使用物理单位,驱动内部做 scale 转换。

© deepmodeling, GPL-3.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 .cursor/skills/add-device of deepmodeling/Uni-Lab-OS.

Open the folder on GitHubat commit 43923ec

Compare with similar skills

Add Device 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 Device compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Add Device this skilldeepmodeling/Uni-Lab-OS178—~3.1kAutomated safety check: PassGPL-3.0
Mesh Labpermissionlesstech/bitchat-android7.7k—~2.9kAutomated safety check: PassGPL-3.0
Labhashgraph-online/awesome-codex-plugins1.2k—~2.7kAutomated safety check: PassApache-2.0
Mdm Device Managementsickn33/agentic-awesome-skills47k1 repos~3kAutomated safety check: NotesMIT
Ginkgo Cloud LabK-Dense-AI/scientific-agent-skills48k1 repos~2.8kAutomated safety check: PassMIT
Foundation Models On Deviceaffaan-m/ECC274k3 repos~1.5kAutomated safety check: PassMIT

Similar skills

  • Mesh Lab

    permissionlesstech/bitchat-android

    Run, diagnose, and extend bitchat Android Mesh Lab physical-device tests.

    7.7k GitHub stars~2.9k tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Lab

    hashgraph-online/awesome-codex-plugins

    Build a Game Lab for one mechanic of a studio's game (the jump, a hit, a dash, a drift, a landing) and iterate on how it FEELS with the creator, side by side.

    1.2k GitHub stars~2.7k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Mdm Device Management

    sickn33/agentic-awesome-skills

    Manage and secure company devices with MDM solutions. An agent skill from sickn33/agentic-awesome-skills.

    47k GitHub starsUsed in 1 repo~3k tokens
    DevOps & CloudAuto-check: notes
  • Ginkgo Cloud Lab

    K-Dense-AI/scientific-agent-skills

    Guides protocol selection, input preparation, pricing checks, and browser ordering on Ginkgo Bioworks Cloud Lab (cloud.ginkgo.bio).

    48k GitHub starsUsed in 1 repo~2.8k tokens
    Game DevelopmentAuto-check passed
  • 苹果FoundationModels框架用于设备上的LLM——文本生成、使用@Generable进行引导生成、工具调用,以及在iOS 26+中的快照流。

    274k GitHub starsUsed in 3 repos~1.5k tokens
    MobileAuto-check passed
  • Official

    Provides guidance and instructions on managing remote devices on Developer Device Platform (DDP).

    21k GitHub stars~2.5k tokensUpdated yesterday
    MobileAuto-check passed

More from deepmodeling/Uni-Lab-OS

All 10 skills in this repo
  • Batch Submit Experiment

    deepmodeling/Uni-Lab-OS

    Batch submit experiments (notebooks) to the Uni-Lab cloud platform (leap-lab) — list workflows, generate nodeparams from registry schemas, submit multiple rounds, check notebook status.

    178 GitHub stars~2.3k tokensUpdated 13 days ago
    Auto-check passed
  • Create Device Skill

    deepmodeling/Uni-Lab-OS

    Create a skill for any Uni-Lab device by extracting action schemas from the device registry.

    178 GitHub stars~4.2k tokensUpdated 13 days ago
    Auto-check passed
  • Filter Workflow By Tags

    deepmodeling/Uni-Lab-OS

    Query backend workflow list, aggregate all tags, and filter workflows by domain/scenario requirements using tags.

    178 GitHub stars~2.9k tokensUpdated 13 days ago
    Auto-check passed
  • Submit Agent Result

    deepmodeling/Uni-Lab-OS

    Submit historical experiment results (agentresult) to Uni-Lab cloud platform (leap-lab) notebook — read data files, assemble JSON payload, PUT to cloud API.

    178 GitHub stars~1.7k tokensUpdated 13 days ago
    Auto-check passed
  • Add Resource

    deepmodeling/Uni-Lab-OS

    Guide for adding new resources (materials, bottles, carriers, decks, warehouses) to Uni-Lab-OS (添加新物料/资源).

    178 GitHub stars~2.9k tokensUpdated 13 days ago
    Auto-check passed
  • Add Workstation

    deepmodeling/Uni-Lab-OS

    Guide for adding new workstations to Uni-Lab-OS (接入新工作站). An agent skill from deepmodeling/Uni-Lab-OS.

    178 GitHub stars~4.4k tokensUpdated 13 days ago
    Auto-check passed

Questions about Add Device

What does Add Device do?

Guide for adding new devices to Uni-Lab-OS (接入新设备). An agent skill from deepmodeling/Uni-Lab-OS. Add Device is an agent skill from deepmodeling/Uni-Lab-OS. Guide for adding new devices to Uni-Lab-OS (接入新设备).

When should I use Add Device?

Add Device fits situations like: the user wants to add/integrate a new device; create a device driver; write a device class; mentions 接入设备/添加设备/设备驱动/物模型.

How do I install Add Device in Claude Code?

Run `npx skills add deepmodeling/Uni-Lab-OS --skill add-device -a claude-code`. Or copy the skill folder (.cursor/skills/add-device in deepmodeling/Uni-Lab-OS) into .claude/skills/add-device in your project. Claude Code loads it when a task matches its description.

How do I install Add Device in Codex?

Run `npx skills add deepmodeling/Uni-Lab-OS --skill add-device -a codex`. Or copy the skill folder (.cursor/skills/add-device in deepmodeling/Uni-Lab-OS) into .agents/skills/add-device in your project. Codex loads it when a task matches its description.

Can I use Add Device 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 deepmodeling/Uni-Lab-OS --skill add-device -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-device, .gemini/skills/add-device, .github/skills/add-device and .opencode/skills/add-device in your project.

What does Add Device need to run?

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

Does Add Device 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 Device 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 Device use?

Add Device is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Add Device use?

About 3.1k 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 Device?

Skills that share tags, products or a category with Add Device: Mesh Lab (permissionlesstech/bitchat-android, 7.7k stars), Lab (hashgraph-online/awesome-codex-plugins, 1.2k stars), Mdm Device Management (sickn33/agentic-awesome-skills, 47k stars) and Ginkgo Cloud Lab (K-Dense-AI/scientific-agent-skills, 48k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Add Device?

deepmodeling (a GitHub organization) maintains it in deepmodeling/Uni-Lab-OS, which has 178 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on September 24, 2026.

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