Skip to content

v0.12.0

Choose a tag to compare

@inkeep-internal-ci inkeep-internal-ci released this 12 Jun 07:51
6e6591c

0.12.0

Stable promotion of beta v0.12.0-beta.16.

Aggregated changes since previous stable:

0.12.0-beta.0

Minor Changes

  • feat(markdown): end-to-end byte fidelity — markdown round-trips byte-exact, agents' untouched bytes survive concurrent edits

    The markdown engine no longer canonicalizes source formatting on the WYSIWYG/cross-surface edit path. Every producer-fixable byte-residual axis now round-trips byte-exact through serialize(parse(x)): table outer pipes, delimiter-row dashes and alignment padding, ordered-list numbering (1. 1. 1. stays), list marker spacing and continuation indents, fence length and info-string padding, strikethrough delimiter (~ vs ~~), task-checkbox case, wiki-link inner padding, opaque-extension embeds (![[notes.foo]] no longer downcasts to a plain link), inline math ($x$ stays $x$ instead of rewriting to $$x$$, with currency safety preserved), doc-start --- thematic breaks (no longer rewritten to ***, and a doc-start --- no longer corrupts adjacent blocks), BOM, leading/trailing blank lines, inter-block blank-line counts, and tab-indented code. One visible consequence: a literal frontmatter-shaped block (---/key: val/---) ingested directly into the parse engine now renders as visible markdown (thematic break + setext heading) instead of being silently dropped.

    Silent data-loss fixes: boundary-whitespace emphasis (<em>foo </em>) now serializes to a re-parseable form instead of degrading to plain text; entity references in a fenced-code info string survive instead of being stripped; [link](</my uri>) parses as a link instead of literal text; inline code containing | inside a table cell keeps its escape instead of corrupting the table. The serializer also stops escaping bare */_/~ and line-start = where CommonMark does not require it.

    Agent find-fidelity (PRD-6654): a concurrent human WYSIWYG edit no longer rewrites an agent's untouched blocks in Y.Text — the map-driven Observer A splice is now the default path and a parse-equivalent row-no-trailing-pipe divergence no longer forces a canonicalizing write-back — so exact-match find-and-replace on previously written content keeps succeeding.

    Clipboard/export rendering: img/video/audio compat components render as real HTML elements instead of placeholders, and entity references and <> destinations in link/image URLs and titles decode correctly (with URL sanitization preserved).

0.12.0-beta.1

Patch Changes

  • Sync now authenticates to GitHub using your gh CLI login, matching how clone already works. Previously the background sync engine only consulted Open Knowledge's own credential store, so users who were signed in with gh but had never completed a separate Open Knowledge sign-in saw a persistent "GitHub sign-in is missing or expired" error in the sync popover even though their gh session was valid. The server now resolves the gh token (the same source the push-permission check already used) and relays it to the git credential helper, which prefers it over its own stored token. A fresh gh auth login or a reconnect is picked up on the next sync cycle without a restart.

    Also fixes ok clone so its gh-based authentication works on installs where gh lives outside the default PATH (e.g. Homebrew at /opt/homebrew/bin): clone now inherits your shell environment instead of replacing it, so the gh credential helper can locate gh and its config.

0.12.0-beta.2

Patch Changes

  • The MCP exec tool now runs commands in the explicit cwd you pass, even when it points at a subdirectory of an OK project. Previously the resolver walked cwd up to the enclosing .ok/config.yml and ran bash from the project root, so a subdir-relative command like cat notes.md (cwd <project>/subdir) failed with a spurious "No such file or directory" and structuredContent.cwd reported the root instead of the directory you asked for — agents had to work around it with project-root-relative paths. The walk-up still resolves which project owns the call (config, server URL, lock, and enrichment stay project-anchored), but the execution directory is now the literal path passed. structuredContent.cwd reports where the command actually ran, and referenced-file enrichment resolves correctly regardless of which subdirectory bash ran in.
    • @inkeep/open-knowledge-core@0.11.1-beta.0

0.12.0-beta.3

Patch Changes

  • Open Knowledge Desktop again puts the ok command on your PATH automatically — politely. Launching the packaged app installs silent terminal shims (~/.ok/bin/ok and ~/.ok/bin/open-knowledge symlinks into the app bundle, a ~/.ok/env.sh PATH shim, and a clearly marked managed block in your shell rc files — .zshrc, plus .bash_profile and fish config where present) with no admin prompt. Any user who has run Desktop at least once can type ok in a new terminal.

    Good-manners guarantees: the edit is disclosed in-app via a sticky toast that names the exact file(s) touched; the block is padded with blank lines and carries an inline opt-out hint; and deleting the block from an rc file is honored permanently — Open Knowledge records the opt-out and never re-adds it to that file. The ~/.ok/bin shims themselves still self-heal on every startup, and OK_RECLAIM_DISABLE=1 disables the whole mechanism.

    Unlike the earlier incarnation of this feature, Desktop no longer seeds ok symlinks into other writable PATH directories (~/.cargo/bin, ~/.local/bin, and the like) to make the command visible in already-open shells — that surprised users more than it helped. Startup now cleans up the symlinks earlier builds recorded, removing each one only while it still points at the recorded bundle target; anything re-pointed or foreign is left alone. The /usr/local/bin admin-prompt installer remains retired.

0.12.0-beta.4

Patch Changes

  • Soften the git auto-sync enable warning. The dialog shown before turning on auto-sync (onboarding and the settings/badge toggle) previously presented its caveats as an amber alert box with a bulleted "Before you enable it" list — alarming for what is a routine, reversible choice. It now reads as a calm "Heads up" section: three titled rows (Uncommitted changes, Commits happen automatically, Shared repositories), each with an icon and a short muted description. Same information, friendlier delivery; screen readers also no longer treat it as an interruption-priority alert.

0.12.0-beta.5

Patch Changes

  • Hide the "Edit with AI" button in the WYSIWYG bubble menu when Open Knowledge is embedded inside an agent host (Cursor, Codex, Claude Desktop). The button opens the header's "Open with AI" menu, but that menu is already hidden in embedded hosts — so clicking the bubble button there did nothing. The button (and its Cmd+Shift+I shortcut) now hide in lockstep with the header menu, matching the rest of the embedded-host chrome.

0.12.0-beta.6

Patch Changes

  • Fixed: a trailing space or tab typed at the end of a frontmatter fence line in source mode no longer destroys the document's frontmatter on the next visual edit. Frontmatter fence recognition now tolerates trailing spaces/tabs on the --- lines (matching CommonMark / remark-frontmatter behavior), so documents whose fences carry trailing whitespace are recognized consistently across the editor bridge, the property panel, templates, search heading extraction, outline navigation, skill bundle metadata, the CLI, and source-mode syntax styling. Leading whitespace before a fence still disqualifies it, as before.

    For maintainers — mechanism: FRONTMATTER_RE rejected fence lines with trailing whitespace while the bridge tolerance layer (normalizeBridge step 7b, the per-line trailing-whitespace strip) declared exactly those bytes equivalent, violating partition invariance: an in-tolerance W2 keystroke (------ ) silently changed FM-region recognition, so Observer A Path B's recompose (prependFrontmatter(readCurrentFm(), serialize(fragment))) fabricated an FM deletion that the three-way merge then applied and settled. The recognition predicate is widened to /^---[ \t]*\r?\n([\s\S]*?\r?\n)?---[ \t]*(\r?\n|$)/ at its definition boundary in core, with every sibling recognition site (server template/heading/enrichment/page-identity/templates-listing/skill-metadata parsers, CLI parser, CodeMirror decoration scoping and outline navigation) either rewired through the core functions or sharing the line-scoped form of the same contract.

0.12.0-beta.7

Patch Changes

  • File → Configure AI Tool Integrations… now opens the consent dialog immediately in the focused window (editor or project switcher). Previously the click armed the dialog silently and it only appeared in the next window the app opened, so clicking the menu item with a window already in front did nothing visible.
    • @inkeep/open-knowledge@0.11.1-beta.0
    • @inkeep/open-knowledge-core@0.11.1-beta.0
    • @inkeep/open-knowledge-server@0.11.1-beta.0

0.12.0-beta.8

Patch Changes

  • Update the Resources menu's Discord item to open the Discord invite directly instead of the stale Inkeep shortlink.
    • @inkeep/open-knowledge-core@0.11.1-beta.0
    • @inkeep/open-knowledge-server@0.11.1-beta.0

0.12.0-beta.9

Patch Changes

  • fix: documents containing CommonMark lazy-continuation lines (an indented line continuing the paragraph above it) no longer rest in a permanent bridge-divergence state. normalizeBridge gained a paragraph-continuation-indent tolerance class that treats the parser's indent-stripping on paragraph continuation lines as a comparison-equivalence, ending the perpetual split-brain telemetry, fuzz stalls, and stale-witness block duplication this construct could trigger. Comparison-only — stored bytes are never rewritten.

0.12.0-beta.10

Patch Changes

  • preview_url now treats a preview request as demand for a backend. When no Open Knowledge server is running for the project, the tool auto-starts one through the same machinery the read/write tools use (OK_MCP_AUTOSTART gate, spawn timeout, spawn-error log) and waits briefly for the preview UI sibling to bind, so an agent whose first action is "open the preview" gets a working URL instead of running: false. The ensure also runs when a UI is already up, which revives the backend for a surviving preview UI whose server idle-shut-down. When no UI can be reached the recovery hint now names the right command for the actual state: ok start when nothing is running (previously the hint said ok ui, which produces a backend-less UI shell in that state) and ok ui when the server is alive but no UI is bound. Auto-start opt-out (OK_MCP_AUTOSTART=0) keeps today's soft not-running answer; spawn failures surface as tool errors with the spawn log attached.

0.12.0-beta.11

Patch Changes

  • Hide the sidebar "New from template" entry when a folder or the project has no templates. Previously, right-clicking a folder always showed a "New from template" submenu that opened to an empty list, and the project empty-space menu showed the entry greyed-out rather than hidden. Both surfaces now drop the entry entirely when there are no templates to pick, matching the toolbar and the editor empty-state.

0.12.0-beta.12

Patch Changes

  • Fixed: placing the cursor in a table cell no longer pushes the whole document down. The invisible positioning layer for the table's column/row handle pills (ok-table-cell-handle-layer) claimed its own row in the editor's layout grid, and on documents shorter than the window that empty row was stretched to an equal share of the leftover height — a blank band appeared above the document whenever a table was focused. The layer is now pinned into the content's own grid row at zero height, so the handle pills render in exactly the same place with no layout shift.

    For maintainers — mechanism: .tiptap-editor is a CSS grid with implicit auto rows, and the default align-content: stretch distributes leftover block-size equally across in-flow auto tracks; any zero-height direct child still generates a stretchable track. The layer now carries grid-row: 1; align-self: start, and .tiptap-editor-portal-content declares grid-row: 1 explicitly so auto-placement doesn't bump the editor body to row 2.

0.12.0-beta.13

Patch Changes

  • Color the "Updated to Version X" sidebar notice green. The post-update confirmation previously used the same gray styling as the "Version X ready to install" notice, making the two easy to confuse at a glance. The confirmation card now renders with a green border, tint, and text so a completed update reads differently from one that is still waiting on a relaunch.

0.12.0-beta.14

Minor Changes

  • Agent writes now get advisory mermaid feedback, delivered on a new unified warnings channel. The write/edit MCP tools (and the underlying POST /api/agent-write-md / POST /api/agent-patch routes) validate every ```mermaid fence of the post-write document with the same mermaid version the editor renders with, and report parse failures as warnings entries (kind: "mermaid-parse-error" — fence locator + mermaid's line-numbered message) plus a line in the tool response text — so the authoring agent can fix a broken diagram in the same session instead of the reader discovering the error chrome. Strictly advisory: writes land byte-faithfully regardless.

    The warnings array is the one advisory channel going forward: it also carries the existing write-integrity kinds (content-divergence, disk-edit-reconciled) on every mutating write surface (write, write-md, patch, frontmatter-patch, rollback / restore_version), so co-occurring advisories no longer mask one another. The single-valued warning field and the MCP structuredContent.document.contentDivergence nesting are deprecated — warning keeps emitting its highest-precedence integrity entry in parallel for one deprecation window; new consumers should read warnings.

    The palette tool's Mermaid entry now teaches the grammar sharp edges (raw ;/# terminate sequence-family message text — use commas or #59;/#35;; quote flowchart labels containing punctuation), and the tool-description footer points at it.

0.12.0-beta.15

Patch Changes

  • Freeze table header row and first column when scrolling

    Long tables now keep the top row (column headers) visible at the top of the editor as you scroll past it, and the first column always stays visible during horizontal scrolling.

0.12.0-beta.16

Patch Changes

  • Skip the "Updated to Version ..." release-notes notice on a fresh install. A brand-new install has no prior version, so everything is new — popping release notes at first launch was noise. The first launch now silently records the installed version as the baseline; the notice fires only on a real version transition (the next update).