0.30.x¶
0.30.3¶
- Released:
01.07.2026
✨ New Features¶
PlantUML diagrams in the rich preview
The sphinxcontrib-plantuml
umldirective (and itsplantumlalias) now renders as a diagram in the VS Code rich preview, converted best-effort to Mermaid and drawn client-side — no PlantUML toolchain or server required. When a diagram can’t be converted cleanly, the preview falls back to showing the directive source rather than a blank box or a parse error. Coverage spans sequence, class, component/description, state, and activity diagrams.This is built on a brand-new Rust-based PlantUML parser, which lays the groundwork for richer features in the future — for example, validating class diagrams against the source code they describe (via the codelinks features).
network_backschema keySchemas can now validate a need’s incoming links via a new
network_backkey, complementingnetwork(outgoing links). This mirrors sphinx-needs#1731, available in the next Sphinx-Needs release, bringing the two implementations to parity.Source-code tracing: back-attach URLs onto referenced needs
ubc buildnow honours@need-ids:reference markers in source code: the marker’s URL is written onto the already-existing referenced need, under a configurable field (ref_url_field, defaultcode_url). This complements the existing markers that define needs from code, and lets you keep, for example, implementation and test links in separate fields.Go-to-definition for codelinks need IDs
Pressing F12 / Go to Definition on an outgoing linked need ID inside a
@needmarker now jumps to that need’s definition.
👌 Improvements¶
Schema validation diagnostics now align more closely with Sphinx-Needs: all network-local validation errors are surfaced (previously some were hidden), message text matches Sphinx-Needs, invalid or circular
$refs are reported, theid[index]of the failing item is included in the diagnostic, and runtime-injected core fields (docname/is_external/is_import) resolve correctly during validation.Faster reStructuredText parsing through a series of inline-processing optimisations.
🐛 Fixes¶
reStructuredText parsing now matches docutils more closely: codepoint-correct backslash-escape handling, Unicode-aware simple names, table character-width semantics, and attribution matching.
The Markdown (MyST) parser no longer panics on a lone carriage return inside directive options.
0.30.2¶
- Released:
23.06.2026
0.30.2 is the first stable release in the 0.30 series. It builds on the 0.30.0b1 and 0.30.1b1 pre-releases, so in addition to the changes listed below it includes everything from those, most notably:
the native Rust
ubcCLI and language server, with the indexing pipeline and reStructuredText IDE features now powered by Rust (0.30.0b1, 0.30.1b1);Markdown (MyST) authoring support, with the
[parse.parsers.<name>]parser / file-routing configuration (0.30.0b1);HTML report templates, the
ubc reportcommand, and the VS Code Reports view (0.30.0b1);command-line need querying via
ubc query filter(0.30.0b1);build-variant data in filter expressions and field values via
needs.variant_dataand thevar.*namespace (0.30.0b1);the
links_from_content()dynamic function and project flavors forubc quickstart(--flavor) (0.30.1b1).
See the pre-release entries below for the full details.
✨ New Features¶
Markdown (MyST) language-server support
Building on the Markdown (MyST) authoring support added in 0.30.0b1, the language server now provides in-editor features for Markdown files that were previously available only for reStructuredText:
directive name and option completion,
go-to-definition and find-references for need link option values,
semantic highlighting for block constructs and option keys.
MCP server in the
ubcCLIThe Model Context Protocol server now runs from the single native
ubcCLI viaubc serve mcp, alongside the language server viaubc serve lsp, with license checking. The VS Code extension launches both servers from its bundledubcCLI.Bundled
ubcCLI on the integrated-terminal PATHThe VS Code extension now adds its bundled
ubcCLI to the integrated terminal’sPATH, so you can runubccommands in the terminal without installing the CLI separately.
🐛 Fixes¶
The language server no longer re-logs the document route on every keystroke, reducing noise in the language-server output.
0.30.1b1¶
- Released:
17.06.2026
- pre-release:
✨ New Features¶
Native Rust language server
The VS Code extension now launches a native Rust binary instead of the previously bundled Python language server. Dropping the bundled Python runtime makes the extension smaller to install and quicker to respond.
IDE behaviour should match the previous implementation, but please report any regressions you notice.
links_from_content()dynamic functionA new built-in dynamic function,
links_from_content(), returns the needs referenced via:need:roles in a need’s own content, for use in a link field:.. spec:: My specification :id: SPEC_001 :links: [[links_from_content()]] This specification realises :need:`REQ_001`.
Project flavors for
ubc quickstartubc quickstartgained a--flavoroption to choose which example project is scaffolded:minimal(default) — a minimal reStructuredText project,full— a feature tour with RST and Markdown, variants, links, and reports,markdown— a minimal Markdown (MyST) project,variants— a build-variant (“150% model”) project.
👌 Improvements¶
In the VS Code Reports view, the report Open in Browser action is now a primary inline button (shown alongside Edit and Generate & Preview), rather than being hidden in the right-click menu. This is the action that renders a report with its
<script>blocks and external CSS/JS frameworks as a standalone, shareable file.
🐛 Fixes¶
These fix the Markdown (MyST) authoring support introduced in 0.30.0b1.
Need directives without a title (and other directives with optional arguments, such as
code-blockandneeduml) in Markdown (MyST) files no longer emit a spuriousdirective.missing_argumentwarning, matching reStructuredText behaviour.The
mystparser flavour now enables no optional Markdown extensions by default, matching MyST-Parser. Previouslydeflist,dollarmath,colon_fence, andfieldlistwere on by default; enable the ones you need explicitly via the parserextensionssetting.
0.30.0b1¶
- Released:
12.06.2026
- pre-release:
✨ New Features¶
Markdown (MyST) authoring support
Projects can now define needs in Markdown (MyST) files alongside reStructuredText. The new
[parse.parsers.<name>]configuration tables declare the parsers a project uses, select the files each parser owns, and route every discovered file to the right one:[parse.parsers.rst] [parse.parsers.md] flavour = "myst" include = ["docs/**/*.md"]
Need directives in Markdown files are indexed, validated, and queryable just like their reStructuredText counterparts. Projects that declare no parsers keep the existing behaviour: every file discovered via
[source]is parsed as reStructuredText. See parsers and file routing for details.Note that language-server features for Markdown files in the VS Code extension (such as in-editor diagnostics, as already available for reStructuredText) are not yet implemented, but are planned for a future release.
ubc build list-documentsalso gained a--parserflag that shows which parser each source document is routed to.HTML report templates
ubCode can now render user-authored Jinja templates (
*.html.j2) against the project’s needs index, producing a single self-contained HTML file:The new
ubc reportcommand renders a template by name (or lists the available templates with--list).The new
[reports]configuration section sets the templatesdirectoryand an output size limit.In VS Code, a new Reports view in the ubCode sidebar lists the project’s templates, with in-editor preview and Open in Browser actions; render failures are reported in the Problems panel.
ubc quickstartnow scaffolds a runnable starter template demonstrating grouped tables and an inline SVG chart.
The Reports view and in-editor report preview in VS Code.¶
See reports for more details.
Query needs from the command line
The new
ubc query filtercommand filters the needs of a project using Python-style filter expressions, printing the results as a human-readable table or as JSON (--format json) that pipes cleanly to tools likejq:$ ubc query filter 'type == "req" and status == "open"' --field id --field title
The project is automatically (and incrementally) re-indexed before querying, so results are always up to date; use
--no-cacheto bypass the on-disk cache entirely.Variant data for build-variant-aware projects
Filter expressions can now reference external build-variant data via the new
needs.variant_data/needs.variant_data_fileconfiguration and thevar.*namespace, e.g.var.platform == "windows"or"arm" in var.archs. Need field and link values can also pull values directly from the variant data using the new<{ var.* }>reference syntax:.. req:: Example :id: REQ_001 :platform: <{ var.platform }>
See variant builds and variant data for more details.
These features mirror the upcoming additions to sphinx-needs (currently on its master branch, to be released soon). The if directive is not yet handled, but support is hoped to land soon.
Relatedly,
ubc diffgained a--configoption for comparing a project against itself under a configuration override, e.g.ubc diff -c "needs.variant_data_file = 'variants2.json'".Native Rust
ubcCLIThe standalone
ubcbinary is now the native Rust implementation of the CLI, replacing the previous Python-based bundle, with faster startup and indexing. The command surface, output, and exit codes match the Python implementation.
👌 Improvements¶
Indexing pipeline moved to Rust
Project indexing — as used by
ubc build,ubc check,ubc diff,ubc schema validate, andubc query— now runs the Rust pipeline end-to-end, improving performance. The legacy--parallel/--no-paralleland--force-paralleloptions are deprecated no-ops: they are still accepted (with a deprecation warning) but hidden from help output.IDE reStructuredText features now powered by the Rust parser
Formatting, HTML preview, completions, hover, definitions, references, and the document outline in the language server are now all backed by the Rust RST parser. The document outline (and editor breadcrumbs) now nest sections hierarchically.
ubc build needsgained a--prettyflag for indented, human-readable JSON output.Unified AST for RST and Markdown/MyST (
ubc_ast)A new
ubc_astcrate introduces a format-agnostic intermediate representation shared by the RST and Markdown/MyST parsers. Each source file’s CST is lowered to asyntax_tree::Tree— the same arena-allocated, anymap-per-node structure used throughout the rest of the codebase — using a 90-type vocabulary derived from the docutils Generic DTD, covering all structural, body, body-subelement, and inline elements (admonitions, figures, sidebars, tables, and everything in between), plus format-specific extensions (YAML front matter, MyST block break, GFM strikethrough, hard and soft line breaks, and roles). Node dispatch in the display and writer code uses a sorted(TypeId, fn)table binary-searched per node, matching the pattern already established in the RST writer. This representation will power future language-server features such as cross-format structural navigation and traceability.
🐛 Fixes¶
Fixed go-to-symbol, hover, and selection for content nested inside RST sections; a section now spans its whole body rather than just its title line.
Find References on a need part (e.g.
REQ_123.x) now returns only that part’s references, not all references to the base need.Fixed malformed HTML in the license-restricted preview banner.
Malformed inline markup that exceeds the regex backtrack limit now emits a diagnostic instead of failing the parse.
Source files are now sorted before indexing, so duplicate-ID resolution and the resulting diagnostics are deterministic across runs.