Merge pull request #8 from levineuwirth/v1.0-rc
v1.0.0 release prep: CHANGELOG, version bump, README, MSRV
This commit is contained in:
commit
f8b5209356
109
CHANGELOG.md
109
CHANGELOG.md
|
|
@ -5,12 +5,77 @@ All notable changes to this project will be documented in this file.
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [Unreleased]
|
## [1.0.0] --- 2026-05-18
|
||||||
|
|
||||||
> Scope note: this section currently records only release-affecting
|
First stable release. Builds on the 0.1.0 preview (M1–M6) with the
|
||||||
> changes surfaced during M10 ship-gate work. The full M6–M10 v1.0
|
M7–M10 arc: third-party packages, the universality proof across three
|
||||||
> changelog body is a separate release-authoring task and is not yet
|
shape-distinct workloads, MCP, and multi-frontend CRDT collaboration.
|
||||||
> written here.
|
Solo development through 1.0; public contributions open from this
|
||||||
|
release.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
#### Third-party package system (M7)
|
||||||
|
|
||||||
|
- Package install at user-config and project scope
|
||||||
|
(`pmacs.packages.install` / `install_project`) with `version` /
|
||||||
|
`branch` / `commit` pins and a lockfile.
|
||||||
|
- Per-package environment with `exports`; `require` resolution scoped
|
||||||
|
so packages can declare module-level state without cross-package
|
||||||
|
collision.
|
||||||
|
- Edit intercepts: packages observe and transform buffer mutations;
|
||||||
|
multiple intercepts thread in attach order.
|
||||||
|
- Audit-lint rule set (the package-trust surface): error/warning/info
|
||||||
|
patterns across environment-escape, fs-mutation, process-spawn, and
|
||||||
|
reach-around classes; runnable locally and in CI.
|
||||||
|
|
||||||
|
#### Filesystem API and bundled packages (M8)
|
||||||
|
|
||||||
|
- `pmacs.fs.*` worker-dispatched surface: `read_dir`, `stat`,
|
||||||
|
`rename`, `chmod`, `remove` with M3 `supersede` chaining on read
|
||||||
|
ops; UTF-8 path constraint surfaced as a structured failure.
|
||||||
|
- Three shape-distinct bundled packages proving the buffer
|
||||||
|
universality claim: dired (directory listing), magit (section
|
||||||
|
view), outline / outline-aggregate (derived structure views).
|
||||||
|
- Dev-loop APIs: `pmacs.packages.install_local`, `reload`,
|
||||||
|
`on_unload`.
|
||||||
|
|
||||||
|
#### MCP for package authors (M9)
|
||||||
|
|
||||||
|
- Model Context Protocol surface so package authors can expose
|
||||||
|
editor capability to AI assistance over the same protocol-uniform
|
||||||
|
path as the rest of the system (see `docs/mcp-for-package-authors.md`).
|
||||||
|
|
||||||
|
#### Multi-frontend CRDT collaboration (M10)
|
||||||
|
|
||||||
|
- CRDT layer (loro-backed, feature-gated) with an optimistic-apply
|
||||||
|
keystroke path; daemon owns the authoritative replica, frontends
|
||||||
|
mirror it.
|
||||||
|
- Two laptops attach to one daemon instance, both edit one file,
|
||||||
|
edits converge within a frame; per-frontend undo; presence and
|
||||||
|
per-frontend cursor rendering.
|
||||||
|
- Convergence verified under simulated network jitter
|
||||||
|
(`PMACS_INSTANCE_LATENCY_JITTER_MS`); automated synthetic-frontend
|
||||||
|
and doubled-PTY acceptance plus a two-laptop manual checklist.
|
||||||
|
|
||||||
|
#### Pulled-forward v0.2-prerequisite APIs
|
||||||
|
|
||||||
|
Planned promotions from `V0.2-PREREQUISITES.md`, implemented and
|
||||||
|
shipped in 1.0 (the public-API ceiling was raised by operator
|
||||||
|
decision to absorb them):
|
||||||
|
|
||||||
|
- `pmacs.buffer.from_file`, `pmacs.buffer.on_removed` (with an
|
||||||
|
idempotent `:remove()` handle; buffer-local keymaps pruned on
|
||||||
|
removal).
|
||||||
|
- `bypass_intercept` option on `buffer.insert` / `delete` / `replace`
|
||||||
|
(skips the intercept chain only; undo/dirty/view/CRDT bookkeeping
|
||||||
|
preserved).
|
||||||
|
- `pmacs.fs.watch` (polling watcher; `:cancel()` /
|
||||||
|
`:is_cancelled()`).
|
||||||
|
- `pmacs.async.yield_to_next_tick` (worker-free next-tick yield).
|
||||||
|
- `pmacs.editor.move_to_line` (0-based, clamps out of range).
|
||||||
|
- `pmacs.outline.query` (cross-package outline structure query).
|
||||||
|
- Audit-lint rule 16 `reach-around-require-field` (info).
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
|
@ -36,6 +101,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
could consume the daemon's server-speaks-first `Hello`; the
|
could consume the daemon's server-speaks-first `Hello`; the
|
||||||
established connection is now reused (regression-tested).
|
established connection is now reused (regression-tested).
|
||||||
|
|
||||||
|
### Known limitations
|
||||||
|
|
||||||
|
- **Per-frontend undo history does not persist across reattach.**
|
||||||
|
After a frontend disconnects and reconnects, it is issued a fresh
|
||||||
|
collaboration identity; its pre-disconnect edits remain in the
|
||||||
|
converged document (CRDT state is fully restored) but are no longer
|
||||||
|
reachable by that frontend's undo command — undo only reaches
|
||||||
|
edits made since reconnecting. Workaround: remove unwanted
|
||||||
|
pre-disconnect content by editing it out. Preserving undo history
|
||||||
|
across reconnect is tracked for v0.2
|
||||||
|
(`V0.2-PREREQUISITES.md`, Finding 4).
|
||||||
|
- **macOS REPL ctrl-c / exit-marker timing.** Two M6.5 REPL
|
||||||
|
acceptance tests (`m6_5_ctrl_c_sends_sigint`,
|
||||||
|
`m6_5_exit_marker_uses_basename_with_leading_newline`) time out on
|
||||||
|
macOS CI runners. The core daemon, CRDT, and remote-attach paths —
|
||||||
|
including the Mac-host collaboration scenario — build and pass on
|
||||||
|
macOS (the lib suite is green there); the limitation is confined
|
||||||
|
to bundled-REPL signal/exit-marker timing. Tracked for v0.2.
|
||||||
|
|
||||||
|
### Project posture
|
||||||
|
|
||||||
|
- `forbid(unsafe_code)` maintained across the crate; syscalls that
|
||||||
|
need unsafe are bridged via `/bin/sh` / coreutil / binary
|
||||||
|
trampolines or safe `nix` wrappers.
|
||||||
|
- Rust toolchain pinned (`rust-toolchain.toml`, 1.95.0) so local and
|
||||||
|
CI build the same validated compiler; bumped deliberately.
|
||||||
|
- Cross-flavor CI: every test runs under both `luajit` and `lua54`;
|
||||||
|
clippy `-D warnings` clean on both flavors and the `crdt` lane;
|
||||||
|
release-only perf-gate jobs.
|
||||||
|
- Library suite ~1223 tests (non-crdt) / ~1377 (crdt), zero failing
|
||||||
|
on the pinned toolchain, plus per-milestone integration suites
|
||||||
|
through M10.
|
||||||
|
|
||||||
## [0.1.0] --- 2026-05-03
|
## [0.1.0] --- 2026-05-03
|
||||||
|
|
||||||
First public preview. Solo development through 1.0; public contributions
|
First public preview. Solo development through 1.0; public contributions
|
||||||
|
|
@ -153,4 +251,5 @@ deferred until then.
|
||||||
(m1-acceptance through m6_8, m6_perf, m4-acceptance, m5_5..m5_8,
|
(m1-acceptance through m6_8, m6_perf, m4-acceptance, m5_5..m5_8,
|
||||||
m6_4..m6_7).
|
m6_4..m6_7).
|
||||||
|
|
||||||
|
[1.0.0]: https://example.invalid/pmacs/releases/tag/v1.0.0
|
||||||
[0.1.0]: https://example.invalid/pmacs/releases/tag/v0.1.0
|
[0.1.0]: https://example.invalid/pmacs/releases/tag/v0.1.0
|
||||||
|
|
|
||||||
|
|
@ -1242,7 +1242,7 @@ checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pmacs"
|
name = "pmacs"
|
||||||
version = "0.1.0"
|
version = "1.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossbeam",
|
"crossbeam",
|
||||||
"crossterm",
|
"crossterm",
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
[package]
|
[package]
|
||||||
name = "pmacs"
|
name = "pmacs"
|
||||||
version = "0.1.0"
|
version = "1.0.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
rust-version = "1.85"
|
rust-version = "1.95"
|
||||||
description = "Parallel Emacs --- a Rust-cored, Lua-scripted editor in the Emacs tradition"
|
description = "Parallel Emacs --- a Rust-cored, Lua-scripted editor in the Emacs tradition"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
authors = ["Pmacs contributors"]
|
authors = ["Pmacs contributors"]
|
||||||
|
|
|
||||||
11
README.md
11
README.md
|
|
@ -23,14 +23,15 @@ the package uses zero direct Rust core access was the v0.1 ship gate.
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
|
|
||||||
**v0.1.0 --- preview.** The design described above is implemented and
|
**v1.0.0 --- stable.** The design described above is implemented and
|
||||||
working. Solo development through 1.0; public contributions are
|
working. Solo development carried the project to 1.0; public
|
||||||
deferred until then. Use, evaluate, and file issues; pull requests
|
contributions are open from this release. Use, evaluate, file issues,
|
||||||
will get a friendly "thanks, see you at 1.0" until that gate.
|
and send pull requests.
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
Requires Rust `1.85` or newer (edition 2024). Lua flavor selectable
|
Builds on the toolchain pinned in `rust-toolchain.toml` (Rust
|
||||||
|
`1.95.0`, edition 2024); rustup selects it automatically. Lua flavor selectable
|
||||||
between `luajit` (default) and `lua54`; both pass the full test suite.
|
between `luajit` (default) and `lua54`; both pass the full test suite.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue