') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); fix(ui): stop leaking the raw absolute MEMORY.md path in settings by jackwener · Pull Request #442 · apache/maka · GitHub
Skip to content

fix(ui): stop leaking the raw absolute MEMORY.md path in settings - #442

Merged
jackwener merged 1 commit into
mainfrom
ui/memory-path-display
Jul 2, 2026
Merged

fix(ui): stop leaking the raw absolute MEMORY.md path in settings#442
jackwener merged 1 commit into
mainfrom
ui/memory-path-display

Conversation

@jackwener

Copy link
Copy Markdown
Member

Round 5 of the fixture-screenshot visual audit (follow-up to #436/#438/#439/#440).

The 记忆 settings meta row rendered the full absolute path (/private/var/folders/…/MEMORY.md) as a full-width mono line:

  • the sibling status words (上一版备份 / 草稿已保存 / N 条生效) got shoved into a cramped vertical stack
  • a raw absolute path leaked into the renderer — against the UI quality plan §3.6 ("No absolute path in renderer")

Fix (display layer only):

  • displayMemoryPath() shows the meaningful trailing …/<workspace>/memory/MEMORY.md segments
  • title= keeps the full path on hover; the copy-path action still copies the real path
  • meta row wraps; nowrap/ellipsis safety net on the path span

Contract kept: 等待创建 MEMORY.md stays inline in MemorySettingsPage (local-memory-ui-contract).

Verification

  • before/after settings-memory fixture screenshots (zoomed crops)
  • npm --workspace @maka/desktop test: 1671/1671 pass

The memory settings meta row rendered the full absolute path
(/private/var/folders/…/MEMORY.md) as a full-width mono line, which
shoved the sibling status words (上一版备份 / 草稿已保存 / N 条生效)
into a cramped vertical stack — and leaked a raw absolute path into
the renderer against the UI quality plan (§3.6).
Display layer only: displayMemoryPath() shows the meaningful trailing
…/<workspace>/memory/MEMORY.md segments, title= keeps the full path on
hover, and the copy-path action still copies the real path. The meta
row wraps so status words sit on their own line, with a nowrap/ellipsis
safety net on the path span.
Contract kept: 等待创建 MEMORY.md stays inline in MemorySettingsPage
(local-memory-ui-contract). Desktop suite green (1671).
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener