Skip to content

v0.9.0 — Initial public release

Latest

Choose a tag to compare

@stuff2dev stuff2dev released this 26 Jul 15:44
· 1 commit to main since this release

"# Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog.

[Unreleased]

[0.9.0] - 2026-07-13

Added

  • Three-stage validation pipeline: syntax check, structure validation against
    JSON Schema Draft 2020-12, and semantic rules with custom keywords.
  • valj-core library: schema compilation, validation engine, structured error
    reporting with typed Expectation enum, PathSegment/JsonPath newtype.
  • Built-in semantic rules: reference integrity (x-ref), conditional required
    fields (x-required-if), and circular reference detection with cycle
    guards.
  • Optional rule field on every finding — schema-derived human-readable
    description of the violated construct, resolved via a path-walk adapter
    strategy with $ref following and cycle detection (max depth 16). Supports
    Required, AnyOf, OneOf, allOf, if/then/else, dependentRequired, and
    dependentSchemas keywords.
  • valj-format library: three output modes — human-readable terminal output
    with ANSI colours (owo-colors), machine-readable JSON array, and
    LLM-optimised text with fix instructions.
  • valj CLI tool: validates JSON documents against schemas with validate
    and check-schema subcommands. Supports --format json|human|llm,
    --color auto|always|never, --max-errors, stdin input via -, and
    implicit Stage-1 syntax check when no subcommand is given.
  • -o/--force output file flags for the CLI: write the validated document
    to disk on success; --force permits overwriting an existing file.
  • valj-mcp server: stdio-based JSON Schema validation server for Model
    Context Protocol clients. Exposes four tools: valj_validate,
    valj_check_schema, valj_list_schemas, and valj_register_schema
    (dynamic mode only).
  • Schema hot-reload: valj-mcp reloads the schema file on modification time
    change at every validate call.
  • Registry configuration via valj.toml: load multiple named schemas at
    startup with --config; individual failures are reported without aborting
    the server.
  • Optional dynamic schema registration behind [server] dynamic = true with
    a sandboxed schema_root (symlink-escape resistant, canonical-path check).
  • output_path/overwrite parameters for the MCP valj_validate tool:
    pretty-print and write the validated document to an absolute path on success.
  • Man pages: valj(1), valj-mcp(1), valj-mcp.toml(5), valj-schema(5),
    valj-protocol(7). Built via just build-man (pandoc) and included in the
    DEB package under /usr/share/man/.
  • Shell completions for Bash, Zsh, and Fish via just build-completions.
  • scripts/mcp-smoke.sh: wire-level bash smoke test for valj-mcp (MCP spec
    2025-11-25). Pipes JSON-RPC 2.0 messages into the binary and asserts on the
    captured stdout.
  • justfile recipes: build-man, lint-man, build-completions,
    build-deb, clean-man, clean-completions.
  • xtask binary: build-time helpers for manpage OPTIONS snippet generation
    (gen-man-options) and shell completion generation (gen-completions).
  • Supply-chain tooling: deny.toml for cargo-deny, cargo-machete integration.
  • Release tooling: release.toml (cargo-release, workspace-wide version tags).

Changed

  • valj_validate MCP tool accepts an optional schema_name parameter and
    returns a tagged response object (syntax_only mode without schema_name,
    full mode with schema_name).
  • valj-format JSON output emits the rule field in every finding when
    present; the field is omitted when the rule is None.
  • valj-format LLM output emits a Rule: line in every error block; text is
    truncated at 500 characters with ... suffix when the rule exceeds the
    limit; the schema block is omitted when a rule is present to reduce token
    count.
  • valj-mcp McpFinding exposes an optional rule field; tool descriptions
    and server instructions document the rule in findings.
  • valj-core gains tracing dependency for diagnostic warnings at the API
    boundary.
  • Rule resolver follows $ref mid-walk during pointer traversal and accepts
    the literal /$ref/ segments that jsonschema 0.29 emits in
    schema_path. Cycle detection and a max ref depth of 16 levels are in
    place.
  • AnyOf, OneOf, and dependentRequired adapters derive the container pointer
    parametrically from schema_pointer (rightmost matching segment with
    boundary check) instead of hardcoding keyword paths from the schema root.
  • Required adapter preserves nesting context by stripping only the trailing
    /required (or /$ref/required) suffix and appending the property segment.
  • Property names containing / or ~ are RFC 6901 escaped (~1, ~0) when
    synthesised into pointer segments.

Fixed

  • Contract-lock tests pin the empirical schema_path shape of jsonschema 0.29
    and the ValidationErrorKind::Required reuse for dependentRequired
    violations.
  • cargo deb finds man-page and completion assets in the workspace target
    directory.
  • OPTIONS snippet injection in build-man works correctly with multiple
    *.options.roff files present.
  • CLAP_OPTIONS placeholder in manpages is correctly replaced via fixed sed
    pattern escaping.
  • Duplicate .SH OPTIONS section in valj.1 eliminated; redundant .br/
    blank-line sequences from clap_mangen no longer trip mandoc -T lint.
  • MCP protocol-version negotiation verified against MCP spec 2025-11-25
    lifecycle: exact-match, older-known, and unknown-future versions handled
    correctly.
    "