@neocompose/cli 0.40.0 → 0.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,63 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.41.0] - 2026-09-01
4
+
5
+ ### Added
6
+
7
+ - `neo migrate rekey`, the one-time source refactor for the canonical
8
+ value-id migration. It reads the server's old-to-canonical mapping for the
9
+ workspace's version, rewrites `@id` pins and `Reference(id: ...)` literals in
10
+ tracked `.neo` and `.spec.neo` source, and moves `.neo/state.json` bases onto
11
+ the new ids, so the next `pull` merges field by field instead of reporting
12
+ every rekeyed value as a delete plus a create. The command refuses to write
13
+ anything when conflict markers or unresolved pull conflicts remain, when an
14
+ old id survives outside those two syntactic positions, or when the rewrite
15
+ introduces a source error. Running it a second time is a no-op.
16
+ - `@distribution(kind: .Sparse | .Packed)` on value-owning member
17
+ declarations, backed by schema contract 4.1. It chooses whether a member's
18
+ materialized value keeps its own row or is stored inside its owning parent
19
+ row.
20
+ - Omitting the annotation is a third state, not a synonym for `.Sparse`: on a
21
+ root declaration it means the automatic distribution for the member's kind
22
+ and settings, and on an override it means inherit. Pull emits the annotation
23
+ only where the field is explicitly stored and never writes an automatic
24
+ result into source.
25
+
26
+ - Read packed subtree storage. A `.Packed` child has no record of its own; it
27
+ is stored as a `{ "~packed": ... }` envelope at its position inside its
28
+ owning parent's body. The CLI now expands those envelopes into logical value
29
+ rows when it builds the stored ownership graph, so placements, emitted
30
+ source, root paths, and `neo check` see a packed child exactly as they see a
31
+ sparse one. A malformed packed payload now reports its owning row instead of
32
+ the child disappearing without a diagnostic.
33
+
34
+ - Push packed subtree storage. Value lowering keeps producing the logical row
35
+ graph; `neo status` and `neo push` now fold it into the physical rows the
36
+ server stores, through the same shared fold the server write path runs. A
37
+ packed child no longer reports a phantom create beside a spurious update of
38
+ its parent, so `pull` followed by `push --dry-run` of a packed project is
39
+ clean, and an edit of a packed member is one write of the row that stores it.
40
+ - Converge a sparse project as it is pushed. Rewriting a value row repacks the
41
+ whole subtree it stores and retires the child records it supersedes, in one
42
+ push. Rows no push touches keep the residency they already have — nothing
43
+ rewrites a project that was only pulled.
44
+
45
+ ### Changed
46
+
47
+ - Reject `@distribution(kind: .Packed)` on a List whose `listKind` is
48
+ unordered. An unordered list's membership is the set of live rows carrying
49
+ its id, so its entries occupy no position inside a parent row to be packed
50
+ into.
51
+
52
+ ### Compatibility
53
+
54
+ - Project source format stays 4; the schema contract moves 4.0 to 4.1.
55
+ - The wire and `.neo` workspace state keep storing records in their physical
56
+ form, so merge bases and content hashes are unchanged.
57
+ - A push that edits a value whose member packs now writes the owning row and
58
+ deletes the child's superseded record, where it previously wrote the child
59
+ row. Both plans describe the same logical graph.
60
+
3
61
  ## [0.40.0] - 2026-08-30
4
62
 
5
63
  ### Changed