From ac1cddaae1c47196bfb80ecffbf55672a724cf21 Mon Sep 17 00:00:00 2001 From: PythonWoods Date: Sun, 2 Aug 2026 11:38:33 +0200 Subject: [PATCH 1/4] docs: update changelog and schema Signed-off-by: PythonWoods --- CHANGELOG.md | 4 + zenzic.schema.json | 442 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 446 insertions(+) create mode 100644 zenzic.schema.json diff --git a/CHANGELOG.md b/CHANGELOG.md index ed13a8b..b9f68f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- **Core Baseline Alignment**: Realigned pinned Zenzic Core baseline to `0.27.0`. +- **Diagnostic Support for v0.27 Rules**: Real-time inline diagnostics for `Z410`/`Z411` (Smart Link Graph), `Z510`/`Z511`/`Z512` (Semantic Linting), and `Z110`/`Z111` (Configuration Engine). +- **JSON Schema Validation**: Updated bundled `.zenzic.toml` schema validation with `max_sentence_length` property. + ## [0.26.5] - 2026-07-29 ### Fixed diff --git a/zenzic.schema.json b/zenzic.schema.json new file mode 100644 index 0000000..d7b67f7 --- /dev/null +++ b/zenzic.schema.json @@ -0,0 +1,442 @@ +{ + "$defs": { + "BuildContext": { + "description": "Build engine context declared in ``[build_context]`` of ``.zenzic.toml``.\n\nTells Zenzic which documentation engine produced the site and which locale\ndirectories are non-default translations. Used by adapters to resolve\nasset and page paths correctly.", + "properties": { + "engine": { + "default": "auto", + "description": "The build engine used by the documentation. Can be 'mkdocs', 'zensical', 'standalone', or 'auto'.", + "enum": [ + "prebuilt", + "vsm", + "mkdocs", + "zensical", + "standalone", + "auto" + ], + "title": "Engine", + "type": "string" + }, + "default_locale": { + "default": "en", + "description": "ISO 639-1 code of the default locale.", + "title": "Default Locale", + "type": "string" + }, + "locales": { + "default": [], + "description": "Non-default locale directory names (e.g. ['it', 'fr']).", + "items": { + "type": "string" + }, + "title": "Locales", + "type": "array" + }, + "base_url": { + "default": "", + "description": "The root URL where the documentation is hosted (e.g. `https://docs.pythonwoods.dev/`).", + "title": "Base Url", + "type": "string" + }, + "fallback_to_default": { + "default": true, + "description": "When True, missing locale-tree assets/pages fall back to the default-locale tree. Set to False to report every missing locale file as an error.", + "title": "Fallback To Default", + "type": "boolean" + }, + "offline_mode": { + "default": false, + "description": "When True, adapters force flat URL structure (e.g. use_directory_urls=False) for offline builds.", + "title": "Offline Mode", + "type": "boolean" + } + }, + "title": "BuildContext", + "type": "object" + }, + "CustomRuleConfig": { + "description": "A single entry in the ``[[custom_rules]]`` TOML array.\n\nEach entry declares a regex-based lint rule applied line-by-line to every\nMarkdown file under ``docs/``. The rule engine compiles the pattern once\nat config-load time.\n\nTOML example::\n\n [[custom_rules]]\n id = \"ZZ-NOINTERNAL\"\n pattern = \"internal\\.corp\\.example\\.com\"\n message = \"Internal hostname must not appear in public docs.\"\n severity = \"error\"", + "properties": { + "id": { + "description": "Stable unique identifier for this rule (e.g. 'ZZ-MY-RULE').", + "title": "Id", + "type": "string" + }, + "pattern": { + "description": "Regular-expression string applied to each content line.", + "title": "Pattern", + "type": "string" + }, + "message": { + "description": "Human-readable explanation shown in the finding.", + "title": "Message", + "type": "string" + }, + "severity": { + "default": "error", + "description": "Severity level: 'error' (default), 'warning', or 'info'.", + "enum": [ + "error", + "warning", + "info" + ], + "title": "Severity", + "type": "string" + } + }, + "required": [ + "id", + "pattern", + "message" + ], + "title": "CustomRuleConfig", + "type": "object" + }, + "GovernanceConfig": { + "description": "Governance toggles declared in ``[governance]``.\n\nThis section controls opt-in governance checks introduced in v0.8.", + "properties": { + "brand_obsolescence": { + "description": "Deprecated brand terms that activate Z601 BRAND_OBSOLESCENCE when present in docs source.", + "items": { + "type": "string" + }, + "title": "Brand Obsolescence", + "type": "array" + }, + "per_file_ignores": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "description": "Per-file suppression map (glob pattern -> finding codes). Example: {'blog/*.md': ['Z601']}. Security findings remain non-suppressible regardless of this map.", + "title": "Per File Ignores", + "type": "object" + }, + "directory_policies": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "description": "Strategic directory-level policy exemptions (glob pattern -> finding codes). Matched findings are removed before display with ZERO suppression debt cost. In --audit mode, exempted findings appear with a [POLICY_EXEMPTION] label. Intended for historical archives, SSOT registries, and blog directories. Security findings (Z201-Z204) bypass this exemption unconditionally.", + "title": "Directory Policies", + "type": "object" + }, + "suppression_cap": { + "default": 30, + "description": "Maximum number of active suppressions allowed before hard-failing the check pipeline.", + "minimum": 0, + "title": "Suppression Cap", + "type": "integer" + }, + "suppression_cap_scope": { + "const": "all", + "default": "all", + "description": "Suppression CAP scope. 'all' counts inline suppressions plus per-file configuration suppressions.", + "title": "Suppression Cap Scope", + "type": "string" + }, + "suppression_cap_fail_hard": { + "default": true, + "description": "When True, exceeding suppression_cap causes immediate exit 1.", + "title": "Suppression Cap Fail Hard", + "type": "boolean" + } + }, + "title": "GovernanceConfig", + "type": "object" + }, + "NetworkConfig": { + "description": "Network I/O toggles declared in ``[network]``.", + "properties": { + "cache_ttl_hours": { + "default": 24, + "description": "Time-to-live for cached external links in hours.", + "title": "Cache Ttl Hours", + "type": "integer" + } + }, + "title": "NetworkConfig", + "type": "object" + }, + "ProjectMetadata": { + "description": "Optional brand-integrity metadata declared in ``[project_metadata]``.\n\nWhen ``obsolete_names`` is non-empty, Zenzic activates the Z905\nBRAND_OBSOLESCENCE rule, which warns on every occurrence of a deprecated\nbrand term found in documentation source files. Lines carrying a\n``zenzic:ignore`` comment are silently skipped so intentional historical\nreferences (e.g. in CHANGELOG files or ADR entries) are not flagged.\nUse ```` in ``.md`` files and\n``{/* zenzic:ignore: Z905 */}`` in ``.mdx`` files.\n\nTOML example::\n\n [project_metadata]\n release_name = \"MyRelease\"\n obsolete_names = [\"PreviousRelease\"]\n # ADR files contain intentional historical references\n obsolete_names_exclude_patterns = [\n \"CHANGELOG*.md\",\n \"community/developers/explanation/adr-*.mdx\",\n ]", + "properties": { + "release_name": { + "default": "", + "description": "Current canonical brand/release name shown in Z905 remediation hints.", + "title": "Release Name", + "type": "string" + }, + "obsolete_names": { + "default": [], + "description": "Deprecated legacy field; populated from [governance].brand_obsolescence.", + "items": { + "type": "string" + }, + "title": "Obsolete Names", + "type": "array" + }, + "obsolete_names_exclude_patterns": { + "default": [ + "CHANGELOG*.md", + "CHANGELOG*.archive.md" + ], + "description": "Glob patterns (relative to docs_dir) for files excluded from Z905. CHANGELOG*.md is excluded by default to allow historical prose.", + "items": { + "type": "string" + }, + "title": "Obsolete Names Exclude Patterns", + "type": "array" + }, + "badge_stamp_files": { + "default": [ + "README.md" + ], + "description": "Files updated by 'zenzic score --stamp'. Each file must contain a '' and/or '' marker; the next non-empty line after each marker is replaced with deterministic audit and/or score badge URLs.", + "items": { + "type": "string" + }, + "title": "Badge Stamp Files", + "type": "array" + } + }, + "title": "ProjectMetadata", + "type": "object" + } + }, + "properties": { + "docs_dir": { + "default": "docs", + "description": "Path to docs directory relative to repo root.", + "format": "path", + "title": "Docs Dir", + "type": "string" + }, + "excluded_dirs": { + "default": [ + "includes", + "stylesheets", + "overrides" + ], + "description": "Directories inside docs/ to exclude from orphan and snippet checks. User-provided entries are merged with the system guardrails (SYSTEM_EXCLUDED_DIRS) \u2014 they can never be removed. ", + "items": { + "type": "string" + }, + "title": "Excluded Dirs", + "type": "array" + }, + "snippet_min_lines": { + "default": 1, + "description": "Minimum lines for a code block to be checked (skip trivial one-liners).", + "title": "Snippet Min Lines", + "type": "integer" + }, + "max_sentence_length": { + "default": 40, + "description": "Maximum words allowed in a sentence before triggering Z511 EXCESSIVE_SENTENCE_LENGTH.", + "title": "Max Sentence Length", + "type": "integer" + }, + "placeholder_max_words": { + "default": 50, + "description": "Pages with fewer than this many words are flagged as placeholders.", + "title": "Placeholder Max Words", + "type": "integer" + }, + "placeholder_patterns": { + "default": [ + "\\btodo\\b", + "\\bfixme\\b", + "\\bwip\\b", + "\\btbd\\b" + ], + "description": "RE2-compatible regex patterns matched case-insensitively against each line. A match flags the page as Z501 PLACEHOLDER. Use \\b word boundaries to avoid substring false positives (e.g. r'\\bwip\\b' matches 'WIP' but not 'wipe').", + "items": { + "type": "string" + }, + "title": "Placeholder Patterns", + "type": "array" + }, + "excluded_assets": { + "default": [], + "description": "Asset paths (relative to docs_dir) excluded from the unused-assets check. Entries may be literal paths or glob patterns (fnmatch syntax: *, ?, []). Use this for files that are referenced by the build tool or theme templates rather than by Markdown pages. Ignores files that do not exist such as virtual indices.", + "items": { + "type": "string" + }, + "title": "Excluded Assets", + "type": "array" + }, + "excluded_asset_dirs": { + "default": [ + "overrides" + ], + "description": "Directories inside docs/ whose non-markdown files are excluded from the unused-assets check. Use this for theme override directories whose files are consumed by the build tool rather than referenced from Markdown pages.", + "items": { + "type": "string" + }, + "title": "Excluded Asset Dirs", + "type": "array" + }, + "excluded_file_patterns": { + "default": [], + "description": "Filename glob patterns excluded from all checks (orphan detection, placeholder scanning, reference pipeline, and credential scanner). Use this for locale-suffixed files managed by i18n plugins (e.g. '*.it.md', '*.fr.md') or historical prose that contains intentional examples of secrets or deprecated syntax (e.g. 'CHANGELOG*.md').", + "items": { + "type": "string" + }, + "title": "Excluded File Patterns", + "type": "array" + }, + "excluded_build_artifacts": { + "default": [], + "description": "Glob patterns (relative to docs_dir) for assets generated at build time. Links to paths matching these patterns are not flagged as broken even when the file does not exist on disk at lint time \u2014 e.g. PDFs produced by the to-pdf plugin or ZIP archives assembled by CI. Example: [\"pdf/*.pdf\", \"assets/bundle.zip\"]", + "items": { + "type": "string" + }, + "title": "Excluded Build Artifacts", + "type": "array" + }, + "respect_vcs_ignore": { + "default": true, + "description": "When True (default), Zenzic reads .gitignore files from the repository root and docs directory and excludes matching paths from all checks. This aligns with industry-grade static analysis standards (Ruff, Ripgrep, Black, Prettier) where VCS-ignored paths are transparently excluded. Set to False only to override this behaviour explicitly. Forced inclusions (included_dirs, included_file_patterns) override VCS exclusions, but System Guardrails are always enforced.", + "title": "Respect Vcs Ignore", + "type": "boolean" + }, + "included_dirs": { + "default": [], + "description": "Directory names inside docs/ that are forcefully included even when excluded by VCS ignore patterns or excluded_dirs. Forced inclusions cannot override System Guardrails (.git, .venv, etc.).", + "items": { + "type": "string" + }, + "title": "Included Dirs", + "type": "array" + }, + "included_file_patterns": { + "default": [], + "description": "Filename glob patterns (fnmatch syntax) forcefully included even when excluded by VCS ignore patterns or excluded_file_patterns. Use for build-generated documentation that should be linted despite being in .gitignore \u2014 e.g. 'api.generated.md'.", + "items": { + "type": "string" + }, + "title": "Included File Patterns", + "type": "array" + }, + "validate_same_page_anchors": { + "default": true, + "description": "When True, same-page anchor links (#section) are validated against the headings present in the source file. A link like [text](#missing) is reported as broken when no heading in the file produces that slug. Disabled by default because single-page anchor IDs can also be generated by HTML attributes, custom plugins, or build-time macros that are invisible at source-scan time.", + "title": "Validate Same Page Anchors", + "type": "boolean" + }, + "excluded_external_urls": { + "default": [], + "description": "External URLs (or URL prefixes) excluded from the broken-link check. A URL is skipped when it starts with any entry in this list. Use this for URLs that are valid but not yet publicly reachable at lint time (e.g. a GitHub repo not yet created, an internal service behind a firewall). Example: [\"https://github.com/PythonWoods/zenzic\"]", + "items": { + "type": "string" + }, + "title": "Excluded External Urls", + "type": "array" + }, + "absolute_path_allowlist": { + "default": [], + "description": "List of absolute path prefixes allowed in links. Absolute path links matching any pattern in this list do not trigger Z105. If an entry in this list is never matched by any scanned absolute path link, it is reported as Z110 STALE_ALLOWLIST_ENTRY.", + "items": { + "type": "string" + }, + "title": "Absolute Path Allowlist", + "type": "array" + }, + "origin_file": { + "anyOf": [ + { + "format": "path", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Path to the file this configuration was loaded from.", + "title": "Origin File" + }, + "build_context": { + "$ref": "#/$defs/BuildContext", + "description": "Build engine context for locale-aware path resolution." + }, + "fail_under": { + "default": 0, + "description": "Minimum quality score (0\u2013100). If the score falls below this value, zenzic score exits with code 1. 0 means no threshold (observational mode). The --fail-under CLI flag overrides this value when explicitly provided.", + "title": "Fail Under", + "type": "integer" + }, + "strict": { + "default": false, + "description": "When True, treat warnings as errors and validate external URLs via network requests. Equivalent to passing --strict on every check all / score / diff invocation. The --strict CLI flag overrides this value for a single run.", + "title": "Strict", + "type": "boolean" + }, + "exit_zero": { + "default": false, + "description": "When True, zenzic check all always exits with code 0 even when issues are found. Issues are still printed and scored. Useful for observation-only pipelines where you want visibility without blocking. The --exit-zero CLI flag overrides this value for a single run.", + "title": "Exit Zero", + "type": "boolean" + }, + "custom_rules": { + "default": [], + "description": "Project-specific lint rules declared inline in .zenzic.toml. Each entry applies a regex pattern line-by-line to every .md file. Example: [[custom_rules]] id='ZZ001' pattern='TODO' message='Remove before publish.' severity='warning'", + "items": { + "$ref": "#/$defs/CustomRuleConfig" + }, + "title": "Custom Rules", + "type": "array" + }, + "project_metadata": { + "$ref": "#/$defs/ProjectMetadata", + "description": "Optional metadata used by remediation messaging and legacy compatibility." + }, + "governance": { + "$ref": "#/$defs/GovernanceConfig", + "description": "Governance toggles for ADR-012 checks. Prefer this section over legacy [project_metadata].obsolete_names." + }, + "network": { + "$ref": "#/$defs/NetworkConfig", + "description": "Network I/O settings for external link validation." + }, + "plugins": { + "description": "Explicit allow-list of external rule plugins to activate from the 'zenzic.rules' entry-point group. Core rules shipped by Zenzic are always enabled.", + "items": { + "type": "string" + }, + "title": "Plugins", + "type": "array" + }, + "forbidden_patterns": { + "default": [], + "description": "Z204 FORBIDDEN_TERM: literal strings (case-insensitive) whose presence in any documentation file triggers an exit-2 security breach. Populated by merging patterns from ``.zenzic.local.toml`` at runtime. Never declare these in the shared ``.zenzic.toml`` \u2014 use the git-ignored ``.zenzic.local.toml`` so private terms are never committed.", + "items": { + "type": "string" + }, + "title": "Forbidden Patterns", + "type": "array" + }, + "placeholder_patterns_compiled": { + "items": {}, + "title": "Placeholder Patterns Compiled", + "type": "array" + }, + "forbidden_patterns_compiled": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "default": null, + "title": "Forbidden Patterns Compiled" + } + }, + "title": "ZenzicConfig", + "type": "object" +} \ No newline at end of file From 0f38120d833ab74d5cb813e273d7c6f38b31f384 Mon Sep 17 00:00:00 2001 From: PythonWoods Date: Sun, 2 Aug 2026 12:30:23 +0200 Subject: [PATCH 2/4] fix: add zenzi.schema.json to REUSE.toml asset paths Signed-off-by: PythonWoods --- REUSE.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/REUSE.toml b/REUSE.toml index de85395..90c6911 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -15,7 +15,8 @@ path = [ "README.md", "ROADMAP.md", "images/**", - "assets/**" + "assets/**", + "zenzic.schema.json" ] SPDX-FileCopyrightText = "2026 PythonWoods " SPDX-License-Identifier = "Apache-2.0" From 994015aee55dd66c140ab75ee3f9d729dea37b71 Mon Sep 17 00:00:00 2001 From: PythonWoods Date: Sun, 2 Aug 2026 18:27:43 +0200 Subject: [PATCH 3/4] docs: update changelog and README for v0.27.0 release Signed-off-by: PythonWoods --- CHANGELOG.md | 5 +++++ README.md | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9f68f0..7b719dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,18 +14,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.26.5] - 2026-07-29 ### Fixed + - **Core Baseline Alignment**: Realigned pinned Zenzic Core baseline to `0.26.5` to bypass the dirty `0.26.4` PyPI release. ## [0.26.4] - 2026-07-29 ### Fixed + - **Core Baseline Alignment**: Realigned pinned Zenzic Core baseline to `0.26.4`. This ensures the editor LSP client benefits from the eradication of ghost diagnostics on file deletion and correct inline suppression placement. + ## [0.26.3] - 2026-07-28 ### Added + - **Suppression Code Actions (`LSP-FEAT-003`)**: Added support for automated inline suppressions. You can now use the Quick Fix (Lightbulb) menu to instantly inject `` comments above offending lines. This feature is intentionally disabled for Z2xx Security findings. ### Fixed + - **DQS Tooltip Rendering (`LSP-FIX-015`)**: Fixed a rendering issue where a `security_breach` status incorrectly displayed green checkmarks in the DQS tooltip. The tooltip now prominently displays a security breach warning. - **Core Baseline Alignment**: Realigned pinned Zenzic Core baseline to `0.26.3`. diff --git a/README.md b/README.md index 802064c..f30c9a1 100644 --- a/README.md +++ b/README.md @@ -21,18 +21,23 @@ This extension is a strictly **Thin Client**. It contains zero parsing logic, ze ## Key Features ### 1. Security Scanning (SAST) + Hardcoded credentials (Z201) and path traversal sequences (Z202/Z203) are flagged in milliseconds using RE2 validation engine rules, preventing secret leaks before files are committed. ### 2. Graph Topology Analysis (VSM) + Modify a heading or link in one file, and Zenzic's Virtual Site Map (VSM) instantly invalidates any broken links, orphan pages, or dead navigation nodes across your entire workspace using $O(K)$ incremental graph patching. ### 3. Adapter-Driven Config Hot-Reloading (`v0.25.0`) + When framework configuration files (e.g. `mkdocs.yml`, `zensical.toml`, `.zenzic.toml`) are modified, the Language Server automatically reloads adapter metadata and rebuilds the Virtual Site Map without requiring an extension or editor restart. ### 4. Inline Diagnostics, Quick Fixes & Automated Suppressions + Hover over any diagnostic to view the exact Z-Code, DQS score penalty, and remediation guidance. Apply automated Quick Fixes or insert Automated Inline Suppressions (``, except for `Z2xx` Security findings) via `textDocument/codeAction` directly from the editor lightbulb menu. ### 5. DQS Workspace UI + Stream Document Quality Score (DQS) updates directly to the status bar, providing real-time visibility into overall repository health. ### Real-Time Diagnostics vs. Global DQS @@ -103,21 +108,24 @@ The extension contributes the following commands to the Command Palette: - **Cause**: The executable resolved by the extension is older than the minimum required Core version (`v0.26.5`). - **Remediation**: Upgrade your global binary: + ```bash uv tool install --force zenzic ``` - Or point `zenzic.executablePath` in `settings.json` to a virtual environment containing Core `v0.26.5` or higher. + Or point `zenzic.executablePath` in `settings.json` to a virtual environment containing Core `v0.26.5` or higher. ### Zenzic: Not Found (ENOENT) - **Cause**: The `zenzic` executable is not present in the system `$PATH`. This commonly occurs in Flatpak, Snap, or isolated terminal environments where user binary directories (`~/.local/bin`) are omitted from process environments. - **Remediation**: Specify an explicit path to the binary in `settings.json`. `${workspaceFolder}` and leading `~/` / `~\` are expanded automatically: + ```json { "zenzic.executablePath": "~/custom_path/.venv/bin/zenzic" } ``` + - **Null-workspace note**: `${workspaceFolder}` requires an open workspace folder. If you open a standalone file without a workspace, use an absolute path or a `~/...` path instead. ### Logs and Observability From 4596459726b880759af2b47143d62d00e2d72cd2 Mon Sep 17 00:00:00 2001 From: PythonWoods Date: Sun, 2 Aug 2026 18:28:32 +0200 Subject: [PATCH 4/4] release: bump version to 0.27.0 (core 0.27.0) Signed-off-by: PythonWoods --- .bumpversion.toml | 2 +- CHANGELOG.md | 2 ++ CONTRIBUTING.md | 4 ++-- README.md | 6 +++--- RELEASE.md | 8 ++++---- package-lock.json | 4 ++-- package.json | 2 +- src/extension.ts | 2 +- 8 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.bumpversion.toml b/.bumpversion.toml index 7aab375..fde7f7a 100644 --- a/.bumpversion.toml +++ b/.bumpversion.toml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 [tool.bumpversion] -current_version = "0.26.5" +current_version = "0.27.0" parse = "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)" serialize = ["{major}.{minor}.{patch}"] commit = true diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b719dd..5ebe260 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.27.0] - 2026-08-02 + - **Core Baseline Alignment**: Realigned pinned Zenzic Core baseline to `0.27.0`. - **Diagnostic Support for v0.27 Rules**: Real-time inline diagnostics for `Z410`/`Z411` (Smart Link Graph), `Z510`/`Z511`/`Z512` (Semantic Linting), and `Z110`/`Z111` (Configuration Engine). - **JSON Schema Validation**: Updated bundled `.zenzic.toml` schema validation with `max_sentence_length` property. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3d78d35..118c5f7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,7 +27,7 @@ Zenzic is structured across three independent, dedicated repositories: - **Thin Client Sovereignty**: `zenzic-vscode` contains **zero** AST parsing, regex checks, or link validation rules. All analysis logic resides in Zenzic Core (`zenzic lsp`). - **Protocol Parity**: The extension communicates via standard Language Server Protocol (LSP) over stdio. -- **Minimum Core Baseline**: Currently pinned to **Zenzic Core `v0.26.5`** (`MIN_CORE_VERSION = '0.26.5'` in `src/extension.ts`). +- **Minimum Core Baseline**: Currently pinned to **Zenzic Core `v0.27.0`** (`MIN_CORE_VERSION = '0.27.0'` in `src/extension.ts`). --- @@ -51,7 +51,7 @@ To maintain security, architectural integrity, and legal compliance, all contrib | **npm** | required | Package manager | | **just** | required | Task runner — `cargo install just` or via OS package manager | | **reuse** | required | SPDX license auditor (`uv tool install reuse`) | -| **Zenzic Core** | ≥ 0.26.5 | Core engine (`uv tool install zenzic`) | +| **Zenzic Core** | ≥ 0.27.0 | Core engine (`uv tool install zenzic`) | --- diff --git a/README.md b/README.md index f30c9a1..8015145 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ To guarantee sub-50ms performance, Zenzic operates with a strict separation of c ## Requirements -This extension requires **Zenzic Core v0.26.5 or higher**. +This extension requires **Zenzic Core v0.27.0 or higher**. We recommend installing or updating the global binary via `uv`: @@ -106,14 +106,14 @@ The extension contributes the following commands to the Command Palette: ### Zenzic: Outdated Core -- **Cause**: The executable resolved by the extension is older than the minimum required Core version (`v0.26.5`). +- **Cause**: The executable resolved by the extension is older than the minimum required Core version (`v0.27.0`). - **Remediation**: Upgrade your global binary: ```bash uv tool install --force zenzic ``` - Or point `zenzic.executablePath` in `settings.json` to a virtual environment containing Core `v0.26.5` or higher. + Or point `zenzic.executablePath` in `settings.json` to a virtual environment containing Core `v0.27.0` or higher. ### Zenzic: Not Found (ENOENT) diff --git a/RELEASE.md b/RELEASE.md index bf3cb4a..b59792b 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -8,8 +8,8 @@ | Field | Value | | :--- | :--- | -| **Extension Version** | 0.26.5 | -| **Pinned Core** | `zenzic>=0.26.5` | +| **Extension Version** | 0.27.0 | +| **Pinned Core** | `zenzic>=0.27.0` | | **Date** | 2026-07-11 | ## 1. Pre-Flight Checklist @@ -49,8 +49,8 @@ git checkout main git pull origin main # 3. Create the immutable signed tag pointing to the HEAD of origin/main -git tag -s -m "Release v0.26.5" v0.26.5 -git push origin v0.26.5 +git tag -s -m "Release v0.27.0" v0.27.0 +git push origin v0.27.0 ``` ## 4. Distribute (Automated) diff --git a/package-lock.json b/package-lock.json index 88abec2..b6c0418 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "zenzic-vscode", - "version": "0.26.5", + "version": "0.27.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "zenzic-vscode", - "version": "0.26.5", + "version": "0.27.0", "dependencies": { "vscode-languageclient": "^10.1.0" }, diff --git a/package.json b/package.json index 82b2435..d595c23 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "zenzic-vscode", "displayName": "Zenzic", "description": "Deterministic Document Integrity Engine and SAST for Markdown/MDX graphs.", - "version": "0.26.5", + "version": "0.27.0", "publisher": "pythonwoods", "engines": { "vscode": "^1.125.0" diff --git a/src/extension.ts b/src/extension.ts index 5a4ddae..43f939e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -20,7 +20,7 @@ let dqsStatusBarItem: vscode.StatusBarItem | undefined; // A2 fix: guard flag prevents concurrent restart calls. let restarting = false; -const MIN_CORE_VERSION = '0.26.5'; +const MIN_CORE_VERSION = '0.27.0'; /** * Expand supported user-facing path variables in zenzic.executablePath.