v0.7.0: AI agent reliability, LSP/DAP parity, GUI performance#22
Open
cuttlefisch wants to merge 34 commits intomainfrom
Open
v0.7.0: AI agent reliability, LSP/DAP parity, GUI performance#22cuttlefisch wants to merge 34 commits intomainfrom
cuttlefisch wants to merge 34 commits intomainfrom
Conversation
Round 1 — M1: Scheme Primitive Docs + Getting Started Tutorial - install_scheme_nodes(): 45 scheme:fn-name nodes + 18 scheme:*var* nodes for all registered Scheme API functions and variables - Progressive getting-started tutorial with three tracks: - Vim track (2 nodes): what carries over, what's different - Beginner track (3 nodes): modal editing, movement, editing - Shared convergence (2 nodes): MAE navigation, extending MAE - AI track (3 nodes): setup, agent, chat - tutorial:getting-started hub links all three tracks - :tutor now opens tutorial:getting-started (was tutor:index) - Index updated with tutorial:getting-started + concept:ai-modes links - 8 new tests for scheme nodes, tutorial tracks, shared links Round 2 — Bugfixes - Org internal link jump: follow_link_at_cursor() now searches buffer for matching heading (was TODO stub at syntax_ops.rs:856) - reload-config: dispatch handler reads config.toml, parses TOML table, applies [editor] section options via set_option() - AI keybinding UX: clearer naming convention - SPC a a = "AI Agent (terminal)", SPC a p = "AI Chat (built-in)" - ai-chat registered as command alias for ai-prompt - concept:ai-modes KB node explaining when to use each - Splash screen updated with distinct descriptions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…key docs (2,264 tests) Round 3 — M2: Contextual Help - :help fuzzy completion: expanded namespace fallback from 3 to 8 candidates (topic, cmd:, concept:, scheme:, option:, lesson:, tutorial:, category:) - :help Tab completion: now completes from all KB node IDs + bare names (e.g. "buffer-insert" finds "scheme:buffer-insert") - WhichKeyEntry.doc field: optional command doc string populated from CommandRegistry during which_key_entries(), shown in popup - 4 new tests: namespace fallback for scheme/option nodes, which-key doc populated, groups have no doc Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…65 tests) Round 4 — M3: User Help Nodes - install_user_help_nodes(): scans ~/.config/mae/help/ for .org files and ingests them via ingest_org_dir() during seed_kb() - User nodes appear in :help lookup and HelpSearch palette - :help-edit <topic> command: opens/creates ~/.config/mae/help/<topic>.org with an org template (:ID: + #+title:) - 1 new test: help-edit command registered Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Round 5 — Module Prep: Layered Init + Hooks
- load_init_files() replaces load_init_file(): loads user init.scm
(~/.config/mae/init.scm) then project-local (.mae/init.scm), with
legacy fallbacks (init.scm, scheme/init.scm in cwd)
- Each layer is independent — errors in one don't block others
- Deduplication via canonicalize to avoid double-loading
- after-load hook: fires as "after-load:{filename}" after each layer
loads successfully, enabling packages to run setup after specific files
- 4 new tests: after-load hook validity, layered init loads, zero-file return
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nfiguration MCP tool (2,276 tests) Round 6: Configuration Health + Debug Init + AI Config Audit - --debug-init CLI flag: verbose init file loading with error collection - :describe-configuration command: health report buffer (AI/LSP/DAP/init status) - audit_configuration MCP tool: structured JSON for AI-driven config audits - --check-config --report: print config health report to stdout for CI - CLAUDE.md refresh: Phase 7 status, test counts, completed milestones Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…height scroll_output_to_bottom() was using editor.viewport_height (the focused input pane's height, ~5 rows) instead of the output window's actual height (~35 rows), causing the AI response to be scrolled out of view. Fix: add last_layout_area to Editor (set on resize events + startup, zero per-frame cost), use it to compute the output window's real height from the layout tree. Falls back to viewport_height if layout is unavailable. Includes tracing::debug log for scroll diagnostics and 3 regression tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tection (2,286 tests) DisplayPolicy with 4 actions (ReplaceFocused, AvoidConversation, ReuseOrSplit, Hidden) replaces 12+ bare `focused_window_mut().buffer_idx` assignments that could invade conversation windows. AI help_open now returns content invisibly. - DisplayPolicy struct with per-BufferKind default rules + Scheme overrides - display_buffer() entry point: policy-aware routing with side-window reuse - Migrated help, messages, debug, git, LSP, diagnostics, file-tree, dashboard - AI help_open returns KB content without opening visible buffer - describe-display-policy command (SPC h D), audit_configuration integration - Scheme API: display-buffer-policy, set-display-rule! - KB concept:display-policy node, prompt updates - Tiered prompt system: ModelTier::Full vs Compact with auto-detection - Fix pre-existing Steel test failures: catch_unwind for concurrent workspace tests Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… work (2,299 tests) Part A: Multi-window mouse interaction - Rect::contains() for point-in-rect testing - WindowManager::window_at_cell() for O(n) cell-to-window lookup - Editor::focus_window_at() switches focus to window under cursor - Editor::handle_mouse_scroll_in_window() scrolls without changing focus - GUI click-to-focus: clicks in split windows switch focus before dispatch - GUI scroll-under-mouse: wheel targets window under pointer (mouse_wheel_follow_mouse) - GUI focus-follows-mouse: optional auto-select on hover (mouse_autoselect_window) - GUI drag-across-windows: drag selection extends into adjacent splits - GuiRenderer caches all window FrameLayouts (HashMap<WindowId, FrameLayout>) for pixel-precise clicks in any split, not just the focused one - Two new editor options registered in OptionRegistry + set_option wiring Part B: Idle deferred work - MaeEvent::IdleTick variant (100ms interval from bridge_task) - Editor::idle_work() runs when idle: syntax reparse + swap file writes - last_input_time tracking on keyboard, mouse click, and scroll events Emacs equivalents: mouse-autoselect-window, mouse-wheel-follow-mouse Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…on (2,389 tests)
Display regions with inline image support (natural sizing, SVG font loading),
MiniDialog infrastructure (edit-link command), multi-cursor foundation
(CursorSet, CursorOp, replay_at_secondaries), LSP rename preview buffer,
execute_command MCP tool, per-buffer view state save/restore on switch.
Scroll guard: persistent scroll_locked (cursor-anchored) survives across
frames until a non-scroll command moves the cursor. Bare modifier keys
no longer dirty the GUI frame. Mouse scroll sets scroll_locked.
TUI shift normalization: crossterm_to_keypress now sets shift=false for
Key::Char — shift is already encoded in the character ('G' vs 'g').
Fixes all uppercase bindings (G, J, H, L, M, O, A, I, P) in TUI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…9 tests) scroll_top_skip field on Window enables row-by-row reveal of tall lines (images, headings) instead of jumping the full visual height at once. C-y, C-e, and mouse scroll all use sub-line stepping. GUI layout offsets initial pixel_y by the skip amount; non-sub-line commands reset it. with_clip() on SkiaCanvas constrains buffer rendering to the inner window area so images don't overflow into borders, status line, or command area. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace resvg rasterization pipeline with skia's native SVG DOM renderer. SVGs render directly to the skia canvas as vectors — native text rendering, perfect scaling, and one fewer dependency. CachedImage enum holds both raster (Image) and vector (Dom) variants with ref-counted cloning. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Org interactivity (Phase 9 M1): - Table navigation (Tab/S-Tab), alignment, row/col insert/delete - Agenda view with TODO/deadline scanning, date picker dialog - Heading promotion/demotion, priority cycling, tag editing - Statistics cookies ([/] and [%]) on headings — auto-update when child TODO headings are cycled between TODO/DONE states - Cookie parent-finding now correctly walks past same-level headings - Cookie regexes accept empty initial forms ([/], [%]) - MiniDialog infrastructure for multi-field interactive popups - edit-link command (gl / SPC m l) for markdown and org links - KB: agenda nodes, table concept docs, scheme function docs Large document performance (Phase 8 M9): - Cache detect_code_block_lines() by (buffer_idx, generation) - Binary search for display region overlap (partition_point) - Cow<[DisplayRegion]> for zero-copy regions_with_cursor_reveal() - Arc<Vec<T>> sharing for display_map/display_chars across wrap segments - Content hash clips to visible window for long lines (>500 chars) - fold_end_at() helper for fold lookups - Graceful degradation: >500K chars or >10K char lines sheds markup, code block detection, display regions (Emacs so-long pattern) - Test fixture generators (gen-large-org.sh, gen-long-lines.sh) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…4 tests) Viewport-local syntax highlighting for large files: O(viewport) instead of O(buffer). SyntaxMap extracts a viewport-sized substring from the rope and runs highlighting on that only, offsetting spans to absolute positions. 5 new configurable performance options (OptionRegistry + config.toml [performance] section): large_file_lines, degrade_threshold_chars, degrade_threshold_line_length, display_region_debounce_ms, syntax_reparse_debounce_ms. All hardcoded thresholds replaced. Fixed unguarded O(buffer) operations: statistics cookie backward scan capped to 1000 lines, heading global cycle early-returns for large files. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…(2,475 tests) Multi-window render performance: - Per-window image caching: non-focused windows with unchanged state are blitted from cached skia::Image instead of re-rendering (~100μs vs 90ms) - Cache key: buffer generation, scroll offset, pixel rect - Cache invalidated on theme change, resize, focus switch (Full redraw) - Skip heading scale computation for degraded files Redraw level correctness: - Default keypress → CursorOnly (not Full), each dispatch category explicitly marks Full when needed - Scroll commands call mark_scrolled() for syntax cache fast path - Search commands (n/N/*/nohlsearch) now trigger Full redraw to update highlights in all windows (required for image cache correctness) Frame profiling instrumentation: - total_render_us field tracks actual GPU render time per frame - All BufferKind render branches (Shell, Messages, Debug, FileTree, Visual) now accumulate into draw_time_us - FrameSnapshot includes total_render_us for perf_profile reports - introspect frame section reports total_render_us - perf_profile diagnosis: "render exceeds 16ms frame budget" - Fixed record_frame() zeroing render timing before snapshot capture Paste safety + shell throttle: - paste-after/before/from-yank guard read-only and shell buffers - ShellTick skips generation check when already dirty Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace buf.rope().line(line_idx) (2 O(log n) B-tree walks per visible
line = 104 walks/frame) with chunk_at_byte() (1 walk, or 0 if same chunk
as previous line) + find('\n') string scan on the raw chunk.
Fast path (>99% of lines): line fits in a single ~1-2KB chunk, so we
extract it directly from the &str slice without any additional tree
traversal. Ropey internally caches the last-accessed chunk, so
sequential lines in the same chunk cost 0 additional walks.
Fallback for the rare case of lines spanning chunks still uses
rope.line(). CRLF line endings handled correctly.
Combined with the Round 7 seq_cache (which eliminated line_to_char and
char_to_byte), this reduces total B-tree walks per frame from ~160 to
~1-2 for sequential scrolling.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Auto-scroll to bottom on any PTY input (Emacs term-scroll-to-bottom-on-input) - C-y binding in shell-insert keymap for paste-after - write_paste() wraps text in bracketed paste sequences (\x1b[200~/201~) - Middle-click and pending_shell_inputs use bracketed paste - CLAUDE.md: LSP vs Grep tool selection guidance Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the 20px-quantized scroll accumulator with direct pixel pass-through and a lightweight velocity tracker + exponential decay. Trackpad flicks now glide smoothly with natural deceleration (0.92/frame, ~133ms half-life). OS compositor momentum is respected via 50ms gap detection before activating synthetic inertia. - handle_mouse_scroll_pixels(): O(lines-crossed) pixel scroll on Window - EMA velocity tracking, ±20k px/s cap, cancel on any key/click - WaitUntil(16ms) scheduling during inertia (no busy-loop otherwise) - Non-text buffers (shell/conversation) delegate to line-based scroll Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Window move now uses i3wm semantics: perpendicular moves flip the split direction instead of just swapping positions. Parallel moves swap children as before. Complex layouts fall back to spatial swap. 8 new tests covering perpendicular flips, parallel swaps, boundary no-ops, and group-wrapped windows. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- set_ai_target tool: lets AI operate on non-focused buffers/windows without stealing user focus (buffer_name, window_id, clear params) - resolve_active_window_id: consistent window resolution for AI tools - list_buffers: includes window_ids for targeting - Undo/redo tracks saved_undo_depth — modified flag clears when undo returns to saved state (Vim/Emacs behavior) - Completion/hover/code-action popups position relative to focused window rect in split layouts (no more off-screen popups) - Hover popup anchored to request position, not live cursor - Dismiss hover popup on buffer close - display_buffer marks full redraw - Introspect includes hover_popup, code_action_menu, completion state Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…wport height Four scrolling fixes: A) Per-window inertia + velocity redesign: moved inertia state from global GuiApp to per-Window. Replaced EMA velocity (which inflated gentle scrolls into 2-page jumps) with sample-ring model — total displacement / total time from recent events. Capped at 3000 px/s (was 20,000). Inertia now targets the correct window in split layouts via handle_mouse_scroll_pixels_in_window. B) Shell scroll accumulator: pending_shell_scroll now accumulates (+=) instead of overwriting, so rapid inertia frames don't lose deltas. Removed reset_shell_scroll_accumulator() call on every scroll event — the accumulator should persist across events within a gesture. C) Terminal normal-mode keys: after C-\ C-n, j/k/C-e/C-y/C-u/C-d/C-b/C-f now scroll shell scrollback via pending_shell_scroll. Added BufferKind::Shell match arms to move-up/down, scroll-up/down-line, scroll-half/page-up/down. D) Per-window viewport height: added focused_viewport_height() helper that computes from layout_rects() with global fallback. Replaced ~25 reads of self.viewport_height across dispatch and editor methods. Fixes scroll-past-end in small split panes that were using the global (full-screen) viewport height. Also includes: LSP workspace edit, git stash, agenda ops, popup rendering, Scheme extensions, clippy fixes, and other v0.7.0 branch work. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rename/format pipeline: full LSP wire-up (prepare_rename, formatting, range_formatting), comprehensive ClientCapabilities - Auto-trigger completion on server trigger characters - Symbol outline popup (SPC c o): flattened DocumentSymbol with filter - Breadcrumbs: cursor ancestry from cached document symbols - Peek references (SPC l r): location cycling in peek window - DAP watch expressions (SPC d w): auto-eval on stop events - Exception breakpoints (SPC d e): setExceptionBreakpoints - Fix: AI agent shell CWD uses git root via git_or_project_root() instead of subcrate Cargo.toml directory Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 9 (babel, export, federation) plus AI agent reliability: Babel (org-mode literate programming): - Org-babel parser: #+begin_src blocks, header args, :var, :results - BabelExecutor: Python, shell, Ruby, JS/TS, Lua, C/C++, Rust, Go - Noweb reference expansion (<<block-name>>) - Results insertion (#+RESULTS:), tangle (:tangle directive) - Safety: eval policy (never/no-export/confirm/yes), trusted paths - Variable resolution with :var cross-references Export: - Org document parser → OrgElement AST (headings, paragraphs, lists, tables, code blocks, drawers, footnotes, LaTeX, horizontal rules) - HTML exporter with syntax-highlighted code blocks, table of contents - Markdown exporter with GitHub-flavored extensions - Tag-based filtering (#+SELECT_TAGS, #+EXCLUDE_TAGS) - Subtree export (cursor-based heading extraction) KB Federation: - FederationManager with instance registry and routing - Cross-instance search with result merging and deduplication - Link resolution across federated instances - Graph traversal with federation-aware neighborhood queries AI Agent Reliability: - dispatch_builtin_in_target(): Emacs save-excursion pattern — temporarily switches focus to AI target window, dispatches, restores - ai_active_buffer_idx() + ai_cursor_row(): AI-aware helpers used by babel_execute, babel_tangle, org_export_to, org_export_subtree - execute_command MCP tool now uses dispatch_builtin_in_target() - ProviderHint enum: detects Claude/OpenAI/Gemini/DeepSeek from model name, injects provider-specific prompt hints (Gemini: JSON examples, DeepSeek: anti-looping guardrails) - Compact prompt variants for explorer and reviewer sub-agents - Babel/export/targeting guidance in pair-programmer prompts - Self-test babel category (4 tests) - Tool validation tests (descriptions, naming, required params, prompt alignment, compact guardrails) - AI target dispatch tests (6 tests) 2,629 tests, all passing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bump workspace version to 0.7.0. Rewrite README with FOSS-style landing page: feature bullets, architecture diagram, roadmap table, updated badges (2,629 tests, ~120k lines). Move API cost warning from top-level to AI Setup section. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use .values() instead of .iter() with unused key — fixes nightly clippy lint. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add --clean/-q CLI flag (like emacs -q): skips config.toml, init.scm, history.scm, and project detection for a pristine launch. Useful for testing, demos, and screenshots without PII leaking into the splash. Also adds the v0.7.0 dashboard screenshot to the README. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Onboarding pipeline: - `--init-config` now generates both config.toml and init.scm (Doom-style template) - `make doctor` target checks all build prerequisites with colored ✓/✗ status - `make install` prints next-steps hint + warns if PREFIX not on PATH - clang added to README prerequisites, setup-dev.sh (step [1/4]) - macOS/WSL install guidance in README Configuration accuracy: - Fix stale theme lists in config.rs template and sample-config.toml (actual: default, dark-ansi, light-ansi, gruvbox-dark, gruvbox-light, dracula, catppuccin-mocha, solarized-dark, one-dark) - Fix wizard model default: claude-sonnet-4-5 → claude-sonnet-4-20250514 - Fix permission tier names everywhere: standard→write, trusted→shell, full→privileged (legacy names kept as aliases) - Add [performance] section to config template and sample config - Add API key generation links to config template, sample config, README AI-unconfigured UX: - Add `ai_configured` field to Editor (set from setup_ai() result) - When user opens AI chat without API key, show setup guide with provider links in the conversation buffer - All "AI not configured" status messages now include `:help ai-setup` hint Documentation: - ROADMAP.md rewritten for external reviewers (1,335→90 lines) - README: --check-config, --clean, :edit-config documented - README: issues link in Contributing section - Test badge updated: 2,629 → 2,698 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
# Conflicts: # crates/gui/Cargo.toml
- Add macOS x86_64 (macos-13) and aarch64 (macos-latest) TUI builds to release workflow; all 3 artifacts collected by a single release job - Add cargo-deny audit job to CI (EmbarkStudios/cargo-deny-action@v2) - Add deny.toml with license allow-list and advisory config - Align CI excludes with make ci (--exclude mae-test-fixtures everywhere) - Add doc-tests to CI test step - Fix pre-commit hook: --all-features → --exclude mae-gui (no skia compile) - Add rust-version = "1.75" MSRV to workspace Cargo.toml - Add make audit target - Update rustls-webpki 0.103.12 → 0.103.13 (RUSTSEC-2026-0104) - Track bincode unmaintained dep investigation in ROADMAP Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
# Conflicts: # Cargo.toml
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove PII from CLAUDE.md (3 user-specific paths) - Track Cargo.lock for reproducible builds (Rust binary convention) - Add .editorconfig (4-space Rust, 2-space YAML/TOML/Scheme) - Add SECURITY.md (AI permission tiers, babel safety, MCP bridge) - Add GitHub issue templates (YAML structured bug report, config.yml) - Add PR template (summary, test plan, checklist) - Expand CONTRIBUTING.md (architecture tour, testing, commit conventions, getting-your-bearings section, known bugs link) - Rewrite GEMINI.md to v0.7.0 state (2,629 tests, all 10 phases) - Fix README.md badge counts (tests: 2,629, LOC: ~130k) - Add `mae doctor` CLI command — human-readable diagnostic output checking build prereqs, config, AI keys, LSP servers, DAP adapters - Add manual test plan for fresh-user onboarding validation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
One-time validation artifact — belongs in the PR description, not the repo. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Babel language count: 8 → 12 (README, ROADMAP, GEMINI)
- Hook points: 17 → 18 (README)
- Self-hosting: remove stale "alongside Emacs" (README)
- Add missing phase 10 row to README phase table
- Add 5 ex-commands to README (set, split, diagnostics, messages, describe-configuration)
- Fix edit-config/edit-settings descriptions (README)
- Fix edit-settings keybinding doc: SPC f C → SPC f P (commands.rs)
- wgpu → Skia in CLAUDE.md, terminology.md (3 occurrences)
- MCP socket path: $XDG_RUNTIME_DIR/mae-mcp.sock → /tmp/mae-{PID}.sock (CLAUDE, SECURITY, kb_seed)
- MCP naming: "bridge" → "server" (README, CLAUDE, GEMINI, SECURITY)
- Add mae-shell + mae-mcp to CLAUDE.md crate table
- Update terminology.md frame/GUI docs for current state
- CI: add code-map freshness check job
- Release: add Linux GUI build job (4 artifacts total)
- Release: commit fresh code-map to main after tag build
- Regenerate CODE_MAP.md + CODE_MAP.json
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Builds mae with --features gui on ubuntu-latest (clang + fontconfig + freetype). This catches GUI build failures before they hit the release workflow. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
MAE v0.7.0 — 23 commits, 2,629 tests, spanning 8 rounds of development since v0.6.0.
AI Agent Reliability
dispatch_builtin_in_target()— Emacswith-current-bufferpattern. AI commands now land in the targeted buffer, not the focused window.ProviderHintenum detects Claude/OpenAI/Gemini/DeepSeek from model name.LSP + DAP Parity (VSCode/Emacs level)
GUI Performance
Org-mode & Knowledge Base
FOSS Project Readiness
mae doctor— unified CLI diagnostic (Doom Emacs pattern)Test plan
make cipassesmae doctorprints report, exits 0Manual Test Plan: Fresh User Onboarding
0. Create a Test User
sudo useradd -m -s /bin/bash maetest sudo passwd maetest sudo -iu maetest bash -c 'curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y'1. Clone & Doctor
2. Build
make build-tuisucceedsmake buildsucceeds (GUI)3. Install
make install— binary + desktop launcher + iconmae --versionworks4.
mae doctorPost-Install5. Config Init
mae doctornow green for configmae --check-config→ "config OK"mae --check-config --report→ JSONBreak test:
6. First Launch
mae→ dashboard,:qexitsmae config.toml→ syntax highlighting, hjklmae --gui→ window opens, fonts, mouse, close7. AI
SPC a p→ AI respondsEsccancels8. Help & Tutorial
:tutor— 12 lessons, link navigation:help— fuzzy searchSPC SPC— command palette9. Doc Links
10. GitHub Templates
11. Cargo.lock
12. Cleanup
Quick Checklist
make doctorfrom fresh clonemake build-tuimake build(GUI)make installmae doctorpost-installmae --init-configmae --check-configmaedashboard +:qmae --gui:tutor+:help