0.30.x

0.30.3

Released:

01.07.2026

✨ New Features

  • PlantUML diagrams in the rich preview

    The sphinxcontrib-plantuml uml directive (and its plantuml alias) 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_back schema key

    Schemas can now validate a need’s incoming links via a new network_back key, complementing network (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 build now 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, default code_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 @need marker 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, the id[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 ubc CLI 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 report command, 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_data and the var.* namespace (0.30.0b1);

  • the links_from_content() dynamic function and project flavors for ubc 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 ubc CLI

    The Model Context Protocol server now runs from the single native ubc CLI via ubc serve mcp, alongside the language server via ubc serve lsp, with license checking. The VS Code extension launches both servers from its bundled ubc CLI.

  • Bundled ubc CLI on the integrated-terminal PATH

    The VS Code extension now adds its bundled ubc CLI to the integrated terminal’s PATH, so you can run ubc commands 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 function

    A 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 quickstart

    ubc quickstart gained a --flavor option 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-block and needuml) in Markdown (MyST) files no longer emit a spurious directive.missing_argument warning, matching reStructuredText behaviour.

  • The myst parser flavour now enables no optional Markdown extensions by default, matching MyST-Parser. Previously deflist, dollarmath, colon_fence, and fieldlist were on by default; enable the ones you need explicitly via the parser extensions setting.

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-documents also gained a --parser flag 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 report command renders a template by name (or lists the available templates with --list).

    • The new [reports] configuration section sets the templates directory and 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 quickstart now scaffolds a runnable starter template demonstrating grouped tables and an inline SVG chart.

    Reports view and in-editor report preview in VS Code

    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 filter command 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 like jq:

    $ 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-cache to 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_file configuration and the var.* 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 diff gained a --config option for comparing a project against itself under a configuration override, e.g. ubc diff -c "needs.variant_data_file = 'variants2.json'".

  • Native Rust ubc CLI

    The standalone ubc binary 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, and ubc query — now runs the Rust pipeline end-to-end, improving performance. The legacy --parallel / --no-parallel and --force-parallel options 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 needs gained a --pretty flag for indented, human-readable JSON output.

  • Unified AST for RST and Markdown/MyST (ubc_ast)

    A new ubc_ast crate introduces a format-agnostic intermediate representation shared by the RST and Markdown/MyST parsers. Each source file’s CST is lowered to a syntax_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.