View changes

Added

  • Cerveau Viewer — read-only brain browser powered by cerveau.dev. Reads ~/.cerveau/ directory structure: brains, protocol rules, package registry, and brain files. Enabled via --cerveau-dir / MDPLANNER_CERVEAU_DIR (defaults to ~/.cerveau).

  • Local Dev tab — renders local-dev.md with markdown preview.

  • Markdown preview toggle.md files in the file browser can be toggled between raw source and rendered preview.

  • Marketplace browser — search/filter packages by name, type, or tags. Shows per-brain installation status badges.

  • Recursive file tree — pre-loads the full directory tree in one call for instant expand/collapse with symlink indicators.

Changed

  • Docker Compose — replaced MDPLANNER_BRAINS_CONFIG and MDPLANNER_CLAUDE_DIR env vars with MDPLANNER_CERVEAU_DIR.

View changes

Removed

  • Brain Manager UI — removed the built-in Brain Manager feature (backend routes, frontend module, CSS, CLI flags --brains-config and --claude-dir, env vars MDPLANNER_BRAINS_CONFIG and MDPLANNER_CLAUDE_DIR). Brain management is now handled externally via cerveau.dev.

View changes

Fixed

  • CSS !important removed — removed all !important declarations from task.css (.drop-zone-active, .batch-selected), replaced with higher-specificity selectors.

  • Inline style="display:none" removed — replaced 10 instances in index.html with class="hidden".

  • JS style.display toggling replaced — converted ~42 style.display toggles to classList.add/remove("hidden") across 11 JS modules. Added :not(.hidden) CSS rules for elements requiring display: flex when visible.

  • Inline styles extracted to CSS — moved hardcoded layout, color, and spacing styles from index.html and JS modules into CSS classes: color swatches use [data-color] selectors, modals use --sm/--md/--lg size modifiers, sidenav meta rows use .sidenav-meta-row, form grids use .form-grid-2col, board.js drop zones use .drop-zone classes, milestones card view uses .milestones-card classes.

View changes

Fixed

  • Desktop nav bar missing — v0.33.0 added !important to .hidden utility which broke hidden lg:flex responsive patterns, hiding the entire desktop header. Reverted !important and fixed the three conflicting elements (batch action bar, Eisenhower grid, MoSCoW grid) with :not(.hidden) selectors so display: flex/grid only applies when the element is visible.

View changes

Added

  • serverVersion in context packget_context_pack now returns serverVersion: string populated from the VERSION constant. Agents compare it against the codebase version file at boot without a separate GET /api/version HTTP call.

Fixed

  • Toast colors — success toasts (comment added, task updated, etc.) were showing red because showToast accepted only booleans but callers passed "success" or "error" strings (both truthy). Function now accepts both boolean and string forms.

  • .hidden vs display conflicts — batch action bar, Eisenhower grid, and MoSCoW grid CSS rules set display: flex/grid unconditionally, overriding the .hidden utility class. Fixed with :not(.hidden) selectors so display only applies when the element is visible. No !important needed.

  • Section jump bar — moved out of the filter header div so position: sticky takes effect while scrolling a long task list.

  • Hide completed tasks — toggling the “Incomplete” filter or enabling “hide completed after 0 days” now removes the completed task row from the DOM immediately via updateInView, not only on the next full re-render.

  • Task list scroll jump — list container minHeight is pinned to current height before clearing innerHTML, preventing layout collapse during re-renders. Scroll position is restored atomically in the same requestAnimationFrame.

  • Note click-to-edit — single click on note content no longer enters edit mode. Edit now requires a double-click or the explicit Edit button.

  • Toast notifications — error toasts now use amber/warning color instead of red (less alarming for non-fatal errors). Success toasts show a green checkmark prefix; error toasts show an amber warning prefix. Slide-in easing switched to cubic-bezier(0.16,1,0.3,1) for a snappier feel. Rapid successive toasts update the existing element in-place instead of remove+recreate, eliminating flicker during batch operations. Error duration corrected to 5 s (was 4.5 s).

  • Portfolio scroll from global search — clicking a portfolio item in the global search (Cmd+K) now scrolls to that project after the portfolio view loads. Previously the scroll was never attempted because portfolioView.load() is async and the view had not rendered by the time any timeout fired. _pendingScrollId is set on the portfolio view before switchView so render() scrolls to the target element as soon as it is in the DOM.

  • C4 diagram drilldown — context, container, and component level boxes are now always clickable to drill down into. Previously, a component with no children yet would silently ignore clicks because canBeDrilledDown returned false, making it impossible to add children through the UI. Now only code level components (the leaf level) are non-drillable.

  • Milestone filter and batch edit dropdowns — both the list view filter dropdown and the batch edit panel milestone select were always empty. They read from projectConfig.milestones which does not exist in the config type. Switched to this.tm.milestones (the array loaded from the milestones API at startup).

  • Batch mode click interference — parent task rows had draggable="true" which could intercept clicks intended for batch selection. Entering batch mode now disables dragging on all task rows; exiting restores the original state.

View changes

Added

  • get_notes_batch MCP tool — fetch multiple notes by ID in one call using Promise.all. Replaces N sequential get_note round-trips after get_context_pack returns note stubs. Returns { notes, notFound }.

  • MCP Prompts — 5 slash commands surfaced in Claude Code: /session-start, /end-session, /daily, /approve, /next. /daily and /next fetch live task data at render time.

  • relevantFiles field on inProgress task stubs in get_context_pack. Populated from config.files (explicit) and metadata.files_changed in task comment history (written by git hooks). Agent opens the right files immediately on session resume.

  • files field on TaskConfig — set via update_task or batch_update_tasks to record relevant source file paths.

Changed

  • create_task now returns the full task object instead of { id }.

  • update_task now returns the full task object instead of { success: true }. Both changes save one get_task round-trip per create/update call.

View changes

Added

  • Approval gates — structured human-in-the-loop workflow for task sign-off. Agents call POST /tasks/:id/request-approval instead of moving tasks to Done. Tasks enter a new “Pending Review” section. Humans approve or reject with structured feedback (rejection_type enum so agents can route without parsing prose).

  • POST /tasks/:id/approve and POST /tasks/:id/reject — human review endpoints. Approve moves to Done; reject returns to In Progress reassigned to the original agent.

  • 4 new MCP tools: request_approval, approve_task, reject_task, list_pending_approvals. Total MCP tool count: 244.

  • Approval panel in task sidenav — renders agent summary, commit hash, artifact links, and verdict badge (approved/rejected). Approve/Reject buttons for humans when task is in Pending Review.

  • “Pending Review” board column inserts automatically between In Progress and Done when the first task enters it — no manual setup required.

  • Scalar API reference UI at GET /api/reference — interactive docs backed by the auto-generated OpenAPI 3.1 spec. No authentication required.

View changes

Added

  • Auto-generated OpenAPI 3.1 specification served at GET /api/doc — always in sync with code, no manual maintenance required.

  • All 289 API operations across 169 paths documented with request/response schemas, tags, summaries, and operationIds.

  • Consistent 400 validation error responses via defaultHook on the root router.