Skip to content

Releases: MatthiasHertelArm/CMSIS-Developer-Assistant

v2.3.10

v2.3.10 Pre-release
Pre-release

Choose a tag to compare

@MatthiasHertelArm MatthiasHertelArm released this 07 Sep 12:14

Highlights

  • Motion tools wait for the real stop. continue_execution, step_over, step_into, step_out and pause_execution used to settle on VS Code's active-stack-item change — which also fires when the frame is cleared on resume — and could report a stop with an empty location while the target was running. They now arm a DAP stopped waiter before the request goes out and open the result with the stop reason.
  • One pack root, agreed with the CMSIS Solution extension. %LOCALAPPDATA%\Arm\Packs on Windows; next to the CMSIS Solution extension its own getPackRootPath answer, asked once per window, carried on every target resolution and shared with the SVD lookup — so list_target_docs and lookup_peripheral look in the same directory.
  • Containment. fetch_doc refuses loopback, link-local, private and cloud-metadata addresses and re-checks every redirect hop; get_build_diagnostics { file } reads inside the open workspace only.
  • Multi-window robustness. UTF-8-safe control-channel bodies with size caps, atomic registry and agent-configuration writes (~/.claude.json is re-read before every write), bounded shutdown, serial ports released by the window that owns them, a pyOCD flash that ignores SIGTERM is now killed.
  • Documentation tools. maxPdfMb on read_doc_pages and imports, ambiguous short ids reported instead of guessed, user-document ids carry their scope folder (user/keil/stm32u5xx-dfp/rm0456), a shared timeout fence that never leaves an unhandled rejection.
  • The whole set comes from a codebase review (docs/codebase-review-2026-09.md, phases 0–2 of its plan) with 66 new tests: 491 passing, both transport suites, lint and type-check clean.

[2.3.10] - 2026-09-07

Added

  • Tests for the DNS-rebinding guard (isLoopbackHostHeader / isLoopbackOrigin), the hardware timeout wrapper, and the pdf.js worker's positive timeout, restart, idle retirement and dispose-while-pending paths (through an injectable stand-in worker).
  • The Pack Docs panel can clear its store — in two separate steps, each behind a confirmation. Clear extracted text… removes every document's extracted pages, metadata and search index (*.pages.jsonl, *.meta.json, *.idx.json) across the store and prunes the emptied directories; downloaded PDFs and fetch records stay, so fetched documents remain fetched and every document is extracted and indexed again on its next use. Delete downloaded PDFs… removes what fetch_doc downloaded — the arm/ and web/ trees with their PDFs, fetch records and extraction — so those documents are offered as "not fetched" again. The modal confirmation names the document count, file count and size it is about to remove; the in-memory page, index and chapter caches are dropped with the files. PageStore gains storeUsage(), clearExtracted() and clearDownloads(), tested.

Changed

  • The Pack Docs panel is laid out by what each tab shows. The target picker — a cbuild-run context or pack + device — moved into a header shared by every tab, with the resolution and core under it, since it drives them all. The former Target tab, which stacked the SVD browser above the document list, is split into Documents (every document the tools see for the target, its state and the fetch / index / browse / search actions) and Peripherals (the device SVD, the Arm core peripherals and the NPU as groups, instances and bit views); Store is Page store (what is extracted and indexed on disk, across all targets) and Tools stays. Each tab carries a count and a tooltip, opens with a one-line description of what it shows, and the panel no longer refers to "the Target tab" in the other tabs. A saved tab from the old layout opens as Documents.

Changed

  • User-document ids name their scope folder (user/keil/stm32u5xx-dfp/rm0456, user/devices/stm32u5/errata, user/boards/b-u585i-iot02a/schematic), so the same file name attributed to two scopes no longer collides or swaps ids between calls; a document at the root of the user folder keeps user/<name>. read_doc_pages and the docs filter still accept the bare file name when it is unique. Extracted text and indexes are unaffected. Tested.
  • A short document id that matches several documents is reported as ambiguous by read_doc_pages and fetch_docDocument id 'rm' is ambiguous — it matches … — instead of silently reading pages of whichever the listing yielded first. A unique trailing segment (test-rm for stm32f7xx-dfp/test-rm) and a case difference still resolve. Tested.
  • reset tells the truth about the end state. When the last (or only) reset method is unsupported the result no longer says "trying the next method"; when the reset could not be verified the result says the target is halted, that it was running before when the tool halted it, and that halt: false was not applied — an unverified target is never resumed. ResetOutcome gains resumed; the rendering moved to resetAssist.ts. Tested.
  • get_threads reads top frames for the first 32 threads in batches of four instead of one stackTrace request per RTOS task fired at once — a GDB server serialises DAP requests, so a 60-task build made every request wait on the others and hit the deadline together.
  • cmsis_action's post-connect session check fits its advertised window. The two thread probes after load_and_debug / attach were fixed at t+3 s and t+6 s with 5 s each, up to 16 s past an "opportunistic" 8 s wait; they are now scheduled at 35 % and 75 % of that window. probeSchedule is exported and tested.

Fixed

  • fetch_doc no longer reaches local or private addresses. A pdsc <book url> or a fetch_doc { url } pointing at loopback, link-local, RFC 1918, CGNAT, multicast or cloud-metadata addresses (127.0.0.1, localhost, 169.254.169.254, 10.x, 192.168.x, fe80::, …) is refused before any request is made, and redirects are followed one hop at a time with the same check on every target, so a public URL cannot bounce the download onto the MCP or control port. The error names the workspace docs folder as the way to use such a document. A public name that resolves to a private address is not caught (no DNS lookup). PackDocsHost.allowPrivateHosts lets a loopback fixture through in tests. Tested.
  • packDocs.maxPdfMb applies to read_doc_pages and to imported documents too, not only to search and the index command; an oversize document is reported with the setting to raise instead of being extracted anyway. Tested.
  • A window that opened a serial port through serial_open releases it when the window closes, whether or not it was the router. Serial teardown moved from the MCP server (router window only) to the per-window coordinator, bounded to two seconds so a wedged tty cannot hold deactivate. Tested.
  • Closing a window no longer waits on open MCP or control connections. The HTTP servers close idle sockets at once and destroy the rest after two seconds, so an in-flight tool call or an open notification stream cannot hold the extension host in deactivate; a window that failed to bind the router port releases the partially started server. Tested.
  • serial_close after the adapter was unplugged no longer wedges serial_open with "already open". The controller forgets the port even when closing it fails. Tested.
  • read_peripheral_register honours dapRequestTimeoutMs and the call's timeoutMs instead of a fixed 10 s per DAP request, and the GDB evaluate fallbacks used by read_memory forward the same deadline as the DAP attempt. Tested.
  • An MCP session whose initialize failed mid-way no longer leaks its transport and server objects.
  • Agent configuration files (~/.claude.json, …) are re-read immediately before they are written and the update is retried when another process changed the file in between, so a Claude Code write during setup is no longer lost; an unchanged file is not rewritten at all. src/utils/jsonFileRewrite.ts, tested.
  • Removed an upstream coreclr special case in start_debugging that opened the program file and fired the test-explorer debug command without awaiting it.
  • continue_execution, step_over, step_into, step_out and pause_execution no longer report a stop with an empty location while the target is still running. They settled on VS Code's active-stack-item change, which also fires when the frame is cleared on resume, and the continued event of the request just sent usually arrived after the listener was attached. They now wait for the DAP stopped event — the signal wait_for_stop and reset already use — armed before the request goes out so a stop that lands during the round trip is not missed, and the result opens with the stop reason (Target stopped (reason: breakpoint)). The timeout recovery pauses the same way. IDebuggingExecutor gains armStopWaiter. Tested with a scripted executor.
  • A pyOCD flash run that ignored SIGTERM at the deadline was never killed and flash hung. The SIGKILL escalation checked child.killed, which is true as soon as the SIGTERM was sent; it now checks that the process has not exited. flashWithPyocd takes an injectable spawn and grace period. Tested with a child that ignores SIGTERM.
  • Tool results forwarded between VS Code windows could arrive with in place of emoji or CJK text. The router and each window's control server appended body chunks to a string, so a multibyte UTF-8 sequence split across two chunks was decoded in halves; both now collect the raw bytes and decode once. They also refuse bodies above 1 MiB (requests) or 16 MiB (results) instead of buffering without limit, the MCP endpoint's body limit is an explicit 1 MiB, and a client that aborts mid-request no longer leaves the control server's response open. Tested with a request and a reply split inside a four-byte character.
  • **A pdsc containing an out-...
Read more

v2.3.9

v2.3.9 Pre-release
Pre-release

Choose a tag to compare

@MatthiasHertelArm MatthiasHertelArm released this 31 Aug 15:02

Highlights

  • Documentation and build-artefact tools built in (experimental, off by default: packDocs.enabled, buildInfo.enabled) — the CMSIS Pack Docs extension attached to v2.3.8 is no longer needed; uninstall it, activation warns while both are present.
  • PDFs are extracted with a bundled pdf.js; poppler is optional (Open-CMSIS-Pack#28).
  • search_target_docs ranks by page heading and expands identifiers from the SVD (Open-CMSIS-Pack#29): R@1 49.5 % → 64.5 % on RM0455.
  • Skills can be installed into the workspaceSelect Agent Skills asks This workspace only (default, keeps other projects' agent context lean) or This user.
  • Arm logo as the icon; VSIX 13.95 → 3.19 MB; architecture diagram with the documentation path.

[2.3.9] - 2026-08-31

Added

  • Skills can be installed into the workspace instead of the user profile. Select Agent Skills (and step 2 of the setup) first asks where the AI Skills Pack goes: This workspace only (the default — a personal skill is offered to the agent in every project and its description costs context there whether the project is CMSIS or not; a project skill is loaded only where it applies) — the project's .agents/skills (and .claude/skills when Claude Code is installed or the project already has a .claude directory), next to the sources, to commit with the project or ignore; This user — the personal skills directories as before, for every workspace. The choice is the target of the installedSkills setting, whose scope changes from application to resource: the User value drives the personal directories, a Workspace or Folder value the project's — each folder of a multi-root workspace from its own — so a selection that arrives in a checked-out .vscode/settings.json is applied on activation like one from Settings Sync, and removing it sweeps the project copies (marker-guarded, as everywhere). A project selection installs the selected pack skills and their hidden dependencies only; the extension's own skills stay personal, where every agent already finds them, and a project without a selection never gains an empty .agents/skills. Adding a folder to the workspace syncs it, the picker shows what each scope currently selects, and the install prompt counts a pack skill picked in either.
  • Documentation and build-artefact tools, built in — the experimental CMSIS Pack Docs extension moved into the Assistant as-is: src/core/packDocs (target resolution from *.cbuild-run.yml, pdsc <book> walking, Arm document catalogue and download, user and workspace document folders, pdftotext extraction, the page store and BM25 index, peripheral dossiers over the SVD plus 16 shipped Cortex-M core-peripheral SVDs) and src/core/buildInfo (a positioned ELF32 reader, GNU ld / armlink map parser, build-log diagnostics). Ten tools: list_target_docs, search_target_docs, read_doc_pages, fetch_doc, get_peripheral_docs and list_build_artifacts, get_memory_usage, lookup_symbol, get_section_layout, get_build_diagnosticsoff by default behind cmsis-developer-assistant.packDocs.enabled and buildInfo.enabled (fixed per window like serial.enabled; the enabled list is 55 tools / ~41 kB against its own 42 000-byte budget, the default list is unchanged). They route like every other op: each window builds the handler pair, the control server dispatches by op name, the router forwards, and the five documentation ops carry the ten-minute forward floor because indexing a manual takes minutes. Commands List / Index Target Documentation, Import Document for Current Target (attribute a PDF to a pack, device family, board or core, with title, category and edition, indexed at once), Open User Documents Folder and Open Pack Docs Panel (target, documents and index state, SVD peripherals, page store, in-place tool runner). Settings packDocs.extractor / pdftotextPath / maxPdfMb / includeUnlisted / workspaceDocDirs / userDocsDir (default ~/.cmsis-pack-docs/user, kept so imported documents stay attributed) and buildInfo.maxSymbols / logGlobs apply live. The cmsis-pack-docs skill ships as a fourth bundled skill; cmsis-debug-live and add-board-layer point at the tools instead of an external MCP; cmsis-help lists them. Extracted text now lives under this extension's global storage, so pages are re-extracted once. The 22 test suites and fixtures came along; the routing test covers the dispatch, the transport test measures the all-on list and the no-build answers, and the packaged-VSIX check verifies the SVDs and the skill ship. If the standalone extension is still installed, activation warns that agents would see the tool names twice.

Changed

  • search_target_docs indexes the page heading as a weighted field (Open-CMSIS-Pack#29). A register page's body speaks of bits; only its heading names the register and says what it is, so BM25 over the body alone missed it unless the query happened to use the body's words. The heading is now a second field in the index (version 2; existing indexes are rebuilt from the persisted page text on first use, no re-extraction) scored at weight 5 on top of the body, and the old ×3 post-boost becomes a tie-breaker. Measured with the new opt-in benchmark npm run bench:search -- --pages <doc.pages.jsonl> --svd <device.svd> on RM0455 (2 965 pages, 495 register headings) with queries taken from the STM32H7B3 SVD rather than the manual: description-only queries R@1 49.5 % → 64.5 %, R@3 70.9 % → 81.8 %, MRR 0.621 → 0.741; description plus register name R@1 78.1 % → 98.8 %, MRR 0.873 → 0.994. The benchmark reports R@1 / R@3 / MRR per heading weight and post-boost so future ranking changes are measured, not argued.
  • The architecture diagram shows the documentation path and renders on dark themes. The "How It Works" picture gains the documentation retrieval box (pack PDFs, user and workspace documents, fetch_doc downloads → pdf.js → page store → the search tools, with the SVD joined in), is rendered on an opaque background — the previous transparent PNG had black labels, invisible on the dark extension page — and npm run diagram regenerates it from the Mermaid source with a local Chrome. The README explains the window routing and the documentation path in two paragraphs.
  • The extension icon is the Arm logo the other Arm extensions (CMSIS Solution, CMSIS Debugger, Keil Studio Pack, Device Manager, …) carry — the same arm.png — instead of the icon inherited from DebugMCP.
  • The documentation system is marked experimental. Every packDocs.* and buildInfo.* setting carries VS Code's experimental tag (the Settings UI shows the badge and the "Experimental" filter finds them), the two .enabled descriptions say so up front, and the README and cmsis-help label the two tool groups the same way — the tools, their arguments and output may change between releases.
  • The VSIX drops 10 MB of unused media. assets/DebugMCP.webp (9.7 MB, referenced by nothing, shipped in every package since the fork) and assets/DebugMCP.mp4 (15 MB in the repository, never shipped) are removed, assets/architecture.svg (an unused rendering of the diagram the README shows as PNG) too; the extension icon is 256 px instead of 1024 (1.4 MB → a few tens of KB); the design notes under docs/ no longer ship — only docs/agent-resources, which the MCP resources read, does.
  • search_target_docs expands identifiers from the SVD (Open-CMSIS-Pack#29 part 2). An identifier-only query — USART1, GPIOAEN — gains the words of its SVD description at half weight: a peripheral instance brings its type synonyms and description ("universal synchronous asynchronous receiver transmitter"), a bare field name brings the register it lives in (RCC_AHB1ENR) and the field's description, so the manual is found even when it never spells the identifier. The result says what was expanded. Prose, quoted phrases and register names are left alone: the benchmark showed expanding register names or the acronyms inside a sentence only dilutes the ranking (−2 points on description queries, −0.3 on bare register names), while the heading field already puts register pages first (R@1 98.2 % for the bare name). With the restriction all three benchmark sets are unchanged; the gain is on the instance and field queries the benchmark cannot score against the manual's headings.
  • PDFs are extracted with a bundled pdf.js; poppler is optional (Open-CMSIS-Pack#28). packDocs.extractor gains pdfjs and auto now means pdf.js (legacy build, pure JavaScript, +0.8 MB in the bundle, loaded on first use), so a machine without pdftotext — most Windows hosts — indexes documents too; pdftotext stays selectable, and switching re-extracts a document on its next use rather than mixing text sources. Lines are rebuilt from pdf.js text items by baseline, with wide horizontal gaps kept as double spaces so register-table columns stay separable, and the tokenizer applies NFKC so ligatures and full-width forms from either extractor meet on one term. Gated by the search benchmark on RM0455 with the heading field on: pdf.js R@1 65.0 % / MRR 0.739 (description-only) and 99.1 % / 0.995 (with the register name) against pdftotext's 64.5 % / 0.740 and 98.8 % / 0.994 — within noise; 2 965 pages in 3.9 s. npm run bench:search -- --pdf <file> --extractor pdfjs|pdftotext runs the comparison.
  • Agents are told to search the documentation, not to ask for it. The MCP instructions now say, with the documentation tools on, to use them before asking the user for a datasheet or manual and instead of reading a PDF into context — a document the user provides goes into the workspace docs/ folder or through Import Document for Current Target and is searched; with the tools off (the default) they name the packDocs.enabled setting so an agent suggests it rather than asking for documents. The same rule is in the cmsis-pack-docs, cmsis-debug-live and add-board-layer skills, and the `...
Read more

v2.3.8

v2.3.8 Pre-release
Pre-release

Choose a tag to compare

@MatthiasHertelArm MatthiasHertelArm released this 28 Aug 19:40

[2.3.8] - 2026-08-28

Added

  • add-board-layer skill — a third extension-authored skill, always installed like cmsis-debug-live and cmsis-help: add a board layer to an existing csolution by interview. It reads the csolution, the DFP/BSP pdsc and an existing layer first and asks only the decisions they cannot settle (scope, layer strategy, probe, STDIO transport, memory), then reuses the BSP layer, integrates the DFP's configuration generator when the pack ships no Device:Startup and startup exists only as generator output (STM32CubeMX, MCUXpresso Config Tools, Infineon Device Configurator, Microchip MCC — the agent selects the generator components, runs the first cbuild pass and tells the user to run the generator, which it cannot do for them), or writes a minimal bare-metal layer (CMSIS C startup, retarget_stdio.c on the reset clock, regions_<board>.h, minimal device header), wires the target-type into the csolution and builds to green, then hands over to csolution-retarget for the hardware bring-up. Hardware facts — register offsets and bit meanings, the reset clock tree, VCP instance and pins, errata — come from the pack documentation through the CMSIS Pack Docs MCP (list_target_docs, search_target_docs, read_doc_pages) when it is installed, cited by document and page and cross-checked against the SVD; without it the skill says what is unverified. The cmsis-project router's workflow points at it and cmsis-help lists it.

Also attached: cmsis-pack-docs-0.13.1.vsix — the experimental CMSIS Pack Docs extension (page-cited search over the reference manuals, datasheets and board manuals of the current csolution target through its own MCP server), which the new add-board-layer skill uses for every hardware question when it is installed. Built to be merged into the Assistant later.

Pre-release (odd minor). Full changelog: https://github.com/MatthiasHertelArm/CMSIS-Developer-Assistant/blob/v2.3.8/CHANGELOG.md — previous pre-release: https://github.com/MatthiasHertelArm/CMSIS-Developer-Assistant/releases/tag/v2.3.7 (AI efficiency work, cmsis_action target switch, diagnose_fault, eval scenarios).

v2.3.7

v2.3.7 Pre-release
Pre-release

Choose a tag to compare

@MatthiasHertelArm MatthiasHertelArm released this 26 Aug 13:29

AI Efficiency Optimizations

  1. Tool list −20 % — the tools/list every turn carries shrank from 33.2 to 26.7 kB (single-window surface); per-call timeoutMs notes collapsed to one line, rationale moved to the skill; a 30 kB budget and 700-char/description cap are asserted in the transport test.
  2. serial.enabled setting — off drops the ten serial_* tools from the list entirely.
  3. get_debug_instructions by topic — ~2 kB overview + one section on request instead of one 21 kB block.
  4. Compact motion state — step/continue/pause/wait_for_stop return location, frame ids, top 5 frames and the breakpoint list only when it changed; full snapshot only at session start.
  5. Capped listings — variables: 40 per scope, 200 chars per value (uncapped with variableNames); call stack: 20 frames, workspace-relative paths; threads: 32; read_memory defaults to hex.
  6. Lighter recovery — after a motion timeout, PC and LR are read instead of all 23 core registers.
  7. diagnose_fault — one call replaces the ~6-call HardFault loop (fault registers as one 24-byte read, stacked frame, top frames, address resolution, ranked hypotheses with the next call).
  8. lookup_peripheral / lookup_register — SVD answers with no session and no target access; unknown names get suggestions instead of the full name list.
  9. cmsis_action target check/switch — every result names the target it ran on and target switches/verifies it, removing the wrong-target build → confused-investigation round trips.
  10. Measurement built in — per-call telemetry (bytes in/out, ms, outcome), the cmsis-developer-assistant://stats resource, the get_session_status trailer and optional JSONL export; the eval-scenario runner scores an agent's run against tool-call, turn and time budgets.

[2.3.7] - 2026-08-25

Added

  • cmsis_action checks and switches the target — the tool used to act on whatever target-type the CMSIS Solution panel happened to have selected, and its result never said which; on a board + FVP or HE/HP solution a build or flash could go to the wrong context unnoticed. Every result now names the target it ran on (✅ CMSIS 'build' succeeded on HP@debug …), get_device_info reports the panel's CMSIS target:, and the new optional target input (MPS3 or HP@debug, the csolution's own names) selects one: a differing target is switched — the selection is written to .vscode/cmsis.json and the solution re-activated, the mechanism the extension (1.70) itself uses since it exposes no command for it — and verified through cmsis-csolution.getActiveTargetSet before anything runs. An undeclared target is refused with the declared list, an unverifiable switch with what was written and what the extension still reports, and a switch under a live debug session with a pointer to stop_debugging. The build topic and the cmsis-debug-live skill say when to pass target; the transport test drives the refusal, switch and no-op paths against a stubbed extension.
  • Agent evaluation scenariosnpm run eval:scenario -- <id> runs a real Copilot CLI session against a planted bug and reports what it cost: tool calls by name with argument and result bytes, reasoning turns, wall time, the server's per-tool byte totals (from the cmsis-developer-assistant://stats resource, diffed around the run), and a verdict from the final answer against the expected root cause plus tool-call, turn and time budgets; infrastructure failures are reported as such, not as agent failures. Ships the BSP Blinky example for the Corstone-300 FVP as the fixture (test/eval/fixtures/corstone-blinky, with the FVP shim for Docker on macOS) and five deterministic scenarios (divide by zero, undefined instruction through a corrupted function pointer, MSPLIM stack overflow, unaligned access, an LED off-by-one with no fault). Opt-in only — it needs an authenticated Copilot CLI, a VS Code window on the work directory and an FVP or board; the pure logic (scenario validation, event aggregation, verdict, mcp-config edit) is unit-tested. scripts/test-skill-trigger.ts shares the Copilot CLI helpers.
  • diagnose_fault — one call replaces the six-call HardFault loop: the decoded fault registers (read as one 24-byte SCS block), the stacked exception frame located through EXC_RETURN (PSP or MSP, basic or FP-extended) with the PC of the faulting instruction and its caller, the top frames, the faulting address resolved against the SVD or the Cortex-M system map (an unclocked I2C1.CR1, a null pointer plus offset, SRAM), and up to three ranked hypotheses each with the next tool call — unclocked peripheral, null pointer, wild pointer, imprecise write, stack overflow (with MSPLIM/PSPLIM when the core has them), corrupted function pointer, missing Thumb bit, unaligned access, divide by zero, FPU off, bad VTOR. Every section after the fault registers degrades to a note instead of failing the call; with no fault flag set it returns a short stop context. get_fault_info now also names STKOF (Armv8-M stack limit) and DEBUGEVT, and its text is otherwise unchanged. Four long tool descriptions were shortened to keep the tool list within its byte budget.

[2.3.6] - 2026-08-24

Added

  • lookup_peripheral and lookup_register — answer SVD questions without a debug session and without touching the target: the peripheral list, a peripheral's register map (offsets, absolute addresses, access), which peripheral and register sit at an address (turn a BFAR into I2C1.CR1), and one register's bit fields with their enumerated values (which bit is the clock enable). The SVD is resolved from an explicit svdFile, the active session, out/**/*.cbuild-run.yml (pname picks the core) or a single workspace .svd, and the failure text lists what was tried. Unknown names get suggestions instead of the full name list — read_peripheral_register now does the same and points at lookup_peripheral. The parser reads addressBlocks, enumeratedValues and dim register arrays, and no longer borrows a field's access for its register.
  • cmsis-developer-assistant.serial.enabled (default on) — off leaves the ten serial_* tools out of the MCP tool list, which every agent turn carries. Fixed per server instance (window reload), so the tool list a client sees never changes between turns.

Changed

  • Smaller tool results. Step, continue, pause and wait_for_stop now return a compact state: the location and frame ids, the top 5 frames with the rest counted, and the breakpoint list only when it changed since the last snapshot (a count otherwise) — the full snapshot still comes back when a session starts. read_memory defaults to hex (ascii / both on request). get_call_stack prints workspace-relative paths and collapses frames beyond 20 unless levels is given; get_threads lists up to 32 tasks. Variable listings without variableNames are capped at 40 variables per scope and 200 characters per value, with a footer saying how many were left out and how to widen; with variableNames nothing is capped. The recovery section after a motion timeout reads PC and LR instead of all 23 core registers. Tool descriptions state the caps.
  • Smaller tool list. The serialized tools/list every client receives at initialize — and re-sends to the model on every turn — shrank by a fifth (33.2 → 26.7 kB for the single-window surface): the per-call timeoutMs note is one short line per tool with the rationale once in the server instructions, and the start_debugging, cmsis_action, reset, add_breakpoint, add_logpoint, flash and get_debug_instructions descriptions carry the trigger and the one caveat an agent needs at call time; the reasoning moved to the cmsis-debug-live skill and the get_debug_instructions topics (build for the result line and long builds, breakpoints, inspection for reset methods). The transport test now asserts a byte budget for the tool list and a 700-character cap per description.
  • get_debug_instructions takes a topic — the guide for harnesses that do not load skills (GitHub Copilot Chat) no longer arrives as one 21 KB block. Without topic the tool returns a ~2 KB overview (the critical steps, the debugger-first rule) plus the list of topics; session, build, breakpoints, inspection, faults and troubleshooting return one section each. The guide itself was restructured around those topics (marker comments a Markdown reader never sees), gained a faults section (EXC_RETURN, the stacked frame, resolving BFAR, the usual cause per flag) and a build section (cmsis_action result line, long builds, flash, attach), and its inherited root-cause examples about getUserById(), parseFloat() and payment forms were replaced by Cortex-M ones (stale D-cache after DMA, an unclocked peripheral, a watchdog fed from a blocking task, a stale SystemCoreClock). The full guide stays available as the cmsis-developer-assistant://docs/debug_instructions resource; shipped docs are now read once per server instance.

[2.3.5] - 2026-08-24

Added

  • Per-tool call telemetry — every MCP tool call is measured at the server boundary: argument and result bytes, wall time and outcome (ok / timeout / error). get_session_status now ends with a two-line summary for the session, the new cmsis-developer-assistant://stats resource returns the per-tool totals as JSON (session and server instance, plus the last 50 samples) so a test driver can diff it around a run, one INFO line per call goes to the output channel, and the new cmsis-developer-assistant.telemetry.jsonlPath setting (default off) appends one JSON line per call to a file — names and sizes only, never arguments or results. test/realboard/run.ts writes the statistics into its report. Groundwork for measuring the response-size work and for agent evaluation runs.

Also attached: cmsis-pack-docs-0.1.1.vsix —...

Read more

v2.3.3 (pre-release)

v2.3.3 (pre-release) Pre-release
Pre-release

Choose a tag to compare

@MatthiasHertelArm MatthiasHertelArm released this 21 Aug 14:09

[2.3.3] - 2026-08-21

Changed

  • The upstream skills repository is now Open-CMSIS-Pack/cmsis-skills (renamed from cmsis-agent) and the extension adopts the name throughout: the vendored tree is skills/cmsis-skills/, the lock is skills/cmsis-skills.lock.json, the catalog source id is cmsis-skills, and the pin moved to the renamed repository's current main (d778b91, documentation-only changes upstream — the 21 skills are unchanged, same content hash). Nothing changes on disk for users; installed skills are re-marked on the next sync.

[2.3.2] - 2026-08-21

Added

  • cmsis-developer-assistant.aiSkills.enabled (default on) — enable the AI Skills Pack for selected agents: the Open-CMSIS-Pack/cmsis-agent skills and their per-category entry points. Off: the pack skills this extension installed are removed on the next sync (marker-guarded — your own skills are never touched), the skills step of the setup and the install prompt are skipped, the extension's own cmsis-debug-live and cmsis-help stay installed, and the installedSkills selection is kept so turning it back on restores exactly what you had. Toggling it re-syncs immediately, like a change to the selection.
  • cmsis-developer-assistant.aiSkills.promptOnDetect (default on) — when an agent has the MCP server registered (detected in its config file) but no pack skill has been selected, a notification offers to install the CMSIS AI Skills: Select Skills opens the picker, Later asks again in 30 days, Don't ask again turns the setting off. At most once a month, recorded in globalState (skillsPrompt.lastShownAt, cleared by Reset Popup State); never while the first-run setup is still pending, never under Antigravity/Gemini, never with the pack disabled. The decision is a pure function with tests (src/test/skillPrompt.test.ts).
  • /cmsis-help skill — answers "what can I ask the CMSIS Developer Assistant for?": the CMSIS slash commands, the member skills behind each entry point, the VS Code commands, the MCP tool groups and the settings. Generated by npm run skills:sync from the catalog, package.json and scripts/skills.config.json (src/utils/skillHelp.ts) and re-rendered by the tests, so a new command, setting or skill that is not reflected in the shipped file fails npm test. Always installed; the routers end with a pointer to it.

Changed

  • The bundled skills are always installed. cmsis-debug-live and cmsis-help no longer depend on the installedSkills selection, which now holds only picks from the pack (default []; an existing value that names cmsis-debug-live keeps working). The picker no longer lists them. A user who had deselected cmsis-debug-live gets it back.
  • Extension description and keywords widened to the extension's scope: "Enable AI coding agents to manage and extend CMSIS projects, with a set of AI skills and MCP server to interface to build and debug."

[2.3.1] - 2026-08-20

Fixed

  • docs/agent-resources/troubleshooting/csharp.md carried three unresolved merge-conflict hunks (<<<<<<< HEAD … >>>>>>> 251b176) left by the rebase-merge of the 2.1.0 rename — the file ships in the VSIX and is served to agents as the troubleshooting/csharp MCP resource. Resolved; SUPPORT.md is back on LF line endings.
  • The architecture diagram on the extension page now ships inside the VSIX. vsce rewrote the README's relative image link to package.json's repository on GitHub, so the extension page showed whatever assets/architecture.png that branch held — the original DebugMCP drawing, not the diagram this build was made from. scripts/package.ts now generates the packaged readme with the image inlined as a data: URI (the only in-package source VS Code's extension page accepts) and the other relative links rewritten as before; README.md in the repository keeps its relative paths for GitHub.

Pre-release (odd minor). Full changelog: https://github.com/MatthiasHertelArm/CMSIS-Developer-Assistant/blob/v2.3.3/CHANGELOG.md — upstream PR: Open-CMSIS-Pack#10

v2.3.0

Choose a tag to compare

@MatthiasHertelArm MatthiasHertelArm released this 20 Aug 12:23

Added

  • The Open-CMSIS-Pack/cmsis-agent skills ship in the extension, opt-in. The 21 skills of cmsis-agent (project setup, device debug/trace knowledge, CMSIS-Pack debug authoring) are vendored verbatim under skills/cmsis-agent/ at a commit pinned in skills/cmsis-agent.lock.json (npm run skills:sync; upstream has no tags or releases), listed in a generated skills/catalog.json, and installed only when selected — the new setting cmsis-developer-assistant.installedSkills (application scope, default ["cmsis-debug-live"]) holds the picks, the new command Select Agent Skills (also step 2 of the first-run setup) edits them. The selection is applied on activation and whenever the setting changes, so it follows Settings Sync.
  • One slash command per category instead of 21. Generated router skills cmsis-project, cmsis-bring-up and cmsis-pack dispatch to their member skills; picking a router installs the members with user-invocable: false, which keeps them out of the / menu in Claude Code, VS Code and Copilot CLI while the model can still invoke them by description. The $name cross-references in each skill are recorded as dependencies and installed (hidden) alongside whatever is picked, so a skill never arrives without the skills it hands over to.
  • Skills are now written to ~/.claude/skills/ as well, when a Claude home exists — Claude Code reads only its own directory, not ~/.agents/skills/, so earlier releases' skill was invisible to it. $COPILOT_HOME/skills/ is written only when that variable is set (the Copilot CLI then ignores ~/.agents/skills); the unconditional ~/.copilot/skills/ copy is no longer written and the old one is cleaned up.
  • Skill directories are marked and replaced, not merged. Every directory the extension installs carries .cmsis-developer-assistant.json; only marked directories (or the pre-marker cmsis-debug-live) are ever replaced or removed, a user's own skill of the same name is left alone and reported, and a re-sync replaces the directory so files dropped from the bundle do not linger. src/test/skillCatalog.test.ts pins the catalog to the directories on disk and the lock's content hash; src/test/skillInstaller.test.ts covers the marker rules in temp directories.
  • MCP instructions at initialize. The server now tells clients up front that these tools drive a live Cortex-M session and that a runtime investigation should start by invoking the cmsis-debug-live Agent Skill — target awareness, the session-status gate, breakpoint strategy, step-and-inspect, fault decode, root cause — or get_debug_instructions in harnesses that do not load skills. start_debugging says the same in one sentence. (Upstream #129.)
  • Debugger-first rule in the skill and in the get_debug_instructions guide. Do not start a runtime investigation by adding printf over UART/ITM, LED toggles or trace macros — on a Cortex-M that is a rebuild, a reflash and a reset per hypothesis, and it moves the timing you are observing. Halt and inspect instead; reach for add_logpoint only knowing it still stops the core per hit. The skill description gained the trigger vocabulary (runtime bugs, faults, crashes, hangs, failing tests, wrong/null values, unexpected output) so skill-aware harnesses pick it for the right prompts. (Upstream #129.)
  • Contract tests for that guidance (src/test/debugSkillGuidance.test.ts): the trigger words, the debugger-first wording, and that the skill, the MCP instructions and the instructions guide stay consistent. (Upstream #130.)
  • Opt-in live trigger evaluation, npm run test:skill-trigger-agent: runs a real Copilot CLI session in a scratch worktree carrying only the skill, with an embedded prompt, and asserts cmsis-debug-live is its first tool call. Deliberately outside npm test — needs an authenticated Copilot CLI, spends credits, and a model's first move is not deterministic. (Upstream #130.)

Changed

  • Commands consolidated. Configure Agents and Skills (cmsis-developer-assistant.configure) runs the two-step flow — agents, then skills — that the first-run prompt shows; Select Agent Skills runs step 2 alone. Show Agent Selection Popup and Configure Agents are removed; Reset Popup State stays but is hidden from the palette. The first-run flag moved to popupShown.v3 so existing users see the skills step once.
  • scripts/** no longer ships in the VSIX.

Fixed

  • The first-run agent setup picker came back on every activation until something was selected. Dismissing it (Esc, focus loss) now counts as an answer; manual setup stays available via Configure Agents and Skills. (Upstream #115.)

Full changelog: https://github.com/MatthiasHertelArm/CMSIS-Developer-Assistant/blob/v2.3.0/CHANGELOG.md