* Start of MCP server and test suite * Add MCP server for interacting with meshtastic devices and testing framework / TUI * Update mcp-server/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix mcp-server review feedback from thread Agent-Logs-Url: https://github.com/meshtastic/firmware/sessions/91dc128a-ed50-4d07-8bb2-3dc6623a05f7 Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> * Enhance StreamAPI and PhoneAPI for improved log record handling and concurrency control * Semgrep fixes * Trunk and semgrep fixes * optimize pio streaming tee file writes Agent-Logs-Url: https://github.com/meshtastic/firmware/sessions/04e26c6b-6a2b-45be-bbeb-79ae4d0be633 Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> * chore: remove redundant log handle assignment Agent-Logs-Url: https://github.com/meshtastic/firmware/sessions/04e26c6b-6a2b-45be-bbeb-79ae4d0be633 Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> * Consolidate type imports and remove placeholder test files * Add tests for config persistence and more exchange messages * Refactor position test to validate on-demand request/reply behavior * Remove position request/reply test and update README for telemetry behavior * Fix transmit history file to get removed on factory reset --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
3.5 KiB
mode, description
| mode | description |
|---|---|
| agent | Run the mcp-server test suite and interpret results (Copilot equivalent of the Claude Code /test slash command) |
/mcp-test — mcp-server test runner with interpretation
Equivalent of the Claude Code /test slash command in .claude/commands/test.md. Use this when the operator asks you to "run the tests", "check the mcp test suite", "run the mesh tests", etc.
What to do
-
Invoke the wrapper from the firmware repo root:
./mcp-server/run-tests.sh [pytest-args]If the operator specified a subset (e.g. "just the mesh tests"), pass it through as
tests/meshor a pytest-k filter. If they said nothing, use the wrapper's defaults (full suite with pytest-html report).The wrapper auto-detects connected Meshtastic devices, maps each to its PlatformIO env, exports the required env vars, and invokes pytest. Zero pre-flight config needed from the operator.
-
Read the pre-flight header (first few lines of wrapper output). The
detected hub :line lists role → port → env mappings. If it reads(none), the wrapper narrowed totests/unitonly — call that out explicitly so the operator knows hardware tiers were skipped. -
On pass: one-line summary like
N passed, M skipped in <duration>. Don't enumerate test names. DO mention any non-placeholder SKIPs (things like "role not present on hub") because they indicate missing hardware or setup issues. -
On failure: open
mcp-server/tests/report.html(pytest-html output, self-contained) and extract theMeshtastic debugsection for each failed test. That section includes a firmware log stream (last 200 lines) and device state dump. For each failure, summarise:- test name
- one-line assertion message
- the specific firmware log lines that explain why (look for
PKI_UNKNOWN_PUBKEY,Skip send NodeInfo,Error=,Guru Meditation,assertion failed,No suitable channel)
-
Classify each failure as one of:
- Transient flake — LoRa collision, first-attempt NAK with self-heal pattern, timing-sensitive assertion. Suggest
/mcp-repro <test-id>to confirm. - Environmental — device unreachable, port busy, CP2102 driver wedged on macOS. Suggest specific recovery (USB replug,
touch_1200bps,git status userPrefs.jsonc). - Regression — same assertion fails repeatedly on re-runs, firmware log shows novel errors. Identify the firmware module likely responsible.
- Transient flake — LoRa collision, first-attempt NAK with self-heal pattern, timing-sensitive assertion. Suggest
-
Do NOT run destructive recovery automatically. If a failure looks like it needs a reflash, factoryreset, or replug — _describe the steps and let the operator decide. Never burn airtime or flash cycles without approval.
Arguments convention
Operators generally invoke this prompt either with no arguments (full suite) or with a specific subset. Examples:
tests/mesh— one tiertests/mesh/test_direct_with_ack.py::test_direct_with_ack_roundtrip— one test--force-bake— reflash devices first-k telemetry— name-filter
Side-effects to confirm in your summary
userPrefs.jsoncshould be clean after a successful run. The session fixture inmcp-server/tests/conftest.py(_session_userprefs) snapshots and restores. Checkgit status --porcelain userPrefs.jsoncand report if it's non-empty.mcp-server/tests/report.htmlandjunit.xmlregenerate on every run.- The wrapper prints a warning if a
.mcp-session-baksidecar was left over from a crashed prior session and auto-restores from it — mention that if it happened.