opentrons-integration by davila7/claude-code-templates
npx skills add https://github.com/davila7/claude-code-templates --skill opentrons-integrationOpentrons 是一个基于 Python 的实验室自动化平台,适用于 Flex 和 OT-2 机器人。编写 Protocol API v2 协议,用于液体处理、控制硬件模块(加热振荡器、热循环仪)、管理实验耗材,以实现自动化移液工作流程。
此技能应在以下情况下使用:
每个 Opentrons 协议都遵循标准结构:
from opentrons import protocol_api
# 元数据
metadata = {
'protocolName': 'My Protocol',
'author': 'Name <email@example.com>',
'description': 'Protocol description',
'apiLevel': '2.19' # 使用最新的可用 API 版本
}
# 要求(可选)
requirements = {
'robotType': 'Flex', # 或 'OT-2'
'apiLevel': '2.19'
}
# 运行函数
def run(protocol: protocol_api.ProtocolContext):
# 协议命令放在这里
pass
关键要素:
opentrons 导入 protocol_api广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
metadata 字典requirements 字典,用于指定机器人类型和 API 版本ProtocolContext 作为参数的 run() 函数run() 函数内部加载仪器(移液器):
def run(protocol: protocol_api.ProtocolContext):
# 在特定支架上加载移液器
left_pipette = protocol.load_instrument(
'p1000_single_flex', # 仪器名称
'left', # 支架:'left' 或 'right'
tip_racks=[tip_rack] # 吸头盒实验耗材对象列表
)
常见移液器名称:
p50_single_flex、p1000_single_flex、p50_multi_flex、p1000_multi_flexp20_single_gen2、p300_single_gen2、p1000_single_gen2、p20_multi_gen2、p300_multi_gen2加载实验耗材:
# 直接在台面上加载实验耗材
plate = protocol.load_labware(
'corning_96_wellplate_360ul_flat', # 实验耗材 API 名称
'D1', # 台面槽位(Flex:A1-D3,OT-2:1-11)
label='Sample Plate' # 可选的显示标签
)
# 加载吸头盒
tip_rack = protocol.load_labware('opentrons_flex_96_tiprack_1000ul', 'C1')
# 在适配器上加载实验耗材
adapter = protocol.load_adapter('opentrons_flex_96_tiprack_adapter', 'B1')
tips = adapter.load_labware('opentrons_flex_96_tiprack_200ul')
加载模块:
# 温度模块
temp_module = protocol.load_module('temperature module gen2', 'D3')
temp_plate = temp_module.load_labware('corning_96_wellplate_360ul_flat')
# 磁力模块
mag_module = protocol.load_module('magnetic module gen2', 'C2')
mag_plate = mag_module.load_labware('nest_96_wellplate_100ul_pcr_full_skirt')
# 加热振荡器模块
hs_module = protocol.load_module('heaterShakerModuleV1', 'D1')
hs_plate = hs_module.load_labware('corning_96_wellplate_360ul_flat')
# 热循环仪模块(自动占用特定槽位)
tc_module = protocol.load_module('thermocyclerModuleV2')
tc_plate = tc_module.load_labware('nest_96_wellplate_100ul_pcr_full_skirt')
基本操作:
# 拾取吸头
pipette.pick_up_tip()
# 吸取(吸入液体)
pipette.aspirate(
volume=100, # 体积,单位 µL
location=source['A1'] # 孔或位置对象
)
# 分配(排出液体)
pipette.dispense(
volume=100,
location=dest['B1']
)
# 丢弃吸头
pipette.drop_tip()
# 将吸头放回吸头盒
pipette.return_tip()
复杂操作:
# 转移(结合 pick_up、aspirate、dispense、drop_tip)
pipette.transfer(
volume=100,
source=source_plate['A1'],
dest=dest_plate['B1'],
new_tip='always' # 'always'、'once' 或 'never'
)
# 分配(一个源到多个目标)
pipette.distribute(
volume=50,
source=reservoir['A1'],
dest=[plate['A1'], plate['A2'], plate['A3']],
new_tip='once'
)
# 合并(多个源到一个目标)
pipette.consolidate(
volume=50,
source=[plate['A1'], plate['A2'], plate['A3']],
dest=reservoir['A1'],
new_tip='once'
)
高级技术:
# 混合(在同一位置吸取和分配)
pipette.mix(
repetitions=3,
volume=50,
location=plate['A1']
)
# 空气间隔(防止滴液)
pipette.aspirate(100, source['A1'])
pipette.air_gap(20) # 20µL 空气间隔
pipette.dispense(120, dest['A1'])
# 吹出(排出剩余液体)
pipette.blow_out(location=dest['A1'].top())
# 触碰吸头(去除吸头外部的液滴)
pipette.touch_tip(location=plate['A1'])
流速控制:
# 设置流速(µL/s)
pipette.flow_rate.aspirate = 150
pipette.flow_rate.dispense = 300
pipette.flow_rate.blow_out = 400
孔访问方法:
# 按名称
well_a1 = plate['A1']
# 按索引
first_well = plate.wells()[0]
# 所有孔
all_wells = plate.wells() # 返回列表
# 按行
rows = plate.rows() # 返回列表的列表
row_a = plate.rows()[0] # A 行的所有孔
# 按列
columns = plate.columns() # 返回列表的列表
column_1 = plate.columns()[0] # 第 1 列的所有孔
# 按名称访问孔(字典)
wells_dict = plate.wells_by_name() # {'A1': Well, 'A2': Well, ...}
位置方法:
# 孔的顶部(默认:顶部下方 1mm)
pipette.aspirate(100, well.top())
pipette.aspirate(100, well.top(z=5)) # 顶部上方 5mm
# 孔的底部(默认:底部上方 1mm)
pipette.aspirate(100, well.bottom())
pipette.aspirate(100, well.bottom(z=2)) # 底部上方 2mm
# 孔的中心
pipette.aspirate(100, well.center())
温度模块:
# 设置温度
temp_module.set_temperature(celsius=4)
# 等待温度达到
temp_module.await_temperature(celsius=4)
# 停用
temp_module.deactivate()
# 检查状态
current_temp = temp_module.temperature # 当前温度
target_temp = temp_module.target # 目标温度
磁力模块:
# 接合(升起磁铁)
mag_module.engage(height_from_base=10) # 距离实验耗材底部的毫米数
# 分离(降低磁铁)
mag_module.disengage()
# 检查状态
is_engaged = mag_module.status # 'engaged' 或 'disengaged'
加热振荡器模块:
# 设置温度
hs_module.set_target_temperature(celsius=37)
# 等待温度达到
hs_module.wait_for_temperature()
# 设置振荡速度
hs_module.set_and_wait_for_shake_speed(rpm=500)
# 关闭实验耗材锁扣
hs_module.close_labware_latch()
# 打开实验耗材锁扣
hs_module.open_labware_latch()
# 停用加热器
hs_module.deactivate_heater()
# 停用振荡器
hs_module.deactivate_shaker()
热循环仪模块:
# 打开盖子
tc_module.open_lid()
# 关闭盖子
tc_module.close_lid()
# 设置盖子温度
tc_module.set_lid_temperature(celsius=105)
# 设置模块温度
tc_module.set_block_temperature(
temperature=95,
hold_time_seconds=30,
hold_time_minutes=0.5,
block_max_volume=50 # 每孔 µL
)
# 执行配置文件(PCR 循环)
profile = [
{'temperature': 95, 'hold_time_seconds': 30},
{'temperature': 57, 'hold_time_seconds': 30},
{'temperature': 72, 'hold_time_seconds': 60}
]
tc_module.execute_profile(
steps=profile,
repetitions=30,
block_max_volume=50
)
# 停用
tc_module.deactivate_lid()
tc_module.deactivate_block()
吸光度板读取器:
# 初始化和读取
result = plate_reader.read(wavelengths=[450, 650])
# 访问读数
absorbance_data = result # 包含波长键的字典
定义液体:
# 定义液体类型
water = protocol.define_liquid(
name='Water',
description='Ultrapure water',
display_color='#0000FF' # 十六进制颜色代码
)
sample = protocol.define_liquid(
name='Sample',
description='Cell lysate sample',
display_color='#FF0000'
)
将液体加载到孔中:
# 将液体加载到特定孔中
reservoir['A1'].load_liquid(liquid=water, volume=50000) # µL
plate['A1'].load_liquid(liquid=sample, volume=100)
# 将孔标记为空
plate['B1'].load_empty()
执行控制:
# 暂停协议
protocol.pause(msg='Replace tip box and resume')
# 延迟
protocol.delay(seconds=60)
protocol.delay(minutes=5)
# 注释(出现在日志中)
protocol.comment('Starting serial dilution')
# 归位机器人
protocol.home()
条件逻辑:
# 检查是否在模拟中
if protocol.is_simulating():
protocol.comment('Running in simulation mode')
else:
protocol.comment('Running on actual robot')
导轨灯(仅限 Flex):
# 打开灯
protocol.set_rail_lights(on=True)
# 关闭灯
protocol.set_rail_lights(on=False)
使用多通道移液器时:
# 加载 8 通道移液器
multi_pipette = protocol.load_instrument(
'p300_multi_gen2',
'left',
tip_racks=[tips]
)
# 使用单个孔引用访问整个列
multi_pipette.transfer(
volume=100,
source=source_plate['A1'], # 访问整个第 1 列
dest=dest_plate['A1'] # 分配到整个第 1 列
)
# 使用 rows() 进行行操作
for row in plate.rows():
multi_pipette.transfer(100, reservoir['A1'], row[0])
连续稀释:
def run(protocol: protocol_api.ProtocolContext):
# 加载实验耗材
tips = protocol.load_labware('opentrons_flex_96_tiprack_200ul', 'D1')
reservoir = protocol.load_labware('nest_12_reservoir_15ml', 'D2')
plate = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D3')
# 加载移液器
p300 = protocol.load_instrument('p300_single_flex', 'left', tip_racks=[tips])
# 将稀释剂添加到除第一个孔外的所有孔中
p300.transfer(100, reservoir['A1'], plate.rows()[0][1:])
# 跨行连续稀释
p300.transfer(
100,
plate.rows()[0][:11], # 源:孔 0-10
plate.rows()[0][1:], # 目标:孔 1-11
mix_after=(3, 50), # 分配后混合 3 次,每次 50µL
new_tip='always'
)
板复制:
def run(protocol: protocol_api.ProtocolContext):
# 加载实验耗材
tips = protocol.load_labware('opentrons_flex_96_tiprack_1000ul', 'C1')
source = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D1')
dest = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D2')
# 加载移液器
p1000 = protocol.load_instrument('p1000_single_flex', 'left', tip_racks=[tips])
# 从源板的所有孔转移到目标板
p1000.transfer(
100,
source.wells(),
dest.wells(),
new_tip='always'
)
PCR 设置:
def run(protocol: protocol_api.ProtocolContext):
# 加载热循环仪
tc_mod = protocol.load_module('thermocyclerModuleV2')
tc_plate = tc_mod.load_labware('nest_96_wellplate_100ul_pcr_full_skirt')
# 加载吸头和试剂
tips = protocol.load_labware('opentrons_flex_96_tiprack_200ul', 'C1')
reagents = protocol.load_labware('opentrons_24_tuberack_nest_1.5ml_snapcap', 'D1')
# 加载移液器
p300 = protocol.load_instrument('p300_single_flex', 'left', tip_racks=[tips])
# 打开热循环仪盖子
tc_mod.open_lid()
# 分配预混液
p300.distribute(
20,
reagents['A1'],
tc_plate.wells(),
new_tip='once'
)
# 添加样品(前 8 个孔的示例)
for i, well in enumerate(tc_plate.wells()[:8]):
p300.transfer(5, reagents.wells()[i+1], well, new_tip='always')
# 运行 PCR
tc_mod.close_lid()
tc_mod.set_lid_temperature(105)
# PCR 配置文件
tc_mod.set_block_temperature(95, hold_time_seconds=180)
profile = [
{'temperature': 95, 'hold_time_seconds': 15},
{'temperature': 60, 'hold_time_seconds': 30},
{'temperature': 72, 'hold_time_seconds': 30}
]
tc_mod.execute_profile(steps=profile, repetitions=35, block_max_volume=25)
tc_mod.set_block_temperature(72, hold_time_minutes=5)
tc_mod.set_block_temperature(4)
tc_mod.deactivate_lid()
tc_mod.open_lid()
protocol.comment() 进行调试和日志记录new_tip='once' 以节省吸头常见问题:
有关详细的 API 文档,请参阅此技能目录中的 references/api_reference.md。
有关示例协议模板,请参阅 scripts/ 目录。
每周安装次数
140
代码仓库
GitHub 星标数
23.6K
首次出现时间
2026 年 1 月 21 日
安全审计
安装于
claude-code126
opencode116
cursor113
gemini-cli111
antigravity109
codex100
Opentrons is a Python-based lab automation platform for Flex and OT-2 robots. Write Protocol API v2 protocols for liquid handling, control hardware modules (heater-shaker, thermocycler), manage labware, for automated pipetting workflows.
This skill should be used when:
Every Opentrons protocol follows a standard structure:
from opentrons import protocol_api
# Metadata
metadata = {
'protocolName': 'My Protocol',
'author': 'Name <email@example.com>',
'description': 'Protocol description',
'apiLevel': '2.19' # Use latest available API version
}
# Requirements (optional)
requirements = {
'robotType': 'Flex', # or 'OT-2'
'apiLevel': '2.19'
}
# Run function
def run(protocol: protocol_api.ProtocolContext):
# Protocol commands go here
pass
Key elements:
protocol_api from opentronsmetadata dict with protocolName, author, description, apiLevelrequirements dict for robot type and API versionrun() function receiving ProtocolContext as parameterrun() functionLoading Instruments (Pipettes):
def run(protocol: protocol_api.ProtocolContext):
# Load pipette on specific mount
left_pipette = protocol.load_instrument(
'p1000_single_flex', # Instrument name
'left', # Mount: 'left' or 'right'
tip_racks=[tip_rack] # List of tip rack labware objects
)
Common pipette names:
p50_single_flex, p1000_single_flex, p50_multi_flex, p1000_multi_flexp20_single_gen2, p300_single_gen2, p1000_single_gen2, p20_multi_gen2, p300_multi_gen2Loading Labware:
# Load labware directly on deck
plate = protocol.load_labware(
'corning_96_wellplate_360ul_flat', # Labware API name
'D1', # Deck slot (Flex: A1-D3, OT-2: 1-11)
label='Sample Plate' # Optional display label
)
# Load tip rack
tip_rack = protocol.load_labware('opentrons_flex_96_tiprack_1000ul', 'C1')
# Load labware on adapter
adapter = protocol.load_adapter('opentrons_flex_96_tiprack_adapter', 'B1')
tips = adapter.load_labware('opentrons_flex_96_tiprack_200ul')
Loading Modules:
# Temperature module
temp_module = protocol.load_module('temperature module gen2', 'D3')
temp_plate = temp_module.load_labware('corning_96_wellplate_360ul_flat')
# Magnetic module
mag_module = protocol.load_module('magnetic module gen2', 'C2')
mag_plate = mag_module.load_labware('nest_96_wellplate_100ul_pcr_full_skirt')
# Heater-Shaker module
hs_module = protocol.load_module('heaterShakerModuleV1', 'D1')
hs_plate = hs_module.load_labware('corning_96_wellplate_360ul_flat')
# Thermocycler module (takes up specific slots automatically)
tc_module = protocol.load_module('thermocyclerModuleV2')
tc_plate = tc_module.load_labware('nest_96_wellplate_100ul_pcr_full_skirt')
Basic Operations:
# Pick up tip
pipette.pick_up_tip()
# Aspirate (draw liquid in)
pipette.aspirate(
volume=100, # Volume in µL
location=source['A1'] # Well or location object
)
# Dispense (expel liquid)
pipette.dispense(
volume=100,
location=dest['B1']
)
# Drop tip
pipette.drop_tip()
# Return tip to rack
pipette.return_tip()
Complex Operations:
# Transfer (combines pick_up, aspirate, dispense, drop_tip)
pipette.transfer(
volume=100,
source=source_plate['A1'],
dest=dest_plate['B1'],
new_tip='always' # 'always', 'once', or 'never'
)
# Distribute (one source to multiple destinations)
pipette.distribute(
volume=50,
source=reservoir['A1'],
dest=[plate['A1'], plate['A2'], plate['A3']],
new_tip='once'
)
# Consolidate (multiple sources to one destination)
pipette.consolidate(
volume=50,
source=[plate['A1'], plate['A2'], plate['A3']],
dest=reservoir['A1'],
new_tip='once'
)
Advanced Techniques:
# Mix (aspirate and dispense in same location)
pipette.mix(
repetitions=3,
volume=50,
location=plate['A1']
)
# Air gap (prevent dripping)
pipette.aspirate(100, source['A1'])
pipette.air_gap(20) # 20µL air gap
pipette.dispense(120, dest['A1'])
# Blow out (expel remaining liquid)
pipette.blow_out(location=dest['A1'].top())
# Touch tip (remove droplets on tip exterior)
pipette.touch_tip(location=plate['A1'])
Flow Rate Control:
# Set flow rates (µL/s)
pipette.flow_rate.aspirate = 150
pipette.flow_rate.dispense = 300
pipette.flow_rate.blow_out = 400
Well Access Methods:
# By name
well_a1 = plate['A1']
# By index
first_well = plate.wells()[0]
# All wells
all_wells = plate.wells() # Returns list
# By rows
rows = plate.rows() # Returns list of lists
row_a = plate.rows()[0] # All wells in row A
# By columns
columns = plate.columns() # Returns list of lists
column_1 = plate.columns()[0] # All wells in column 1
# Wells by name (dictionary)
wells_dict = plate.wells_by_name() # {'A1': Well, 'A2': Well, ...}
Location Methods:
# Top of well (default: 1mm below top)
pipette.aspirate(100, well.top())
pipette.aspirate(100, well.top(z=5)) # 5mm above top
# Bottom of well (default: 1mm above bottom)
pipette.aspirate(100, well.bottom())
pipette.aspirate(100, well.bottom(z=2)) # 2mm above bottom
# Center of well
pipette.aspirate(100, well.center())
Temperature Module:
# Set temperature
temp_module.set_temperature(celsius=4)
# Wait for temperature
temp_module.await_temperature(celsius=4)
# Deactivate
temp_module.deactivate()
# Check status
current_temp = temp_module.temperature # Current temperature
target_temp = temp_module.target # Target temperature
Magnetic Module:
# Engage (raise magnets)
mag_module.engage(height_from_base=10) # mm from labware base
# Disengage (lower magnets)
mag_module.disengage()
# Check status
is_engaged = mag_module.status # 'engaged' or 'disengaged'
Heater-Shaker Module:
# Set temperature
hs_module.set_target_temperature(celsius=37)
# Wait for temperature
hs_module.wait_for_temperature()
# Set shake speed
hs_module.set_and_wait_for_shake_speed(rpm=500)
# Close labware latch
hs_module.close_labware_latch()
# Open labware latch
hs_module.open_labware_latch()
# Deactivate heater
hs_module.deactivate_heater()
# Deactivate shaker
hs_module.deactivate_shaker()
Thermocycler Module:
# Open lid
tc_module.open_lid()
# Close lid
tc_module.close_lid()
# Set lid temperature
tc_module.set_lid_temperature(celsius=105)
# Set block temperature
tc_module.set_block_temperature(
temperature=95,
hold_time_seconds=30,
hold_time_minutes=0.5,
block_max_volume=50 # µL per well
)
# Execute profile (PCR cycling)
profile = [
{'temperature': 95, 'hold_time_seconds': 30},
{'temperature': 57, 'hold_time_seconds': 30},
{'temperature': 72, 'hold_time_seconds': 60}
]
tc_module.execute_profile(
steps=profile,
repetitions=30,
block_max_volume=50
)
# Deactivate
tc_module.deactivate_lid()
tc_module.deactivate_block()
Absorbance Plate Reader:
# Initialize and read
result = plate_reader.read(wavelengths=[450, 650])
# Access readings
absorbance_data = result # Dict with wavelength keys
Define Liquids:
# Define liquid types
water = protocol.define_liquid(
name='Water',
description='Ultrapure water',
display_color='#0000FF' # Hex color code
)
sample = protocol.define_liquid(
name='Sample',
description='Cell lysate sample',
display_color='#FF0000'
)
Load Liquids into Wells:
# Load liquid into specific wells
reservoir['A1'].load_liquid(liquid=water, volume=50000) # µL
plate['A1'].load_liquid(liquid=sample, volume=100)
# Mark wells as empty
plate['B1'].load_empty()
Execution Control:
# Pause protocol
protocol.pause(msg='Replace tip box and resume')
# Delay
protocol.delay(seconds=60)
protocol.delay(minutes=5)
# Comment (appears in logs)
protocol.comment('Starting serial dilution')
# Home robot
protocol.home()
Conditional Logic:
# Check if simulating
if protocol.is_simulating():
protocol.comment('Running in simulation mode')
else:
protocol.comment('Running on actual robot')
Rail Lights (Flex only):
# Turn lights on
protocol.set_rail_lights(on=True)
# Turn lights off
protocol.set_rail_lights(on=False)
When using multi-channel pipettes:
# Load 8-channel pipette
multi_pipette = protocol.load_instrument(
'p300_multi_gen2',
'left',
tip_racks=[tips]
)
# Access entire column with single well reference
multi_pipette.transfer(
volume=100,
source=source_plate['A1'], # Accesses entire column 1
dest=dest_plate['A1'] # Dispenses to entire column 1
)
# Use rows() for row-wise operations
for row in plate.rows():
multi_pipette.transfer(100, reservoir['A1'], row[0])
Serial Dilution:
def run(protocol: protocol_api.ProtocolContext):
# Load labware
tips = protocol.load_labware('opentrons_flex_96_tiprack_200ul', 'D1')
reservoir = protocol.load_labware('nest_12_reservoir_15ml', 'D2')
plate = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D3')
# Load pipette
p300 = protocol.load_instrument('p300_single_flex', 'left', tip_racks=[tips])
# Add diluent to all wells except first
p300.transfer(100, reservoir['A1'], plate.rows()[0][1:])
# Serial dilution across row
p300.transfer(
100,
plate.rows()[0][:11], # Source: wells 0-10
plate.rows()[0][1:], # Dest: wells 1-11
mix_after=(3, 50), # Mix 3x with 50µL after dispense
new_tip='always'
)
Plate Replication:
def run(protocol: protocol_api.ProtocolContext):
# Load labware
tips = protocol.load_labware('opentrons_flex_96_tiprack_1000ul', 'C1')
source = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D1')
dest = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D2')
# Load pipette
p1000 = protocol.load_instrument('p1000_single_flex', 'left', tip_racks=[tips])
# Transfer from all wells in source to dest
p1000.transfer(
100,
source.wells(),
dest.wells(),
new_tip='always'
)
PCR Setup:
def run(protocol: protocol_api.ProtocolContext):
# Load thermocycler
tc_mod = protocol.load_module('thermocyclerModuleV2')
tc_plate = tc_mod.load_labware('nest_96_wellplate_100ul_pcr_full_skirt')
# Load tips and reagents
tips = protocol.load_labware('opentrons_flex_96_tiprack_200ul', 'C1')
reagents = protocol.load_labware('opentrons_24_tuberack_nest_1.5ml_snapcap', 'D1')
# Load pipette
p300 = protocol.load_instrument('p300_single_flex', 'left', tip_racks=[tips])
# Open thermocycler lid
tc_mod.open_lid()
# Distribute master mix
p300.distribute(
20,
reagents['A1'],
tc_plate.wells(),
new_tip='once'
)
# Add samples (example for first 8 wells)
for i, well in enumerate(tc_plate.wells()[:8]):
p300.transfer(5, reagents.wells()[i+1], well, new_tip='always')
# Run PCR
tc_mod.close_lid()
tc_mod.set_lid_temperature(105)
# PCR profile
tc_mod.set_block_temperature(95, hold_time_seconds=180)
profile = [
{'temperature': 95, 'hold_time_seconds': 15},
{'temperature': 60, 'hold_time_seconds': 30},
{'temperature': 72, 'hold_time_seconds': 30}
]
tc_mod.execute_profile(steps=profile, repetitions=35, block_max_volume=25)
tc_mod.set_block_temperature(72, hold_time_minutes=5)
tc_mod.set_block_temperature(4)
tc_mod.deactivate_lid()
tc_mod.open_lid()
protocol.comment() for debugging and loggingnew_tip='once' when appropriate to save tipsCommon Issues:
For detailed API documentation, see references/api_reference.md in this skill directory.
For example protocol templates, see scripts/ directory.
Weekly Installs
140
Repository
GitHub Stars
23.6K
First Seen
Jan 21, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
claude-code126
opencode116
cursor113
gemini-cli111
antigravity109
codex100
Skills CLI 使用指南:AI Agent 技能包管理器安装与管理教程
40,000 周安装