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.mdwith markdown preview.Markdown preview toggle —
.mdfiles 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_CONFIGandMDPLANNER_CLAUDE_DIRenv vars withMDPLANNER_CERVEAU_DIR.
Removed
Brain Manager UI — removed the built-in Brain Manager feature (backend routes, frontend module, CSS, CLI flags
--brains-configand--claude-dir, env varsMDPLANNER_BRAINS_CONFIGandMDPLANNER_CLAUDE_DIR). Brain management is now handled externally via cerveau.dev.
Fixed
CSS !important removed — removed all
!importantdeclarations fromtask.css(.drop-zone-active,.batch-selected), replaced with higher-specificity selectors.Inline
style="display:none"removed — replaced 10 instances inindex.htmlwithclass="hidden".JS
style.displaytoggling replaced — converted ~42style.displaytoggles toclassList.add/remove("hidden")across 11 JS modules. Added:not(.hidden)CSS rules for elements requiringdisplay: flexwhen visible.Inline styles extracted to CSS — moved hardcoded layout, color, and spacing styles from
index.htmland JS modules into CSS classes: color swatches use[data-color]selectors, modals use--sm/--md/--lgsize modifiers, sidenav meta rows use.sidenav-meta-row, form grids use.form-grid-2col, board.js drop zones use.drop-zoneclasses, milestones card view uses.milestones-cardclasses.
Fixed
Desktop nav bar missing — v0.33.0 added
!importantto.hiddenutility which brokehidden lg:flexresponsive patterns, hiding the entire desktop header. Reverted!importantand fixed the three conflicting elements (batch action bar, Eisenhower grid, MoSCoW grid) with:not(.hidden)selectors sodisplay: flex/gridonly applies when the element is visible.
Added
serverVersionin context pack —get_context_packnow returnsserverVersion: stringpopulated from theVERSIONconstant. Agents compare it against the codebase version file at boot without a separateGET /api/versionHTTP call.
Fixed
Toast colors — success toasts (comment added, task updated, etc.) were showing red because
showToastaccepted only booleans but callers passed"success"or"error"strings (both truthy). Function now accepts both boolean and string forms..hiddenvsdisplayconflicts — batch action bar, Eisenhower grid, and MoSCoW grid CSS rules setdisplay: flex/gridunconditionally, overriding the.hiddenutility class. Fixed with:not(.hidden)selectors sodisplayonly applies when the element is visible. No!importantneeded.Section jump bar — moved out of the filter header div so
position: stickytakes 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
minHeightis pinned to current height before clearinginnerHTML, preventing layout collapse during re-renders. Scroll position is restored atomically in the samerequestAnimationFrame.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._pendingScrollIdis set on the portfolio view beforeswitchViewsorender()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
canBeDrilledDownreturned false, making it impossible to add children through the UI. Now onlycodelevel 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.milestoneswhich does not exist in the config type. Switched tothis.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.
Added
get_notes_batchMCP tool — fetch multiple notes by ID in one call usingPromise.all. Replaces N sequentialget_noteround-trips afterget_context_packreturns note stubs. Returns{ notes, notFound }.MCP Prompts — 5 slash commands surfaced in Claude Code:
/session-start,/end-session,/daily,/approve,/next./dailyand/nextfetch live task data at render time.relevantFilesfield oninProgresstask stubs inget_context_pack. Populated fromconfig.files(explicit) andmetadata.files_changedin task comment history (written by git hooks). Agent opens the right files immediately on session resume.filesfield onTaskConfig— set viaupdate_taskorbatch_update_tasksto record relevant source file paths.
Changed
create_tasknow returns the full task object instead of{ id }.update_tasknow returns the full task object instead of{ success: true }. Both changes save oneget_taskround-trip per create/update call.
Added
Approval gates — structured human-in-the-loop workflow for task sign-off. Agents call
POST /tasks/:id/request-approvalinstead of moving tasks to Done. Tasks enter a new “Pending Review” section. Humans approve or reject with structured feedback (rejection_typeenum so agents can route without parsing prose).POST /tasks/:id/approveandPOST /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.
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
defaultHookon the root router.