Changelog¶
All notable changes to this project are documented here. The format follows Keep a Changelog and the project uses Semantic Versioning.
Unreleased¶
0.3.1 - 2026-10-01¶
Added¶
clijson.checks.pseudowire_redundancy()gives a verdict on normalized pseudowires: one forwarding PW per service, backups in standby, nothing down, and optionally "every service has a backup". It returns aRedundancyReportwith the problems and a per-service status.- MCP tool
check_pseudowire_redundancy. It runs that check on a capture and, given the pre-change capture asbefore, also returns the pre-change verdict and the changes. - The MCP server instructions now tell assistants about the pseudowire commands and the change-verification workflow.
0.3.0 - 2026-10-01¶
Added¶
- L2VPN / pseudowire redundancy verification commands:
- Huawei VRP:
display vsi(summary andverbose),display vsi peer-info,display vsi protect-group,display mpls l2vc,display bridge-domain, anddisplay mac-addressfiltered byvsiorbridge-domain. - Cisco IOS XR:
show l2vpn bridge-domain(default anddetail, filtered by bd-name, group, interface or neighbor),show l2vpn xconnect detailandshow l2vpn forwarding bridge-domain mac-address. - Juniper Junos:
show l2circuit connections(all variants, with status codes decoded),show vpls connections,show bgp groupandshow route forwarding-table. - New vendor-neutral model
l2vpn.pseudowires(service, neighbor, PW ID, state, primary/backup role, active flag, VC type, MTU, labels), produced by all of the above. clijson.diff()matches pseudowires by neighbor + PW ID, so new labels or reordered output aren't reported as changes.- Guide: Pseudowire redundancy pre/post change checks.
Fixed¶
- Junos
show route forwarding-tablewas handled by the genericshow routeparser. It now has a dedicated parser.
Changed¶
mac.tablenormalized records allowvlan: nullwhen the device reports a bridge-domain or PW instead of a VLAN.
0.2.0 - 2026-10-01¶
Added¶
- Typed normalized models: every intent is a
TypedDictinclijson.models(BgpNeighbor,Route,Interface,Arp, ...) with per-field descriptions, so editors and type checkers know the shape ofresult.normalized. - JSON Schema (draft 2020-12) for every model:
clijson.models.json_schema(),clijson schema(list, print, export with--out) and the committedschemas/directory. clijson.models.validate()andclijson schema <model> --check FILEto check data against a model without extra dependencies. The test suite checks every normalized fixture against its schema with both this validator andjsonschema.-
MCP server (
clijson mcp, extraclijson[mcp]). AI assistants and agents can parse output, parse session logs, detect platforms, diff captures, list commands and fetch model schemas through read-only tools. It also exposesclijson://commandsandclijson://models/{intent}resources, supports stdio and Streamable HTTP, and is built on the officialmcpSDK v2. See docs/mcp.md. -
Documentation site built with Zensical, the successor of Material for MkDocs. It has getting started, CLI and MCP guides, the generated command and model catalogs, and an API reference generated from docstrings (mkdocstrings). It is built on every PR and deployed to GitHub Pages from
main. -
Release automation: pushing a
vX.Y.Ztag builds, attests and publishes to PyPI with trusted publishing, then creates a GitHub release from the changelog (RELEASING.md). - CodeQL code scanning, issue forms (parsing problem, feature request), a PR template, CODEOWNERS,
SECURITY.mdandCODE_OF_CONDUCT.md.
Changed¶
- Build and packaging moved to uv. The
uv_buildbackend replaces setuptools, development tools are PEP 735 dependency groups, anduv.lockpins every tool version. - Python 3.10 or newer is required (3.8 and 3.9 are end-of-life). Python 3.14 is supported and tested.
- License metadata uses a PEP 639 SPDX expression.
clijson.__version__is read from the installed package metadata.- Code is formatted with
ruff format(120 columns), and more ruff rule families are enabled (bugbear, comprehensions, simplify, perf, pytest style). - pre-commit hooks for ruff, the lockfile and basic file hygiene.
- CI runs on
astral-sh/setup-uvwith a locked environment and dependency caching. It also cancels superseded runs and builds and smoke-tests the wheel. - GitHub Actions are pinned to commit SHAs. Dependabot keeps them and
uv.lockup to date. - A plugin that fails to load now raises a
RuntimeWarninginstead of failing silently. - The codebase uses modern Python 3.10 syntax (
list[str],X | None, PEP 613 aliases). It is checked withmypy --strictin CI and pre-commit, and shipspy.typedso your editor and type checker see full types. - Normalized output:
ospf.neighbors.dead_time,arp.ageandipv6.neighbors.ageare now always integer seconds on every vendor. Before, IOS XR gave"00:00:31"strings and VRP gave ARP expiry in minutes.
Removed¶
- The
devextra. Useuv sync(thedevdependency group) instead.
0.1.0¶
First release.
- 161 dedicated parsers (237 command patterns) for Cisco IOS XR, Juniper Junos and Huawei VRP.
- Abbreviation-aware command grammar. Huawei
showalias. - Platform detection from prompts, command verbs and output fingerprints, with trial parsing as a fallback.
- Generic engine for any other output: tables, key/value pairs and indented sections.
- Junos
| display jsonand| display xmlsupport. - Configuration trees for IOS XR / VRP (indented) and Junos (curly braces and
| display set). - Vendor-neutral normalized models for 18 concepts.
- Session logs with many commands (
parse_session). - Structural
diffof two captures, matched by natural key, with volatile fields ignored by default. - Device error detection (
engine="device-error"), bytes input,records()andto_dataframe(). - Optional ntc-templates and Genie fallback engines.
- CLI (
clijson), HTTP API (clijson serve) and live collection (clijson run, scrapli/netmiko). - Typed command parameters (prefixes, addresses and interfaces must look like one), so typos aren't swallowed.
- containerlab lab and
scripts/harvest.pyfor checking new OS releases against every supported command. - 238 regression fixtures (217 captured from real devices).