v0.12.0
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-equivalentrow-no-trailing-pipedivergence no longer forces a canonicalizing write-back — so exact-match find-and-replace on previously written content keeps succeeding.Clipboard/export rendering:
img/video/audiocompat 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
ghCLI 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 withghbut 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 theirghsession was valid. The server now resolves theghtoken (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 freshgh auth loginor a reconnect is picked up on the next sync cycle without a restart.Also fixes
ok cloneso itsgh-based authentication works on installs whereghlives outside the default PATH (e.g. Homebrew at/opt/homebrew/bin): clone now inherits your shell environment instead of replacing it, so theghcredential helper can locateghand its config.
0.12.0-beta.2
Patch Changes
- The MCP
exectool now runs commands in the explicitcwdyou pass, even when it points at a subdirectory of an OK project. Previously the resolver walkedcwdup to the enclosing.ok/config.ymland ran bash from the project root, so a subdir-relative command likecat notes.md(cwd<project>/subdir) failed with a spurious "No such file or directory" andstructuredContent.cwdreported 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.cwdreports 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
okcommand on your PATH automatically — politely. Launching the packaged app installs silent terminal shims (~/.ok/bin/okand~/.ok/bin/open-knowledgesymlinks into the app bundle, a~/.ok/env.shPATH shim, and a clearly marked managed block in your shell rc files —.zshrc, plus.bash_profileand fish config where present) with no admin prompt. Any user who has run Desktop at least once can typeokin 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/binshims themselves still self-heal on every startup, andOK_RECLAIM_DISABLE=1disables the whole mechanism.Unlike the earlier incarnation of this feature, Desktop no longer seeds
oksymlinks 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/binadmin-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_RErejected fence lines with trailing whitespace while the bridge tolerance layer (normalizeBridgestep 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.
normalizeBridgegained aparagraph-continuation-indenttolerance 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_urlnow 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_AUTOSTARTgate, 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 ofrunning: 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 startwhen nothing is running (previously the hint saidok ui, which produces a backend-less UI shell in that state) andok uiwhen 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-editoris a CSS grid with implicit auto rows, and the defaultalign-content: stretchdistributes leftover block-size equally across in-flow auto tracks; any zero-height direct child still generates a stretchable track. The layer now carriesgrid-row: 1; align-self: start, and.tiptap-editor-portal-contentdeclaresgrid-row: 1explicitly 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
warningschannel. Thewrite/editMCP tools (and the underlyingPOST /api/agent-write-md/POST /api/agent-patchroutes) validate every```mermaidfence of the post-write document with the same mermaid version the editor renders with, and report parse failures aswarningsentries (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
warningsarray 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-valuedwarningfield and the MCPstructuredContent.document.contentDivergencenesting are deprecated —warningkeeps emitting its highest-precedence integrity entry in parallel for one deprecation window; new consumers should readwarnings.The
palettetool'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).