Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
3f1ad27
feat(scheme): Phase 13a+13b — mae-scheme reader, compiler, and byteco…
May 24, 2026
ddd45e6
feat(scheme): Phase 13c — R7RS standard library (48 new tests)
May 24, 2026
88ad180
feat(scheme): Phase 13d — hygienic macros, module system, R7RS hardening
May 24, 2026
0207360
fix(scheme): let/let* stack corruption + Phase 13d derived expressions
May 25, 2026
2177b38
feat(scheme): R7RS compliance hardening — ~40 missing functions, 22 n…
May 25, 2026
7c9a332
feat(scheme): R7RS compliance — multi-list map, ports, binary I/O, le…
May 25, 2026
37a29e5
feat(scheme): R7RS compliance — file I/O, cond-expand, time, process …
May 25, 2026
8917167
feat(scheme): read, eval, define-values, vector->list ranges
May 25, 2026
65c1cbc
test(scheme): 60 edge-case tests + 7 R7RS compliance fixes
May 25, 2026
10649ba
feat(scheme): R7RS edge cases — case-insensitive ops, with-exception-…
May 25, 2026
9add982
feat(scheme): close R7RS gaps — floor/, truncate/, rationalize, let-s…
May 25, 2026
fd16796
fix(scheme): TCO for and/or + 24 stress tests (287 total R7RS tests)
May 25, 2026
c827dd3
feat(scheme): (scheme inexact) + (scheme file) libraries, 292 R7RS tests
May 25, 2026
1a3d53a
feat(scheme): include, load, load_paths + library system tests (Phase…
May 25, 2026
00c82fc
feat(scheme): blocking sleep-ms + timing test (Phase 13f foundation)
May 25, 2026
4c01ec9
feat(scheme): top-level load + with-output-to-file, 300 R7RS tests
May 25, 2026
f7e48db
fix(scheme): 3 critical compiler bugs + 128 torture/benchmark tests
May 25, 2026
cc5feb9
feat(scheme): cond => arrow clause + map shortest-list, 428 tests
May 25, 2026
a9a126a
feat(scheme): 105 IO/port test fixtures + remove dead write-char
May 25, 2026
003976b
fix(scheme): closed port operations now error properly
May 25, 2026
172aa9d
feat(scheme): eval, call-with-values, radix/exactness, spec stances +…
May 25, 2026
694cb9e
feat(scheme): structural PartialEq, force/delay-force, min/max inexac…
May 25, 2026
7be0924
feat(scheme): comprehensive R7RS test coverage — 431 compliance tests
May 25, 2026
0ee15c8
fix(scheme): R7RS compliance — dynamic-wind+call/cc, file-error?, mem…
May 25, 2026
3a45208
ci(scheme): add R7RS compliance CI job, un-ignore fib(30) benchmark
May 25, 2026
64005a3
feat(scheme): GC observability, Trace completeness, cycle-risk docume…
May 25, 2026
1e3b882
fix(scheme): 16 audit fixes — binary ports, parameterize, record-type…
May 26, 2026
7ba1909
feat(scheme): R7RS §6.11 exception system (Chibi-Scheme pattern)
May 26, 2026
b8bb2eb
docs(scheme): document exception system architecture in SPEC_STANCES.md
May 26, 2026
be7abb0
feat(scheme): eliminate spec-lawyering — proper char-ready?, rational…
May 26, 2026
cdfab9f
fix(scheme): VM foreign fn arity check + 215 branch-level tests (1115…
May 26, 2026
0b15c06
feat(scheme): Phase 13e — replace Steel with mae-scheme VM + purge al…
May 26, 2026
a0e8732
feat(scheme): Phase 13f — async/yield infrastructure + (mae async) li…
May 26, 2026
79dbe76
fix(scheme): consolidate yield primitives + replace static sleeps in …
May 26, 2026
24f7772
feat(test): auto-flush wrappers + consolidated test architecture
May 26, 2026
9e6f004
docs(collab): update E2E README — yield primitives now drain events
May 26, 2026
29be90d
feat(scheme): Phase 13g — in-process Scheme LSP (Swank-style)
May 26, 2026
2b1faeb
feat(scheme): source maps + go-to-definition for Scheme LSP
May 26, 2026
91d0a14
feat(scheme): Phase 13g — DAP infrastructure (breakpoints, stepping, …
May 26, 2026
effb9b4
feat(scheme): Phase 13g — Scheme DAP bridge (in-process debugger)
May 26, 2026
f038045
test(scheme): Phase 13g — E2E + performance tests for LSP & DAP
May 26, 2026
6085b63
feat(scheme): Phase 13h — introspection + observability
May 26, 2026
04c12d4
docs(scheme): Phase 13j — ADR-009 + EXTENSION_GUIDE + ROADMAP completion
May 26, 2026
711e590
fix(test): split write-file + file-exists? into separate test steps
May 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,8 @@ if ! cargo fmt --check --quiet 2>/dev/null; then
exit 1
fi

# 2. Clippy lint check
# Exclude mae-gui (requires skia/clang) and mae-test-fixtures (generated).
if ! cargo clippy --workspace --all-targets --exclude mae-gui --exclude mae-test-fixtures -- -D warnings >/dev/null 2>&1; then
# 2. Clippy lint check (must match `make clippy` and CI)
if ! cargo clippy --workspace --all-targets -- -D warnings >/dev/null 2>&1; then
echo "❌ cargo clippy check failed. Run 'make clippy' to see errors."
exit 1
fi
Expand Down
30 changes: 23 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,6 @@ jobs:
- uses: Swatinem/rust-cache@v2
- name: Build binary
run: cargo build --release --workspace
- name: Create Steel home directory
run: mkdir -p ~/.local/share/steel
- name: Validate init.scm
run: ./target/release/mae --check-config
- name: Editor tests
Expand All @@ -144,13 +142,31 @@ jobs:
./target/release/mae --check-config
test -f ~/.config/mae/packages.lock

scheme-runtime:
name: scheme / R7RS compliance
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: R7RS compliance tests
run: cargo test -p mae-scheme --test r7rs_compliance -- --nocapture
timeout-minutes: 10
- name: Scheme torture tests
run: cargo test -p mae-scheme --test scheme_torture -- --nocapture
timeout-minutes: 5
- name: Scheme benchmark tests
run: cargo test -p mae-scheme --test scheme_benchmarks -- --nocapture
timeout-minutes: 10
- name: Scheme real programs
run: cargo test -p mae-scheme --test scheme_programs -- --nocapture
timeout-minutes: 5
- name: Unit tests
run: cargo test -p mae-scheme --lib
timeout-minutes: 5

collab-e2e:
name: collab / docker e2e
# DISABLED: Docker E2E requires Scheme async/yield for reliable cross-container
# coordination. Protocol correctness is covered by collab_e2e.rs (28 tests),
# CRDT Scheme tests (142), and collab-local Scheme tests (85).
# Re-enable after Phase 13 Scheme runtime.
if: false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
Expand Down
2 changes: 1 addition & 1 deletion ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ For user-facing docs, see README.md. For build instructions, see CLAUDE.md.
| `mae-core` | Buffer (rope), event loop, editor state, commands, modes |
| `mae-renderer` | TUI rendering via ratatui/crossterm (`Renderer` trait) |
| `mae-gui` | GUI rendering via winit + Skia 2D |
| `mae-scheme` | Embedded Steel Scheme runtime |
| `mae-scheme` | Embedded R7RS-small Scheme runtime |
| `mae-lsp` | LSP client (tower-lsp, diagnostics, completion) |
| `mae-dap` | DAP client (breakpoints, step, inspect) |
| `mae-ai` | AI agent transport (Claude/OpenAI/Gemini/DeepSeek) |
Expand Down
8 changes: 3 additions & 5 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ The project README (`README.md`) contains the architecture spec and stack ration
| `mae-core` | Buffer management (rope), event loop, core primitives | `ropey`, `crossbeam` |
| `mae-renderer` | Display/rendering — `Renderer` trait + terminal backend | `ratatui`, `crossterm` |
| `mae-gui` | GUI rendering backend — winit window + Skia 2D + native SVG | `winit`, `skia-safe` (features: `svg`) |
| `mae-scheme` | Embedded Scheme runtime for configuration and packages | `steel` (or purpose-built) |
| `mae-scheme` | Embedded Scheme runtime for configuration and packages | purpose-built R7RS-small |
| `mae-lsp` | LSP client — types, references, diagnostics exposed to Scheme + AI | `tower-lsp` or `lsp-types` |
| `mae-dap` | DAP client — breakpoints, call stacks, variables exposed to Scheme + AI | `dap-types` |
| `mae-ai` | AI agent integration — tool-calling transport (Claude/OpenAI/Gemini/DeepSeek) | `reqwest`, `serde_json` |
Expand Down Expand Up @@ -104,7 +104,7 @@ Granular milestone tracking lives in **ROADMAP.md**.
- Single-file editing with save/load

### Phase 2: Scheme Runtime — COMPLETE
- Steel embedded as the extension language
- mae-scheme R7RS-small runtime as the extension language
- Buffer operations exposed to Scheme
- Config file loading (`init.scm`)
- Command binding from Scheme (`(define-key ...)`)
Expand Down Expand Up @@ -309,9 +309,8 @@ make test-scheme-all # All local tests
- **Rust-side iteration preferred.** Don't add `(run-tests)` at end of test files. The runner calls `run-nth-test` with `apply_to_editor` + `sync_scheme_state` between each step.

### Adding New Test Primitives
- **Read-only state**: Add to `SharedState`, register `test-*` Rust function in `new()`, add Scheme forwarding in `install_mutable_buffer_accessors`, update in `sync_scheme_state`.
- **Read-only state**: Add to `SharedState`, register Rust function in `new()` that reads from SharedState, update SharedState in `inject_editor_state`.
- **Mutations**: Add pending field to `SharedState`, register Scheme function that sets it, process in `apply_to_editor`.
- **Never call `inject_editor_state` between test registration and execution** — it shadows captured bindings (Steel `register_value` creates new cells).

## Developing MAE Inside MAE (MCP Tools)

Expand Down Expand Up @@ -510,7 +509,6 @@ These APIs are intended to remain stable through v1.0:
- **Full architecture spec:** `README.md`
- **Emacs source for reference:** the Emacs source tree (clone of emacs-mirror/emacs, `emacs-30` branch)
- **Declarative project config:** `.project` in repo root (for declarative-project-mode in Emacs)
- **Steel Scheme:** https://github.com/mattwparas/steel — primary candidate for embedded Scheme runtime
- **ropey:** https://github.com/cessen/ropey — rope data structure for buffer management
- **ratatui:** https://github.com/ratatui/ratatui — terminal UI framework
- **tree-sitter-org:** org-mode grammar for tree-sitter
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ MAE is split into 10 crates (see `README.md` for the full layout):
| `mae-core` | Buffer (rope), editor state, commands, keymap, syntax, babel, export |
| `mae-renderer` | Terminal rendering (ratatui), status bar, popups |
| `mae-gui` | GUI rendering (winit + Skia 2D), mouse, fonts, inline images |
| `mae-scheme` | Steel Scheme runtime, init.scm loading, hook dispatch |
| `mae-scheme` | R7RS-small Scheme runtime, init.scm loading, hook dispatch |
| `mae-ai` | AI providers (Claude/OpenAI/Gemini/DeepSeek), tool execution |
| `mae-lsp` | LSP client — connection, navigation, diagnostics, completion |
| `mae-dap` | DAP client — breakpoints, stepping, watches |
Expand Down
Loading