Files
Yves Gugger 85c5912101 feat(addons): unified distribution Phase 2 — addon publish, hosted installs, registry snapshots (#734)
* feat(addons): unified distribution Phase 2 — addon publish + hosted installs + registry snapshots

GH #724/#726. Client-side publish flow and registry consolidation:

- `lean-ctx addon publish --namespace <ns>`: wraps lean-ctx-addon.toml
  verbatim into a signed kind=addon .ctxpkg after local gates that mirror
  the hosted listing bar (schema, runnable [mcp], audit — blocking findings
  refuse, review publishes disclosed; --check = all gates, no network).
- `lean-ctx addon add <ns>/<name>[@version]`: resolves hosted packs —
  index-verified download, integrity + mandatory ed25519 signature +
  kind↔payload coherence — then the embedded manifest walks the unchanged
  consent → preflight → health-probe pipeline; `addon update` re-resolves
  from the install source (ctxpkg: sources unpinned to latest non-yanked).
- kind↔payload coherence (validate_kind_coherence) enforced in verify,
  import and the publish self-check; the context registry refuses
  kind=addon packs (wrong trust chain, points at `addon add`).
- Bundled registries become generated snapshots: gen_registry validates,
  sorts and canonicalizes rust/data/{addon,grammar}_registry.json;
  drift fails CI + preflight + a lib test (deterministic, #498).

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore: normalize EOF newlines (whitespace gate)

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(ci): pin registry snapshots to LF — Windows checkouts broke the byte-identical canonicality gate (#726)

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(spec): record shipped server-side kind support in unified-distribution Phase 2 (#726)

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Yves Gugger <7590809+yvgude@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 17:39:41 +02:00

19 lines
901 B
Plaintext

# Code-generated reference docs are emitted with LF by `gen_docs`. Pin them to
# LF on every platform so the docs-drift gate (`cargo test` + `gen_docs --check`)
# is byte-stable — Windows checkouts would otherwise convert them to CRLF and
# fail the comparison.
docs/reference/generated/*.md text eol=lf
# Testbench fixtures, suites, recordings and lock feed `RecordedRunner` replay
# keys verbatim (file bytes are embedded into the assembled context that is
# hashed). Pin them to LF so Windows checkouts don't convert them to CRLF and
# break the byte-identical key match (off-vs-on testbench, #611/#498).
rust/eval/testbench/** text eol=lf
# Registry snapshots are generated by `gen_registry` with LF and compared
# byte-for-byte in CI and lib tests (GH #726). Same rationale as the
# generated docs above.
rust/data/addon_registry.json text eol=lf
rust/data/grammar_registry.json text eol=lf