Skip to content

v0.7.0: AI agent reliability, LSP/DAP parity, GUI performance#22

Open
cuttlefisch wants to merge 34 commits intomainfrom
feature/v0.7.0-docs
Open

v0.7.0: AI agent reliability, LSP/DAP parity, GUI performance#22
cuttlefisch wants to merge 34 commits intomainfrom
feature/v0.7.0-docs

Conversation

@cuttlefisch
Copy link
Copy Markdown
Owner

@cuttlefisch cuttlefisch commented May 6, 2026

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() — Emacs with-current-buffer pattern. AI commands now land in the targeted buffer, not the focused window.
  • Provider-aware promptsProviderHint enum detects Claude/OpenAI/Gemini/DeepSeek from model name.
  • Compact prompt variants for all 4 profiles.

LSP + DAP Parity (VSCode/Emacs level)

  • Rename/Format pipeline, symbol outline, breadcrumbs, peek references
  • Auto-trigger completion, watch expressions, exception breakpoints

GUI Performance

  • Pixel-perfect scrolling, per-window render caching, frame profiling
  • Large document optimization, inertial scrolling, native SVG

Org-mode & Knowledge Base

  • Babel execution (8 languages), HTML/Markdown export, KB federation

FOSS Project Readiness

  • mae doctor — unified CLI diagnostic (Doom Emacs pattern)
  • Cargo.lock tracked — reproducible builds
  • GitHub community standards — YAML issue templates, PR template, SECURITY.md
  • CONTRIBUTING.md expanded — architecture tour, testing, commit conventions
  • PII cleanup — removed user-specific paths from CLAUDE.md
  • .editorconfig, GEMINI.md rewrite, README.md badge fixes

Test plan

  • make ci passes
  • mae doctor prints report, exits 0
  • No PII in tracked files
  • Cargo.lock tracked
  • Fresh-user onboarding (manual test plan below)
  • GitHub templates render

Manual 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

sudo -iu maetest
git clone git@github.com:cuttlefisch/mae.git ~/mae && cd ~/mae
make doctor
  • Exits 0, rustc/cargo green, optional tools as warnings

2. Build

  • make build-tui succeeds
  • make build succeeds (GUI)

3. Install

  • make install — binary + desktop launcher + icon
  • mae --version works

4. mae doctor Post-Install

  • Yellow warnings for missing config/init (expected)
  • Yellow warning for no AI key (expected)
  • Exit code 0

5. Config Init

mae --init-config
  • Creates config.toml + init.scm
  • mae doctor now green for config
  • mae --check-config → "config OK"
  • mae --check-config --report → JSON

Break test:

echo "invalid {{{{" >> ~/.config/mae/config.toml
mae --check-config   # should exit 1
mae doctor           # should show red cross
mae --init-config --force  # restore

6. First Launch

  • mae → dashboard, :q exits
  • mae config.toml → syntax highlighting, hjkl
  • mae --gui → window opens, fonts, mouse, close

7. AI

export ANTHROPIC_API_KEY=sk-ant-...
mae doctor   # green checkmark
  • SPC a p → AI responds
  • Esc cancels
  • Bad key → error in status bar, no crash

8. Help & Tutorial

  • :tutor — 12 lessons, link navigation
  • :help — fuzzy search
  • SPC SPC — command palette

9. Doc Links

  • CONTRIBUTING.md links resolve (CODE_MAP, terminology, TOOL_ADDITION_CHECKLIST, ROADMAP#known-bugs)

10. GitHub Templates

  • Bug Report YAML form renders
  • Blank issues disabled
  • PR template auto-populates
  • SECURITY.md in Security tab

11. Cargo.lock

  • Fresh clone uses pinned versions

12. Cleanup

sudo userdel -r maetest

Quick Checklist

# Test Pass?
1 make doctor from fresh clone
2 make build-tui
3 make build (GUI)
4 make install
5 mae doctor post-install
6 mae --init-config
7 mae --check-config
8 mae dashboard + :q
9 mae --gui
10 AI conversation
11 :tutor + :help
12 GitHub templates
13 Cargo.lock reproducible

cuttlefisch and others added 30 commits May 3, 2026 14:04
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>
- 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>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
cuttlefisch and others added 4 commits May 7, 2026 00:22
- 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>
Sign up for free to 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