Releases: MatthiasHertelArm/CMSIS-Developer-Assistant
Release list
v2.3.10
Highlights
- Motion tools wait for the real stop.
continue_execution,step_over,step_into,step_outandpause_executionused 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 DAPstoppedwaiter before the request goes out and open the result with the stop reason. - One pack root, agreed with the CMSIS Solution extension.
%LOCALAPPDATA%\Arm\Packson Windows; next to the CMSIS Solution extension its owngetPackRootPathanswer, asked once per window, carried on every target resolution and shared with the SVD lookup — solist_target_docsandlookup_peripherallook in the same directory. - Containment.
fetch_docrefuses 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.jsonis 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.
maxPdfMbonread_doc_pagesand 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 whatfetch_docdownloaded — thearm/andweb/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.PageStoregainsstoreUsage(),clearExtracted()andclearDownloads(), 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 keepsuser/<name>.read_doc_pagesand thedocsfilter 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_pagesandfetch_doc—Document id 'rm' is ambiguous — it matches …— instead of silently reading pages of whichever the listing yielded first. A unique trailing segment (test-rmforstm32f7xx-dfp/test-rm) and a case difference still resolve. Tested. resettells 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 thathalt: falsewas not applied — an unverified target is never resumed.ResetOutcomegainsresumed; the rendering moved toresetAssist.ts. Tested.get_threadsreads top frames for the first 32 threads in batches of four instead of onestackTracerequest 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 afterload_and_debug/attachwere 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.probeScheduleis exported and tested.
Fixed
fetch_docno longer reaches local or private addresses. A pdsc<book url>or afetch_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.allowPrivateHostslets a loopback fixture through in tests. Tested.packDocs.maxPdfMbapplies toread_doc_pagesand 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_openreleases 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 holddeactivate. 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_closeafter the adapter was unplugged no longer wedgesserial_openwith "already open". The controller forgets the port even when closing it fails. Tested.read_peripheral_registerhonoursdapRequestTimeoutMsand the call'stimeoutMsinstead of a fixed 10 s per DAP request, and the GDB evaluate fallbacks used byread_memoryforward the same deadline as the DAP attempt. Tested.- An MCP session whose
initializefailed 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
coreclrspecial case instart_debuggingthat opened the program file and fired the test-explorer debug command without awaiting it. continue_execution,step_over,step_into,step_outandpause_executionno 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 thecontinuedevent of the request just sent usually arrived after the listener was attached. They now wait for the DAPstoppedevent — the signalwait_for_stopandresetalready 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.IDebuggingExecutorgainsarmStopWaiter. Tested with a scripted executor.- A pyOCD flash run that ignored SIGTERM at the deadline was never killed and
flashhung. The SIGKILL escalation checkedchild.killed, which is true as soon as the SIGTERM was sent; it now checks that the process has not exited.flashWithPyocdtakes an injectablespawnand 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-...
v2.3.9
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_docsranks 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 workspace — Select 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/skillswhen Claude Code is installed or the project already has a.claudedirectory), 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 theinstalledSkillssetting, whose scope changes fromapplicationtoresource: 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.jsonis 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,pdftotextextraction, the page store and BM25 index, peripheral dossiers over the SVD plus 16 shipped Cortex-M core-peripheral SVDs) andsrc/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_docsandlist_build_artifacts,get_memory_usage,lookup_symbol,get_section_layout,get_build_diagnostics— off by default behindcmsis-developer-assistant.packDocs.enabledandbuildInfo.enabled(fixed per window likeserial.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). SettingspackDocs.extractor/pdftotextPath/maxPdfMb/includeUnlisted/workspaceDocDirs/userDocsDir(default~/.cmsis-pack-docs/user, kept so imported documents stay attributed) andbuildInfo.maxSymbols/logGlobsapply live. Thecmsis-pack-docsskill ships as a fourth bundled skill;cmsis-debug-liveandadd-board-layerpoint at the tools instead of an external MCP;cmsis-helplists 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_docsindexes 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 benchmarknpm 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_docdownloads → 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 — andnpm run diagramregenerates 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.*andbuildInfo.*setting carries VS Code'sexperimentaltag (the Settings UI shows the badge and the "Experimental" filter finds them), the two.enableddescriptions say so up front, and the README andcmsis-helplabel 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) andassets/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 underdocs/no longer ship — onlydocs/agent-resources, which the MCP resources read, does. search_target_docsexpands 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.extractorgainspdfjsandautonow means pdf.js (legacy build, pure JavaScript, +0.8 MB in the bundle, loaded on first use), so a machine withoutpdftotext— most Windows hosts — indexes documents too;pdftotextstays 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|pdftotextruns 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 thepackDocs.enabledsetting so an agent suggests it rather than asking for documents. The same rule is in thecmsis-pack-docs,cmsis-debug-liveandadd-board-layerskills, and the `...
v2.3.8
[2.3.8] - 2026-08-28
Added
add-board-layerskill — a third extension-authored skill, always installed likecmsis-debug-liveandcmsis-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 noDevice:Startupand 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.con the reset clock,regions_<board>.h, minimal device header), wires the target-type into the csolution and builds to green, then hands over tocsolution-retargetfor 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. Thecmsis-projectrouter's workflow points at it andcmsis-helplists 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
AI Efficiency Optimizations
- Tool list −20 % — the
tools/listevery turn carries shrank from 33.2 to 26.7 kB (single-window surface); per-calltimeoutMsnotes collapsed to one line, rationale moved to the skill; a 30 kB budget and 700-char/description cap are asserted in the transport test. serial.enabledsetting — off drops the tenserial_*tools from the list entirely.get_debug_instructionsby topic — ~2 kB overview + one section on request instead of one 21 kB block.- Compact motion state — step/continue/pause/
wait_for_stopreturn location, frame ids, top 5 frames and the breakpoint list only when it changed; full snapshot only at session start. - Capped listings — variables: 40 per scope, 200 chars per value (uncapped with
variableNames); call stack: 20 frames, workspace-relative paths; threads: 32;read_memorydefaults to hex. - Lighter recovery — after a motion timeout, PC and LR are read instead of all 23 core registers.
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).lookup_peripheral/lookup_register— SVD answers with no session and no target access; unknown names get suggestions instead of the full name list.cmsis_actiontarget check/switch — every result names the target it ran on andtargetswitches/verifies it, removing the wrong-target build → confused-investigation round trips.- Measurement built in — per-call telemetry (bytes in/out, ms, outcome), the
cmsis-developer-assistant://statsresource, theget_session_statustrailer 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_actionchecks 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_inforeports the panel'sCMSIS target:, and the new optionaltargetinput (MPS3orHP@debug, the csolution's own names) selects one: a differing target is switched — the selection is written to.vscode/cmsis.jsonand the solution re-activated, the mechanism the extension (1.70) itself uses since it exposes no command for it — and verified throughcmsis-csolution.getActiveTargetSetbefore 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 tostop_debugging. The build topic and thecmsis-debug-liveskill say when to passtarget; the transport test drives the refusal, switch and no-op paths against a stubbed extension.- Agent evaluation scenarios —
npm 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 thecmsis-developer-assistant://statsresource, 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.tsshares 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 unclockedI2C1.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_infonow also namesSTKOF(Armv8-M stack limit) andDEBUGEVT, 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_peripheralandlookup_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 intoI2C1.CR1), and one register's bit fields with their enumerated values (which bit is the clock enable). The SVD is resolved from an explicitsvdFile, the active session,out/**/*.cbuild-run.yml(pnamepicks 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_registernow does the same and points atlookup_peripheral. The parser readsaddressBlocks,enumeratedValuesanddimregister arrays, and no longer borrows a field'saccessfor its register.cmsis-developer-assistant.serial.enabled(default on) — off leaves the tenserial_*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_stopnow 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_memorydefaults tohex(ascii/bothon request).get_call_stackprints workspace-relative paths and collapses frames beyond 20 unlesslevelsis given;get_threadslists up to 32 tasks. Variable listings withoutvariableNamesare capped at 40 variables per scope and 200 characters per value, with a footer saying how many were left out and how to widen; withvariableNamesnothing 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/listevery client receives atinitialize— 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-calltimeoutMsnote is one short line per tool with the rationale once in the server instructions, and thestart_debugging,cmsis_action,reset,add_breakpoint,add_logpoint,flashandget_debug_instructionsdescriptions carry the trigger and the one caveat an agent needs at call time; the reasoning moved to thecmsis-debug-liveskill and theget_debug_instructionstopics (buildfor the result line and long builds,breakpoints,inspectionfor reset methods). The transport test now asserts a byte budget for the tool list and a 700-character cap per description. get_debug_instructionstakes atopic— the guide for harnesses that do not load skills (GitHub Copilot Chat) no longer arrives as one 21 KB block. Withouttopicthe tool returns a ~2 KB overview (the critical steps, the debugger-first rule) plus the list of topics;session,build,breakpoints,inspection,faultsandtroubleshootingreturn one section each. The guide itself was restructured around those topics (marker comments a Markdown reader never sees), gained afaultssection (EXC_RETURN, the stacked frame, resolving BFAR, the usual cause per flag) and abuildsection (cmsis_action result line, long builds, flash, attach), and its inherited root-cause examples aboutgetUserById(),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 staleSystemCoreClock). The full guide stays available as thecmsis-developer-assistant://docs/debug_instructionsresource; 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_statusnow ends with a two-line summary for the session, the newcmsis-developer-assistant://statsresource 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 newcmsis-developer-assistant.telemetry.jsonlPathsetting (default off) appends one JSON line per call to a file — names and sizes only, never arguments or results.test/realboard/run.tswrites 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 —...
v2.3.3 (pre-release)
[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 isskills/cmsis-skills.lock.json, the catalog source id iscmsis-skills, and the pin moved to the renamed repository's currentmain(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 owncmsis-debug-liveandcmsis-helpstay installed, and theinstalledSkillsselection 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 inglobalState(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-helpskill — 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 bynpm run skills:syncfrom the catalog,package.jsonandscripts/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 failsnpm test. Always installed; the routers end with a pointer to it.
Changed
- The bundled skills are always installed.
cmsis-debug-liveandcmsis-helpno longer depend on theinstalledSkillsselection, which now holds only picks from the pack (default[]; an existing value that namescmsis-debug-livekeeps working). The picker no longer lists them. A user who had deselectedcmsis-debug-livegets 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.mdcarried 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 thetroubleshooting/csharpMCP resource. Resolved;SUPPORT.mdis 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'srepositoryon GitHub, so the extension page showed whateverassets/architecture.pngthat branch held — the original DebugMCP drawing, not the diagram this build was made from.scripts/package.tsnow generates the packaged readme with the image inlined as adata:URI (the only in-package source VS Code's extension page accepts) and the other relative links rewritten as before;README.mdin 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
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 inskills/cmsis-agent.lock.json(npm run skills:sync; upstream has no tags or releases), listed in a generatedskills/catalog.json, and installed only when selected — the new settingcmsis-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-upandcmsis-packdispatch to their member skills; picking a router installs the members withuser-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$namecross-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-markercmsis-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.tspins the catalog to the directories on disk and the lock's content hash;src/test/skillInstaller.test.tscovers the marker rules in temp directories. - MCP
instructionsatinitialize. 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 thecmsis-debug-liveAgent Skill — target awareness, the session-status gate, breakpoint strategy, step-and-inspect, fault decode, root cause — orget_debug_instructionsin harnesses that do not load skills.start_debuggingsays the same in one sentence. (Upstream #129.) - Debugger-first rule in the skill and in the
get_debug_instructionsguide. Do not start a runtime investigation by addingprintfover 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 foradd_logpointonly 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 assertscmsis-debug-liveis its first tool call. Deliberately outsidenpm 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 topopupShown.v3so 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