What problem does it solve? Writing a custom behavior-tree leaf node requires choosing the correct base class, declaring ports, registering the node with the factory, and wiring it into XML — mistakes in any step cause runtime failures that are hard to diagnose. ## Core Features & Use Cases - Base-class selection guide: Maps your node's behavior (sync, async, condition, ROS action/service/topic) to the right BehaviorTree.CPP or BehaviorTree.ROS2 base class. - Complete code templates: Provides working C++ skeletons for SyncActionNode, StatefulActionNode, RosActionNode, and the other wrappers, including port declarations and callback overrides. - Registration and XML v4 wiring: Shows factory registration, plugin export via BT_REGISTER_NODES / CreateRosNodePlugin, and BTCPP_format="4" tree definitions. - Use Case: You need a node that calls a ROS 2 action from a behavior tree — follow the RosActionNode template, override setGoal and onResultReceived, register it with RosNodeParams, and reference it in your XML. ## Quick Start Ask the AI to write a behavior tree node that calls a ROS 2 action named sleep_action with a msec input port, including registration and XML usage.