Skip to content

Releases: drbinsaad/knowledge-base-command-center

Knowledge Base Command Center 0.18.0

Choose a tag to compare

@github-actions github-actions released this 15 Aug 07:56
e58fcc7

Added

  • Added the Global Note Organizer, a three-step Notes → Destinations → Review workflow for organizing one or many existing Markdown notes across one or many KBCC knowledge bases. Shared destinations can be overridden or skipped per note; each targeted base keeps one primary Index or Library placement while Collections remain additive. Untargeted knowledge bases and memberships are preserved.
  • Added vault-tree selection, one-time folder snapshots, File Explorer and editor context-menu actions for single notes, multi-selections, and folders, plus a progressive text-path drop target on the Command Center's Organize button. Folder snapshots include only current eligible Markdown descendants and never become linked-folder rules; unsupported drops fall back to the vault browser or context menu.
  • Added an active-note organization indicator and read-only all-base membership detail. Its icon, label, tooltip, and accessible name distinguish current-base organization, Collection-only organization, other-base organization, ordinary unorganized state, and broken persisted references; red is reserved for broken state and color is never the only signal.

Safety

  • The organizer changes KBCC plugin organization only: it never moves, renames, creates, deletes, or rewrites a Markdown file and never changes linked-folder rules. Here knowledge base means an independent KBCC knowledge base, not an Obsidian .base file.
  • Apply is available only after an exact before/after review and revalidates the selected file identities, destination state, and Sync generation. A stale review aborts before any partial organization change. Every affected base receives durable per-base Undo; the newest organizer batch also has in-session Note organizer: Undo last multi-base change and Redo last multi-base change commands.
  • Kept required Undo protection and user-invoked Undo/Redo restart-durable with bounded version-4 device-local journals. Multi-base portfolio import stages every destination's required Undo together in one causally verified batch; the Global Note Organizer now stages every affected base through the same multi-base mechanism. If the Organizer's exact aggregate required-Undo snapshots cannot fit within the shared 4 MiB device-local budget, Apply fails closed before any primary plugin-store mutation.
  • One Organizer review accepts at most 5,000 selected Markdown notes and 20,000 effective note/base directives. Its optional drop parser rejects every vault-qualified obsidian://open URI, including one that names the current vault; use an unqualified vault-relative path, a public context-menu action, or the Organizer's vault tree instead.
  • Added a bounded, vault-scoped App-local rename-recovery journal so an interrupted Markdown rename can resume its KBCC path repair after restart. It may temporarily contain the vault identity and old/new vault-relative paths; Clear device-local data removes it together with the route/history and update-announcement records.
  • ENT destinations retain protected eligibility, source-kind Library constraints, and canonical clinical Index grouping unless the existing profile setting explicitly permits visual cross-domain movement. The organizer rejects an incompatible clinical placement during preparation rather than weakening the preset.

Verification

  • The release candidate adds the maximum 5,000-note × four-base Organizer performance budget and Organizer real-Chromium layout variants to the existing automated gates. Real Obsidian 1.13.7 on macOS was also exercised with mobile emulation at 400 × 1267 portrait and 1267 × 400 landscape; a landscape footer defect found there was fixed and retested.
  • The physical-iPhone, Dynamic Type, and VoiceOver matrix was not executed. After that remaining gap was explicitly reported, the maintainer authorized release with the physical-device scope waived and unverified; this release does not claim a physical-device Pass, and the Mac emulation is supplemental evidence rather than a substitute.

Knowledge Base Command Center 0.17.0

Choose a tag to compare

@github-actions github-actions released this 14 Aug 18:18
fb71f0b

Added

  • Added Why this appears to Index row menus and record inspectors. The read-only explanation names every applicable authority independently—direct membership, each linked folder, protected ENT source, imported placeholder, exclusion, Library placement, Collections, pin/Next state—and displays a Markdown path only as storage location, never as an implied membership rule.
  • Added Manage index → Why included, a base-wide summary that separates direct memberships, linked folders, protected sources, imported placeholders, hidden overrides, and location-only creation/storage folders. Inherited pre-v15 folder links can be opened in the existing review flow from the same surface.
  • Added Imported placeholders needing notes as the first Smart Queue, plus Open imported placeholder queue and Resolve next imported placeholder… commands. Exact normalized title or configured-ID candidates are found across every eligible Markdown note in the vault, including unindexed notes and notes outside the active base's folder rules; the plugin never selects or links a candidate automatically and identifies any existing portable owners before confirmation.
  • Added a same-engine predicted outcome to single-base portable import: new subjects, existing identity matches, incoming subjects still awaiting notes, complete before/after placeholder counts, placement totals, and the number of unresolved placeholders with at least one exact local candidate—not the raw number of matching notes. An import predicted to leave 100 or more selected subjects unresolved needs an additional acknowledgement.
  • Added an import-completion handoff with the resulting unresolved count, Open placeholder queue, and immediate Undo import actions.

Changed

  • Reorganized Generic settings into three explicit concepts: Index membership, Note storage and creation, and Portable blueprint and link progress. Folder location no longer reads like automatic enrollment authority.
  • Separated membership explanation, placeholder-queue construction, and portable-import simulation into independently tested runtime seams. Runtime tests are now discovered automatically, with enforced source coverage, large-vault performance, real-Chromium layout variants, bundle-size, dependency-audit, tag-ancestry, and release-checksum gates.
  • Improved read-only behavior, keyboard/focus semantics, screen-reader context, bidirectional text, theme compatibility, and compact/desktop control reachability across the affected Index and import surfaces.

Fixed

  • Prevented long Index metadata, membership badges, placeholder status, and row actions from colliding or rendering duplicate No linked note text at desktop, narrow-pane, enlarged-text, and right-to-left widths.
  • Made data.json.bak hold known-good previous committed authority before the primary write. A failed prerequisite backup or Sync fence performs no primary or compensating write and remains retryable; after a successful primary commit, backup advancement is best effort and may temporarily leave the backup one commit behind.
  • Made required Undo protection and user-invoked Undo/Redo restart-durable with bounded version-4 device-local journals. Required operations stage the exact prior snapshot; Undo and Redo stage their exact pre-transition stacks plus the inverse snapshot needed to reconstruct the new stacks. Multi-base portfolio import stages every destination's required Undo together in one causally verified batch. Startup applies a staged result only when each committed semantic revision, head, and payload fingerprint matches; otherwise it preserves the exact pre-transaction history independently for each base. The operation fails closed before the primary write when that guarantee cannot fit within 4 MiB, including repair, restore, bulk removal, single-base or portfolio import, Undo, and Redo paths.
  • Kept a previously linked portable subject in the placeholder queue when its Markdown file is temporarily missing while retaining the prior path binding, so the same path can resolve automatically when Sync delivers it again.
  • Rejected a combined Workspace-settings and subject-catalog import when the incoming Workspace fields would change record projection. Single-base and multi-base portfolio review both direct users to import Workspace settings alone, let the vault refresh, then reopen the center and import Index, Libraries, Collections, or Study state; harmless combined imports whose projection fields are unchanged remain allowed.
  • Kept portable subject identities stable across portfolio construction and later serialization instead of regenerating an identity after the bundle was prepared.
  • Treated a successful Markdown-file create as the commit boundary: a later view-refresh failure now reports the exact created path instead of falsely presenting the whole create as failed and inviting a duplicate retry.

Verification

  • The release candidate is gated by TypeScript, zero-warning ESLint and JSON validation, automatically discovered runtime tests with coverage floors, a 500,000-record performance budget, seven real-Chromium row-layout variants, production build and bundle budget, Obsidian Community static verification, high-severity dependency audit, release metadata checks, tag ancestry, and SHA-256 release checksums.
  • The physical-iPhone matrix was not executed. The maintainer explicitly authorized release with that scope waived and unverified; this release does not claim a physical-device Pass.

Knowledge Base Command Center 0.16.1

Choose a tag to compare

@github-actions github-actions released this 14 Aug 15:19
fa64f98

Added

  • Upgraded Generic bases with a preserved legacy-primary-folder source now show a persistent review warning in the Command Center and Settings. Once per active knowledge base in each Obsidian App session, the plugin offers the source-only Markdown notes currently available on the device for review: preserve any selected notes as durable direct members and unlink the folder in one Undo-protected transaction, intentionally Keep linked, or choose Not now without changing anything. Unlink requires an explicit confirmation that Obsidian Sync and the local folder contents are complete; a missing non-root folder blocks Apply instead of being mistaken for an empty source. The review never edits, moves, renames, or deletes Markdown.
  • Index rows now explain their membership provenance with Direct, Linked folder, Imported placeholder, or Protected source labels, including compact and screen-reader equivalents.

Fixed

  • Legacy-folder review revalidates the exact source, folder availability, candidate list, metadata, vault paths, active base, Sync generation, and read-only state before commit. A stale or not-yet-synced review aborts without partial plugin-data changes, and unlinking does not accidentally unhide a separately direct member.

Knowledge Base Command Center 0.16.0

Choose a tag to compare

@github-actions github-actions released this 14 Aug 12:32

Changed

  • Generic Index membership is now explicit. A new base starts with no folder-authoritative Index source: the default new-note folder controls storage only, and neither it nor an Inbox, template, attachment, export, or per-Library creation folder enrolls notes merely because they are stored there.
  • Add existing note to Index, the current-note action, and explicit Index creation persist direct membership for the exact note. That intent remains distinct even when the note also sits below a linked folder, so unlinking the folder cannot silently remove a note the user added directly.
  • Folder-derived membership now exists only through a named linked-folder rule that the user deliberately creates and can remove. Hiding a matched note records a plugin-owned exclusion. Unlinking a rule changes membership only; it never moves, deletes, renames, or rewrites Markdown.
  • Generic bases loaded from pre-v15 data convert the former primaryFolder behavior into one deterministic, removable legacy-primary-folder source. This preserves the pre-upgrade result set without keeping a storage setting authoritative. Historical snapshots and private same-vault recovery retain the source provenance.
  • Generic grouping, nesting, Libraries, Collections, pins, queues, and membership remain plugin-data operations only. Obsidian .base files remain a separate read-only query-view integration and never become Command Center knowledge bases or membership rules.

Fixed

  • Startup and recovery now preserve the exact corrupt data.json bytes and compare them again at the queued write boundary. A readable replacement arriving through Sync wins over an older backup; any changed primary cancels restoration into protected read-only mode; primitive or array-shaped plugin data fails closed instead of being replaced with defaults; and both primary-save paths recheck Sync generation after their awaited backup write.
  • Membership provenance is now enforced through version-15 synced data, version-11 recovery, and version-3 device-local Undo/Redo history. Pre-version-15 folder scope—including the legacy vault-root case—and older recovery/history are converted conservatively; portable indexed flags are migrated where needed but no longer act as a third Generic membership authority; and vault-root grouping retains the original top-level-folder behavior.
  • Workspace and portfolio imports now reject restricted exportsFolder paths, and the final JSON write boundary validates the configured folder again before creating any directory or recovery/conflict file.
  • ENT proposal-promotion and canonical-placement rollback now compares the exact same TFile content against the operation's last known write. If Sync or an editor changed that file, rollback preserves both the newer content and its current path and reports explicit recovery guidance instead of overwriting the concurrent edit.
  • Repair safe issues now carries the exact reviewed preview through confirmation and rechecks it at the transaction boundary. Repair, bulk Index removal, and restore refuse to start unless every planned plugin-data change can be recorded for Undo.
  • Manage index tabs now expose their tab/panel relationships and support arrow, Home, and End keys. Folder Browse in Settings now commits correctly when Settings is open in an Obsidian pop-out window.
  • Cold cross-base search now reads metadata only for paths eligible for at least one Generic base; view-only saves no longer clone and serialize the full semantic graph three times; and inactive Manage index note lists stay lazy while large heading and diagnostic lists render in explicit 300-row pages.
  • Late layout readiness can no longer attach listeners to an unloaded plugin instance. Attachment commands handle case-variant .MD extensions consistently, modal focus stays in its owning pop-out window, and the custom Obsidian Bases view follows the configured note-opening behavior.

Older numbered release entries below describe the behavior of those published versions. References there to an “indexed folder” or “automatic folder scope” are historical and do not describe the 0.16.0 explicit-membership contract above.

Knowledge Base Command Center 0.15.0

Choose a tag to compare

@github-actions github-actions released this 14 Aug 07:21
078a883

Added

  • The Exports folder is now a setting. JSON backups, portable exports on mobile, and sync-conflict rescues previously always went to a fixed top-level Knowledge Base Command Center Exports folder; that stays the default, but it can now live anywhere — for example KB/Exports. Existing export files are not moved, and like every plugin folder it follows vault renames automatically.
  • The setup wizard gains "Keep everything in one folder": type one parent folder and press Apply, and every plugin folder nests under it — KB/Inbox, KB/Knowledge Base, KB/Templates, KB/Exports — keeping each folder's own name. Every field stays editable afterwards, so it is a starting point, not a constraint. With this, the plugin can run entirely inside a single folder of your vault instead of claiming several top-level folders.

Knowledge Base Command Center 0.14.2

Choose a tag to compare

@github-actions github-actions released this 13 Aug 21:45
223573d

Added

  • Changing the Inbox folder or the Indexed notes folder in Settings now commits on Enter, leaving the field, or Browse — and when the change would make notes stop appearing anywhere in the plugin, it first asks with the real count: "N notes in 'X' will leave the Inbox and no longer appear anywhere in this plugin." Cancelling leaves the setting untouched. Previously the change applied silently, and every note in the old folder vanished from all tabs and search without a word.
  • Importing workspace settings now names any referenced folder that does not exist in this vault — "The imported Inbox folder “X” does not exist in this vault yet, so the Inbox will be empty until it is created or the setting is changed" — instead of silently importing a configuration whose views come up empty. The import itself is unchanged: referencing a not-yet-created folder is legitimate for a fresh vault.
  • The setup wizard hints inline when a typed folder does not exist yet ("it will be created empty, and existing notes will not be indexed until they live inside it") and now requires an Inbox folder, matching the Settings rule.
  • Diagnostics Repair safe issues now distinguishes "this note is gone" from "this note has not synced to this device yet". When registered notes are missing from this device, it lists them (up to 8, then a count) and asks before repairing, because the repair removes their index memberships, collection memberships, and pins — and that removal syncs everywhere. If nothing would be pruned, repair runs immediately with no dialog, exactly as before.
  • A clinical custom-library placeholder now refuses Create empty note / Create from template up front when linking the created note would fail its compatibility checks, showing the exact reason instead of creating a file and then failing to link it. The same rules now live in one place for both the preflight and the real linking step, so they cannot drift apart.

Knowledge Base Command Center 0.14.1

Choose a tag to compare

@github-actions github-actions released this 13 Aug 21:15
99f405a

Fixed

  • A note created through the new Inbox-default form could disappear from the plugin entirely — present in the vault but shown in no tab and found by no search — whenever it ended up outside the folder configured as the Inbox (for example when that setting names a different folder than expected, is empty, or the destination folder was edited in the form). Inbox membership is derived purely from the note living inside the configured Inbox folder, and a note outside it, outside the indexed folder, and not manually indexed belongs to nothing. The form now refuses to create an Inbox-destination note whose folder is not inside the configured Inbox folder and explains exactly what to change; the form's context line names the real folder; and if drift the form cannot see still lands the file elsewhere (a mid-form synced settings change, or a case-insensitive filesystem merging differently-cased folders), the note is added to the Index with an explanatory notice instead of vanishing.
  • If you already created a note that vanished this way, the file is intact in your vault: either move it into the folder your Inbox setting names, or use Add existing note to index it.
  • A follow-up audit of every create-and-file flow closed the same trap everywhere it existed, not just in the new form. The Inbox tab's own empty-state Create note button now opens the guarded form instead of the legacy one that bypassed the folder check. In the clinical profile, the plain Create note from template or empty note command previously seeded the ENT default note folder 01 Inbox — which no clinical view ever shows (the clinical Inbox is a subfolder of it) — so every note created that way was invisible from the start; it now starts in the real clinical Inbox and refuses folders no clinical view would show. If filing fails after the file exists — the chosen collection or library vanished through Sync while the form was open, or the knowledge base switched mid-save — the note is registered in the Index (generic profile) or its exact path is named in the message, so a created note can never again silently belong to nothing.
  • Adding or moving a note into a collection whose heading was deleted in the meantime no longer reports success while doing nothing — and a move whose target vanished keeps the note where it was instead of removing it from its source. Settings now refuses an empty Inbox folder, which would have made Inbox capture impossible.

Knowledge Base Command Center 0.14.0

Choose a tag to compare

@github-actions github-actions released this 13 Aug 13:50
7d4fb57

Added

  • Creating a note now opens one unified form that files into the Inbox by default — type a title, press Create, done. A new Destination row at the top of the form shows where the note will go, and Change… re-targets the same form at the Index (choose a visual group), a Collection heading or subheading (chosen by full path, with a prompt to create the first heading when none exist), or any Library (choosing its heading or subheading first, exactly as before). Switching the destination re-seeds the folder, content mode, and template with that destination's own defaults, and every field stays editable for a one-note exception. Collections join note creation for the first time — previously a note could only be added to a Collection after it existed.
  • If a synced change removes the chosen Collection or Library while the form is open, the note is still created and a notice explains it was left unfiled, rather than placing it under the wrong heading or failing after the file already exists.

Changed

  • Quick entry: Create note…, Add → Create note, Create note from template or empty note…, and the obsidian://kbcc-create-note URL all open the unified form directly in the generic profile; none of them ask for a destination up front anymore. The ENT clinical profile is unchanged: its protected proposal workflow and native-library restrictions are untouched.
  • The separate Create in Inbox entry was removed from the Add menu because Create note now defaults to the Inbox. The empty-Index call to action still creates directly into the Index, where filing into the Inbox would look like nothing happened.

Fixed

  • Pasting very long text into a settings field or importing a workspace configuration containing one could persist a value the loader refuses, making the entire multi-base store open read-only on the next launch — on every synced device. Every writer now clamps user-editable text to the same 10,000-character bound the loader enforces, applied once more immediately before each save so no entry path can slip past it.
  • Restored the plugin's older-web-view compatibility a second time. The bundle called the platform's structuredClone in 84 places; that API needs Chrome 98 / iOS 15.4, above the floor release 0.13.1 deliberately restored, and one call ran while the plugin class was still being constructed — so on an older Android web view the plugin failed to load at all. All call sites now use an in-house ES2018 clone helper, and the community verification script fails the build if structuredClone reappears in either the source or the bundle, closing the enforcement gap that let a DOM-declared global bypass the pinned compiler baseline.
  • Every ordering that reaches persisted bytes or decides a cross-device tiebreak now compares strings by code units instead of locale collation. Two devices with different system locales could order the same tied library names, group titles, or provisional vault identities differently, which changed semantic fingerprints, reset sync ancestry, or made each device prefer its own copy indefinitely. Display-only sorts keep natural locale collation.
  • A rejected write during the one-time startup migration or repair no longer aborts plugin loading. Previously the plugin was left enabled but with no view, no commands, and no settings tab — so the recovery guidance in its own warning was unreachable. It now degrades to the designed read-only state with the warning visible and the Sync & Recovery Center available.
  • After a synced change was merged, the automatic view refresh ran while the reload guard was still armed, so the refresh's own bookkeeping saves were rejected and the open Command Center kept showing the pre-merge tree with an alarming notice. The guard now lowers once the merge is committed, immediately before the refresh, and re-arms for any change that arrives mid-refresh.
  • The Manage index Diagnostics tab recomputes after membership and group changes made inside the modal instead of serving the list and count captured when the tab was first opened.
  • Editing an extension topic's placement can no longer select one of its own descendants as parent, which would have created a hierarchy cycle that detached the branch from every root. The picker filters descendants out and validation refuses them at any depth.
  • Folder fields now refuse the characters note titles already fold away (\ : * ? " < > | # ^ [ ], trailing periods or spaces, and Windows-reserved names), which previously broke the wikilinks Obsidian builds from the full path.
  • Portable exports order subjects with a consistent comparator; a subject with no parent previously compared inconsistently against its neighbors, so the exported order could depend on input order and JavaScript engine.
  • Removed the unreachable legacy workspace import/export path inside Manage index (about 150 lines); the Export/Import center owns that flow and validates strictly more.
  • The documentation no longer tells mixed-device fleets to install "0.12.x", which can no longer edit the current store format; upgrade guidance is now version-neutral, the troubleshooting cross-link points at the section that actually exists, and the What's new window description matches the real trigger rule.

Knowledge Base Command Center 0.13.3

Choose a tag to compare

@github-actions github-actions released this 13 Aug 07:29
e166159

Maintenance release. Nothing changes in how the plugin behaves; every message, command, and stored format is exactly as in 0.13.2.

Changed

  • Consolidated error-message handling. The same expression that turns a failure into readable text was written out in about fifty places, so improving one message meant editing all of them. It now lives in one helper. Every message you can see is byte-for-byte unchanged, including the five places that show a specific sentence rather than the raw failure text — that was verified by comparing every text literal in the source before and after.
  • Documented moving a subheading itself on touch devices in the user guide, the troubleshooting notes, and the manual iPhone checklist. The feature shipped in 0.13.2, but the documentation still described moving records only, which is what made it look absent on iPhone in the first place.
  • Updated the author contact on the project page.

Knowledge Base Command Center 0.13.2

Choose a tag to compare

@github-actions github-actions released this 13 Aug 05:13
13f686e

Fixed

  • Restored the ability to rearrange nested subheadings on iPhone, iPad, and other touch devices. Nesting arrived in 0.13.0, but touch devices use labelled row action menus instead of drag-and-drop, and the subheading menu only ever offered moves between siblings — so a subheading could be created inside another one but never moved into or out of one without a desktop. Both the Collection and Library subheading menus now offer Move under…, which lists every valid destination by its full path together with an explicit top-level entry, and Outdent one level for the common case. Both actions also appear on desktop, where a precise menu move is often easier than a drag.
  • A subheading move carries its notes and every nested subheading with it, in order. A destination is offered only when it is neither the subheading itself nor anything already inside it, and only when the moved branch still fits the five-level limit — so a tall branch is correctly refused a destination that a single subheading is offered. If a synced change replaces the layout while the destination list is open, the move is refused rather than applied to the wrong place, and if nothing qualifies the plugin explains why instead of showing an empty list.