message-path

GitHub

提供message-path包的DSL语法、解析及数据提取知识,支持ROS/Foxglove消息字段访问与React集成。

.github/skills/message-path/SKILL.md lichtblick-suite/lichtblick

Trigger Scenarios

查询message-path语法规范 解析ROS或Foxglove消息路径 理解数据提取逻辑

Install

npx skills add lichtblick-suite/lichtblick --skill message-path -g -y
More Options

Non-standard path

npx skills add https://github.com/lichtblick-suite/lichtblick/tree/develop/.github/skills/message-path -g -y

Use without installing

npx skills use lichtblick-suite/lichtblick@message-path

指定 Agent (Claude Code)

npx skills add lichtblick-suite/lichtblick --skill message-path -a claude-code -g -y

安装 repo 全部 skill

npx skills add lichtblick-suite/lichtblick --all -g -y

预览 repo 内 skill

npx skills add lichtblick-suite/lichtblick --list

SKILL.md

Frontmatter
{
    "name": "message-path",
    "description": "Deep knowledge about the message-path package: path syntax, parsing grammar, data extraction from nested messages, and React hook integration. Shared across Plot, RawMessages, StateTransitions, and general panel agents."
}

Message Path Skill

Overview

The message-path package (packages/message-path/) provides a DSL for addressing fields within ROS/Foxglove messages. It's the foundation for user-defined data extraction in multiple panels.

⚠️ Code is split across two locations: parsing/grammar lives in packages/message-path/src/ (e.g. parseMessagePath.ts), but the data-extraction helpers (simpleGetMessagePathDataItems.ts, useCachedGetMessagePathDataItems.ts) live in packages/suite-base/src/components/MessagePathSyntax/.

Path Syntax

/topic.field.nested_field
/topic.field[:]{value==42}
/topic.field[0]
/topic.field.@length

Components

  • Topic: /topic_name — selects messages from a topic
  • Field access: .field — navigates into message fields
  • Array index: [0], [1] — selects specific array element
  • Array slice: [:] — iterates over all array elements
  • Filter: {field_name==value} — filters array elements by field value
  • Special: .@length — returns array length instead of elements

Parsing

Located in packages/message-path/src/parseMessagePath.ts:

  • Uses nearley grammar for parsing (context-free grammar)
  • Parses path string → MessagePath AST
  • Results are cached (same string → same parsed object)

MessagePath Type

type MessagePath = {
  topicName: string;
  topicNameRepr: string;
  messagePath: MessagePathPart[];
  modifier?: string;
};

type MessagePathPart =
  | { type: "name"; name: string; repr: string }
  | { type: "slice"; start?: number; end?: number }
  | { type: "filter"; path: string[]; value: unknown; repr: string };

Data Extraction

packages/suite-base/src/components/MessagePathSyntax/simpleGetMessagePathDataItems.ts:

function simpleGetMessagePathDataItems(
  messages: MessageEvent[],
  path: MessagePath,
): MessagePathDataItem[];
  • Recursively traverses message objects following the parsed path
  • Handles nested fields, array slicing, filtering
  • Returns { value, path, constantName? } for each extracted datum

Performance Characteristics

  • Recursive traversal — depth depends on path complexity
  • Array slicing with filter can be O(n) per message
  • Used in hot paths (every render frame for Plot panel)
  • Memoization is critical — see React integration below

React Integration

packages/suite-base/src/components/MessagePathSyntax/useCachedGetMessagePathDataItems.ts:

function useCachedGetMessagePathDataItems(paths: string[]): CachedGetMessagePathDataItems;
  • React hook that caches extraction results
  • Uses global variable filling pattern for performance (avoids closure allocations)
  • Results are memoized per (path + message identity) — same messages + same path = cached result
  • Critical for panels displaying multiple paths (Plot with 10+ series)

Usage by Panels

Panel How it uses message-path
Plot Extracts numeric time series from messages for each configured path
RawMessages Navigates to specific fields for display/filtering
StateTransitions Extracts discrete state values for timeline visualization
General panels Any panel using useMessagesByPath or useMessageDataItem

Common Patterns

Panel settings with message paths

// User configures paths in panel settings
config.paths = ["/odom.pose.position.x", "/odom.twist.linear.x"];

Extracting data in a panel

const pathItems = useCachedGetMessagePathDataItems(config.paths);
// Returns extracted values for each path, memoized

Performance Tips

  1. Parse paths once and reuse the MessagePath object (parsing uses nearley, not free)
  2. Use useCachedGetMessagePathDataItems over manual extraction (handles memoization)
  3. Avoid deeply nested paths with array filters on high-frequency topics
  4. Path changes trigger full re-extraction — minimize path reconfiguration during playback

Version History

  • 6435710 Current 2026-08-16 02:34
  • cab9317 2026-07-24 12:16

Same Skill Collection

.github/skills/3d-rendering/SKILL.md
.github/skills/caching-internals/SKILL.md
.github/skills/deserialization/SKILL.md
.github/skills/e2e-playwright-mcp/SKILL.md
.github/skills/electron-internals/SKILL.md
.github/skills/extensions-internals/SKILL.md
.github/skills/layouts-internals/SKILL.md
.github/skills/mcap-format/SKILL.md
.github/skills/message-pipeline/SKILL.md
.github/skills/panel-extension-api/SKILL.md
.github/skills/panel-image/SKILL.md
.github/skills/panel-log/SKILL.md
.github/skills/panel-map/SKILL.md
.github/skills/panel-raw-messages/SKILL.md
.github/skills/panel-state-transitions/SKILL.md
.github/skills/panel-user-scripts/SKILL.md
.github/skills/performance/SKILL.md
.github/skills/player-internals/SKILL.md
.github/skills/plot-internals/SKILL.md
.github/skills/release-process/SKILL.md
.github/skills/remote-caching/SKILL.md
.github/skills/test-conventions/SKILL.md
.github/skills/theme/SKILL.md
.github/skills/unit-testing/SKILL.md
.github/skills/web-workers/SKILL.md
.github/skills/websocket-connection/SKILL.md

Metadata

Files
0
Version
832636f
Hash
d57fecf8
Indexed
2026-07-24 12:16

inicio - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-09-11 01:10
浙ICP备14020137号-1 $mapa de visitantes$