Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
42e19a7
Merge branch 'feature/kb-create-ux' into feature/v0.10.0-dailies
May 15, 2026
9f265cd
feat: full property drawer parsing + schema v5 (Part 1)
May 15, 2026
2b7a0e5
feat: write-through safety — kb_write_guard anti-cascade (Part 2)
May 15, 2026
b7da1be
feat: activity tracking + activity-sorted search (Part 3)
May 15, 2026
27e1697
chore: regenerate code map (new activity + properties APIs)
May 15, 2026
40cd8d2
feat: org-dailies core — chain-fill, navigation, audit report (Part 4)
May 15, 2026
e23bd5a
feat: dailies module — SPC n d keybindings + concept:dailies help nod…
May 15, 2026
ad1eac1
chore: regenerate code map (dailies + keymap_query APIs)
May 15, 2026
649790b
feat: KB integrity pipeline — stale detection, link validation, orpha…
May 15, 2026
7064565
feat: keymap flavor infrastructure + keybinding reference docs
May 15, 2026
0bd289e
chore: regenerate code map (KB integrity + keymap flavor APIs)
May 15, 2026
d812323
fix: kernel dailies bindings + set-group-name Scheme API + introspect…
May 15, 2026
ca9170d
feat: which-key scrolling, height config, sort order, group labels
May 16, 2026
6d77970
feat: server-client M1 — multi-client MCP, file safety, KB WAL, ADRs
May 16, 2026
b65e6c8
test: multi-client MCP integration tests
May 16, 2026
f81c6bc
test: fill M1 hardening coverage gaps (9 new tests)
May 16, 2026
a089796
feat: mae-sync crate — yrs CRDT text bridge + KB node schema (20 tests)
May 16, 2026
5f09553
feat: Phase B — wire TextSync into Buffer for collaborative edits
May 16, 2026
70c7811
feat: Phase C — MCP sync method handlers (pull-based)
May 17, 2026
0bab9d2
feat: Phase D — push-based sync event broadcasting (11 tests)
May 17, 2026
9c7fd7e
fix: audit fixes for sync/MCP push architecture
May 17, 2026
32a4bf8
feat: generalize MCP transport for TCP + pub API for state-server
May 17, 2026
56fbc71
feat: mae-state-server — collaborative state server with WAL persistence
May 17, 2026
9f67929
chore: backmerge main + update README screenshot
May 17, 2026
597c91d
fix: CI state-server test (binary crate, no --lib) + regenerate code map
May 17, 2026
7e200e3
feat: collaborative editing — scalability, UX commands, AI tools, obs…
May 18, 2026
31058c2
feat: observability, KB docs, E2E tests for collaborative editing
May 18, 2026
f21a68f
chore: update CLAUDE.md, ADR-006, code map for collab features
May 18, 2026
34dc95a
feat: KB CRDT integration — schema v7, Node↔KbNodeDoc bridge
May 18, 2026
53f7d7c
chore: regenerate code map after KB CRDT integration
May 18, 2026
c3aa80b
fix: :q closes window not app, C-c cancels not kills, keymap-doom aut…
May 18, 2026
bbebf1a
ci: add GUI tests + clippy to CI, include in badge count
May 18, 2026
dd32984
feat: add `make install-upgrade` + help/KB terminology audit
May 18, 2026
8d66046
fix: add missing untracked files (collab_bridge.rs, mae-connect.desktop)
May 18, 2026
85a3f89
chore: regenerate code map after terminology audit
May 18, 2026
0d19003
fix: share duplication, echo filtering, peer count + README refresh
May 18, 2026
9fc93e7
feat: collab correctness + save protocol + org rendering fixes
May 18, 2026
c85dbd3
feat: 3-tier collab E2E test suite + 4 bug fixes + MCP shim framing
May 19, 2026
d0bf7f0
fix: 4 MCP protocol bugs + architecture spec
May 19, 2026
d3aa424
fix: MCP shim stdio framing + protocol version negotiation
May 19, 2026
7867846
test: MCP protocol audit — 8 new tests + header guard + code-map prec…
May 19, 2026
12abab8
fix: org-mode parity restoration + 46 regression guard tests
May 19, 2026
4183c14
fix: file mode system — lang module auto-load + language detection + …
May 19, 2026
13518ad
fix: Scheme test framework — 5 gap fixes + execute-ex + Rust-side ite…
May 19, 2026
8db90c9
feat: CRDT test primitives + editor tests + testing framework docs
May 20, 2026
242d45f
feat: Scheme test library v2 — 310 tests, CI integration, CRDT lifecy…
May 20, 2026
3e51263
feat: CRDT robustness hardening — ADR-008, runtime limits, CI fixes, …
May 20, 2026
f44656b
fix: CI workflow YAML — restore newlines after exclude removal
May 20, 2026
1cbbf86
fix: CI consolidation (17→13 jobs) + docker e2e /sync permissions
May 20, 2026
782d54f
feat: join-save model, suffix matching, CI warning fixes — 3,639 tests
May 20, 2026
cb37a20
feat: KB search body matching + recency sorting (kb_search_sort option)
May 20, 2026
1b47fcd
fix: collab test failures (get-option freshness, missing option arms)…
May 20, 2026
e9f7569
fix: keybinding conflicts (kernel→module migration) + buffer-text fre…
May 20, 2026
ab7bff5
fix: split collab E2E test steps for pending op ordering
May 20, 2026
ca6c202
feat: save protocol wiring + disconnect lifecycle + stub audit — coll…
May 20, 2026
b8d4b6a
feat: protocol resilience — gap detection, heartbeat, offline recover…
May 20, 2026
0829dd5
feat: benchmark suite + dispatch/ui.rs split — foundational testing +…
May 20, 2026
2e17808
refactor: extract CollabState + ShellIntents sub-structs from Editor …
May 20, 2026
ec5c06e
test: collab E2E — save round-trip, heartbeat, reconnect re-share
May 20, 2026
a5ec70f
test: TCP E2E — offline reconnect resync + peer notifications
May 20, 2026
e08a5f1
docs: update ROADMAP — mark 7 completed items + document extraction r…
May 20, 2026
d344094
refactor: extract ViState + AiState sub-structs from Editor (75 fields)
May 20, 2026
649914f
docs: update ROADMAP — editor struct at ~40 fields after 4 extractions
May 20, 2026
7561af3
refactor(core): standardize test variable names to `editor`
May 20, 2026
dd41a12
docs: add naming conventions to CONTRIBUTING.md
May 20, 2026
f09ef0a
ci: disable docker collab E2E during struct-extraction refactor
May 20, 2026
39e8a0a
fix(gui): suppress field_reassign_with_default in cursor test
May 20, 2026
19283ae
refactor(core): extract KbContext sub-struct from Editor (21 fields)
May 20, 2026
712f877
Merge remote-tracking branch 'origin/main' into feature/v0.11.0-dailies
May 20, 2026
7ba8242
refactor(core): extract DapContext sub-struct from Editor (2 fields)
May 20, 2026
3201b92
docs: update ROADMAP — editor struct at ~69 fields after 6 extractions
May 21, 2026
8de53b8
fix(collab): buffer status indicators, save guard, sharer notificatio…
May 21, 2026
1c16230
docs: mark collab bugs 2-4 + E8 complete, clarify Bug 1 status in ROA…
May 21, 2026
b765978
fix(docker): add 7 missing crates to Dockerfile, fix collab E2E test_…
May 21, 2026
9d8f169
feat(sync): per-user CRDT undo via yrs UndoManager
May 21, 2026
69c746b
test(collab): two-client CRDT undo E2E test in Docker
May 21, 2026
1e8c6bc
ci: re-enable collab Docker E2E tests
May 21, 2026
de157c9
ci: unify local/remote CI — include mae-gui in workspace, 15m collab …
May 21, 2026
ba3faa2
fix(collab): remove (load) from undo E2E tests, fix verifier mounts
May 21, 2026
968c6d6
fix(gui): nightly clippy redundant reference + collab diagnostic logging
May 21, 2026
5cf6250
fix(collab): headless test runner missing drain_and_broadcast — local…
May 21, 2026
d1f5395
fix(docker): pre-create /workspace and /shared with mae user ownership
May 21, 2026
8b0e3fd
fix(collab): use server-resolved doc_id in join response, not client-…
May 21, 2026
4be3b61
fix(collab): read_message partial-peek framing, intent drain ordering…
May 21, 2026
2b0887c
fix(collab): structured diagnostic logging + healthcheck noise fix
May 21, 2026
afae68a
fix(collab): cross-client crosstalk, ForceSync undo wipe, Docker E2E …
May 22, 2026
baa30ca
fix(test): buffer-drain-updates always-accumulate + Docker orchestrat…
May 22, 2026
59e681c
fix(ci): remove stale mae-test-fixtures exclude from Dockerfile, wire…
May 22, 2026
ca5879f
docs: update SYNC_PROTOCOL known-limitations, refresh RoamNotes test …
May 22, 2026
167df56
roadmap: networked feature E2E coverage gate — no ship without tests
May 22, 2026
b6d3c1c
feat(collab): awareness protocol — cursor/selection/presence sharing
May 22, 2026
ba8b12e
fix(ci): replace flaky verifier poll with docker compose wait
May 22, 2026
6e47801
fix(ci): foreground docker-compose + 13 protocol E2E coverage tests
May 22, 2026
5fa8d3c
feat(collab): long-lived session tests + debug observability
May 22, 2026
3ef1055
fix(collab): awareness notification parse error + seq_tracker seeding…
May 24, 2026
12f8ce4
fix(crdt): vim-style undo grouping for CRDT sync
May 24, 2026
f6e17fa
roadmap: track cursor drift, modified flag, Docker E2E timeout bugs
May 24, 2026
36dd0b7
test: collab hardening — 21 new tests, encode_diff API, v0.10.4
May 24, 2026
068309a
ci: disable Docker collab E2E (blocked on Phase 13 Scheme runtime)
May 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,12 @@ if ! cargo clippy --workspace --all-targets --exclude mae-gui --exclude mae-test
exit 1
fi

# 3. Code-map freshness check
echo "Checking code-map freshness..."
if ! make code-map-check 2>/dev/null; then
echo "❌ Code-map is stale. Run 'make code-map' to regenerate."
exit 1
fi

echo "✅ Pre-commit checks passed."
exit 0
5 changes: 4 additions & 1 deletion .github/workflows/badges.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,13 @@ jobs:
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2

- name: Install GUI dependencies
run: sudo apt-get update && sudo apt-get install -y clang libfontconfig1-dev libfreetype6-dev

- name: Count tests
id: tests
run: |
OUTPUT=$(cargo test --workspace --exclude mae-gui --exclude mae-test-fixtures 2>&1)
OUTPUT=$(cargo test --workspace --exclude mae-test-fixtures 2>&1)
TOTAL=$(echo "$OUTPUT" | grep -oP '\d+ passed' | awk '{s+=$1} END {print s}')
FORMATTED=$(printf "%'d" "$TOTAL")
echo "count=$FORMATTED" >> $GITHUB_OUTPUT
Expand Down
111 changes: 73 additions & 38 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,23 @@ jobs:
toolchain: ${{ matrix.toolchain }}
components: clippy, rustfmt

- name: Install GUI dependencies
if: matrix.step != 'fmt'
run: sudo apt-get update && sudo apt-get install -y clang libfontconfig1-dev libfreetype6-dev

- uses: Swatinem/rust-cache@v2

- name: cargo check
if: matrix.step == 'check'
run: cargo check --workspace --all-targets --exclude mae-gui --exclude mae-test-fixtures

run: cargo check --workspace --all-targets
- name: cargo test
if: matrix.step == 'test'
run: |
cargo test --workspace --exclude mae-gui --exclude mae-test-fixtures
cargo test --doc --workspace --exclude mae-gui --exclude mae-test-fixtures

cargo test --workspace
cargo test --doc --workspace
- name: cargo clippy
if: matrix.step == 'clippy'
run: cargo clippy --workspace --all-targets --exclude mae-gui --exclude mae-test-fixtures -- -D warnings
run: cargo clippy --workspace --all-targets -- -D warnings

- name: cargo fmt
if: matrix.step == 'fmt'
Expand All @@ -57,21 +59,38 @@ jobs:
- uses: actions/checkout@v6
- uses: EmbarkStudios/cargo-deny-action@v2

# E2E smoke test: build TUI binary and validate init.scm loads without errors.
e2e:
name: e2e / check-config
server-client:
name: Server-Client Integration
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Build TUI binary
run: cargo build --release --workspace --exclude mae-gui --exclude mae-test-fixtures
- name: Validate init.scm
run: ./target/release/mae --check-config

gui-build:
name: gui / build
- name: Multi-client integration tests
run: cargo test --package mae-mcp --lib -- --test-threads=1
timeout-minutes: 5
- name: KB WAL integration tests
run: cargo test --package mae-kb --lib -- wal changelog sync --test-threads=1
timeout-minutes: 3
- name: File safety tests
run: cargo test --package mae-core --lib -- content_hash file_lock --test-threads=1
timeout-minutes: 3
- name: State server tests
run: cargo test --package mae-state-server -- --test-threads=1 --nocapture
timeout-minutes: 5
env:
RUST_LOG: "mae_state_server=debug,mae_sync=debug,warn"
- name: Collab bridge integration tests
run: cargo test --package mae --test collab_bridge_integration -- --test-threads=1 --nocapture
timeout-minutes: 5
env:
RUST_LOG: "mae_state_server=debug,mae_sync=debug,warn"
- name: State server check-config
run: cargo run --package mae-state-server -- --check-config
timeout-minutes: 1

gui:
name: gui / release binary
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
Expand All @@ -82,46 +101,62 @@ jobs:
- name: Build GUI binary
run: cargo build --release --features gui --package mae

container-smoke:
name: container / smoke
containers:
name: container / smoke + new-user
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Build and smoke-test container
run: docker compose run --rm --build smoke

container-new-user:
name: container / new-user
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Validate new-user flow in clean container
run: docker compose run --rm --build new-user

e2e-package-install:
name: e2e / package install
# Consolidated E2E: check-config + package install + Scheme tests
# Single binary build, sequential validation steps.
e2e:
name: e2e / scheme + packages
runs-on: ubuntu-latest
needs: check
needs: [check]
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- name: Install GUI dependencies
run: sudo apt-get update && sudo apt-get install -y clang libfontconfig1-dev libfreetype6-dev
- uses: Swatinem/rust-cache@v2
- name: Build TUI binary
run: cargo build --release --workspace --exclude mae-gui --exclude mae-test-fixtures
- name: Declare test package in init.scm
- 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
run: ./target/release/mae --test tests/editor/
- name: CRDT tests
run: ./target/release/mae --test tests/crdt/
- name: Package install
run: |
mkdir -p ~/.config/mae
cat > ~/.config/mae/init.scm <<'SCHEME'
(package! "splash-themes" :source "github:cuttlefisch/mae-splash-themes")
SCHEME
- name: Run mae sync
run: ./target/release/mae sync
- name: Verify package installed
run: test -f ~/.config/mae/packages/splash-themes/module.toml
- name: Validate config loads
run: ./target/release/mae --check-config
- name: Verify lockfile
run: test -f ~/.config/mae/packages.lock
./target/release/mae sync
test -f ~/.config/mae/packages/splash-themes/module.toml
./target/release/mae --check-config
test -f ~/.config/mae/packages.lock

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
- name: Run collab E2E
run: make docker-collab-test
timeout-minutes: 15

code-map:
name: code-map freshness
Expand Down
12 changes: 9 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,23 @@ jobs:
- uses: Swatinem/rust-cache@v2

- name: Build static binary
run: cargo build --release --target x86_64-unknown-linux-musl --package mae
run: |
cargo build --release --target x86_64-unknown-linux-musl --package mae
cargo build --release --target x86_64-unknown-linux-musl --package mae-state-server

- name: Prepare artifact
run: |
mkdir -p dist
cp target/x86_64-unknown-linux-musl/release/mae dist/mae-linux-x86_64
chmod +x dist/mae-linux-x86_64
cp target/x86_64-unknown-linux-musl/release/mae-state-server dist/mae-state-server-linux-x86_64
chmod +x dist/mae-linux-x86_64 dist/mae-state-server-linux-x86_64

- uses: actions/upload-artifact@v7
with:
name: mae-linux-x86_64
path: dist/mae-linux-x86_64
path: |
dist/mae-linux-x86_64
dist/mae-state-server-linux-x86_64

build-linux-gui:
name: Build linux-x86_64-gui
Expand Down Expand Up @@ -121,6 +126,7 @@ jobs:
body_path: CHANGELOG-release.md
files: |
dist/mae-linux-x86_64
dist/mae-state-server-linux-x86_64
dist/mae-linux-x86_64-gui
dist/mae-macos-aarch64
fail_on_unmatched_files: true
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ README.org
.mae/
**/.mae/

# MAE advisory file locks (multi-editor contention)
*.mae.lock

# Test artifacts
test_sandbox/

Expand Down
4 changes: 2 additions & 2 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,14 @@ It replaces scattered `match buf.kind` blocks with polymorphic dispatch:
`BufferView` (`buffer_view.rs`) stores mode-specific state on `Buffer`:

- `Conversation(Box<Conversation>)`
- `Help(Box<HelpView>)`
- `Kb(Box<KbView>)`
- `Debug(Box<DebugView>)`
- `GitStatus(Box<GitStatusView>)`
- `Visual(Box<VisualBuffer>)`
- `FileTree(Box<FileTree>)`
- `None`

Accessor methods: `buf.conversation()`, `buf.help_view()`, `buf.git_status_view()`, etc.
Accessor methods: `buf.conversation()`, `buf.kb_view()`, `buf.git_status_view()`, etc.
Replaces 6 `Option<T>` fields that were always mutually exclusive.

## Keymap Inheritance
Expand Down
Loading