ss-new-driver
GitHub用于在 Serial Studio 项目中生成新的 I/O 驱动骨架代码。指导 Agent 遵循参考实现,完成类继承、纯虚函数实现、枚举注册、构建配置及 QML UI 集成等全链路修改,确保新总线/传输协议正确接入系统。
Trigger Scenarios
Install
npx skills add Serial-Studio/Serial-Studio --skill ss-new-driver -g -y
SKILL.md
Frontmatter
{
"name": "ss-new-driver",
"description": "Scaffold a new Serial Studio I\/O driver (a new data source under core\/Devices\/IO\/Drivers\/). Use when adding support for a new bus\/transport — e.g. \"add a <X> driver\", \"support reading from <Y>\", \"new data source\". Encodes the canonical driver pattern and every registration touch-point so the new driver actually shows up in the UI, CLI, and connection manager.",
"argument-hint": "[DriverName]"
}
Serial Studio — new I/O driver
Before writing anything, read core/Devices/IO/Drivers/BluetoothLE.h and BluetoothLE.cpp in
full. They are the canonical reference for the driver contract — match their structure,
signal/slot wiring, and driverProperties() shape rather than inventing a new layout. After
the read, restate the driver contract in chat in 2-3 sentences (pure virtuals, publish path,
timestamp-at-boundary) before scaffolding — a contract you've just named is one the new code
follows, not one it drifts from (doc/claude/j-space.md).
A driver subclasses IO::HAL_Driver (core/Core/IO/HAL_Driver.h) and must implement the pure
virtuals: close, isOpen, isReadable, isWritable, configurationOk, write, open,
driverProperties, and setDriverProperty. Also consider the non-pure virtuals with default
bodies — deviceIdentifier(), selectByIdentifier(), applyConnectionSettings() — which
drive device selection and reconnection. Received bytes are published via
publishReceivedData(...) — stamp the timestamp at the driver boundary (source owns time;
see [ss-hotpath]). Never re-stamp downstream.
Touch-points to wire (verify each against an existing driver)
core/Devices/IO/Drivers/<Name>.h/.cpp— the driver class, SPDX header,.hordering rules.core/Core/SerialStudio.h— add the value to theBusTypeenum (QML usesSerialStudio.BusType.*, never integer literals).core/Devices/IO/ConnectionManager.{h,cpp}— accessor (e.g.network()/uart()analogue) plus signal forwarding; the bus lookups live inConnectionManager/DriverUiRegistry.cpp(forBusType()) and the live-instance switch inConnectionManager/DriverFactory.cpp(DriverFactory::create(), spec 0070). Update both.core/Devices/CMakeLists.txt— addIO/Drivers/<Name>.cppto the source list (sources are listed explicitly, not globbed; commercial drivers go in the guardedif(BUILD_COMMERCIAL)block).- QML configuration UI — the driver panes are bespoke forms (only the Project Editor renders
driverProperties()generically; a row one mode does not use stays in the list and carries avisibleWhenrule, never a conditional append, because the list is also what a project persists): createapp/qml/MainWindow/Panes/SetupPanes/Drivers/<Name>.qml, add itsLoaderto theStackLayoutinSetupPanes/Hardware.qmlat the bus's enum position (the layout indexes byCpp_IO_Manager.busType), and register the new .qml in theQML_SOURCESlist inapp/CMakeLists.txt. core/Core/EnumLabels.cpp— add the bus to thebusTypeSlug()andbusTypeLabel()switches (the API's string names for the bus; commercial buses go inside the#ifdef BUILD_COMMERCIALblock).core/Ui/ProjectEditor/ProjectEditorIcons.h— add the bus to thebusTypeIcon()switch, andcore/Ui/ProjectEditor/EditorForms.cpp— add it to thebusTypescombobox list in the source form model.- Icon — add the driver SVG under
app/rcc/icons/devices/<tier>/(16/24/32) and register it with a<file>entry inapp/rcc/rcc.qrc(busTypeIcon()returns itsqrc:/path). - CLI (optional) — if it should be launchable headless, add options in
app/src/Misc/CLI.{h,cpp}following the existingsetupUartConnection/setupTcpConnectionpattern. tests/utils/api_client.py(optional) — add the bus tobus_mapif integration tests should reach it viaio.setBusType(known drift:mqttis missing from it today).
The list above drifts as the app grows. Before declaring done, grep a recently added bus value
(e.g. grep -rn "BusType::HidDevice" app/src core) and mirror every switch/list it appears in.
Rules
- This is a multi-file change (>3 files): state the plan and get confirmation before executing.
- Follow
doc/claude/code-style.md(header ordering,[[nodiscard]], no in-header member init,Q_EMITnotemit, Christmas-tree ordering). - Run
python scripts/code-verify.py --checkon the new files before handoff. - Do not build or run the app — leave compilation and runtime testing to the developer.
Version History
-
44c9452
Current 2026-09-22 22:28
重构核心模块层级结构,将共享代码下沉至 SerialStudioCore,引入严格分层验证机制,更新技能文档以适配新的目录树和依赖关系。
- 615dff9 2026-08-28 20:00
- cb2f5d2 2026-08-20 08:59


