@neocompose/cli 0.89.6 → 0.89.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.89.6",
3
+ "version": "0.89.8",
4
4
  "description": "Neo Compose native project-source CLI with bidirectional sync.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -9,7 +9,7 @@ description: >-
9
9
  `@neocompose/cli` or `node cli/bin/neo.mjs` in the neo-compose repository.
10
10
  ---
11
11
 
12
- <!-- reviewed-through-cli: 0.89.6 -->
12
+ <!-- reviewed-through-cli: 0.89.8 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -118,6 +118,11 @@ codec reads when changing either projection. Class-generic results whose binding
118
118
  is known only at runtime use the SDK generic reader, including recursive tuple,
119
119
  collection, enum, and reference projections; scalar conversion alone is insufficient.
120
120
 
121
+ Direct class-constrained `Reference<T>` and `Set<Reference<T>>` fields emit concrete
122
+ accessors using the SDK generic reader, even while the declaring class leaves `T`
123
+ open. Only authored abstract declarations emit abstract members. Compile the
124
+ open class and exercise direct, inherited, closed, and read-only instances.
125
+
121
126
  A stored `Reference<T>` implementing an inherited get-only `T` property emits a
122
127
  value getter that reads the reference target. Keep its interface and field tokens
123
128
  on the inherited type, and compile both open and closed generic overrides.
@@ -138,7 +143,7 @@ The marker near the top of `SKILL.md` must exactly match the package version,
138
143
  and this quoted copy is checked too:
139
144
 
140
145
  ```html
141
- <!-- reviewed-through-cli: 0.89.6 -->
146
+ <!-- reviewed-through-cli: 0.89.8 -->
142
147
  ```
143
148
 
144
149
  Keep this skill on current behavior. Upgrade steps, rollout prerequisites,
@@ -178,3 +183,7 @@ affected full-project candidate; Vitest doesn't replace it. Run
178
183
  formatted files.
179
184
 
180
185
  Class collection assignment must validate all incoming owned entries before replacing a stored row or changing its aliases. Keep caught-rejection, late-entry failure, duplicate-row, and successful retry controls in `class-collection-assignment.test.ts`.
186
+
187
+ Nested insertion must reject duplicate or already-owned descendants before publishing rows or changing aliases. Keep partial-encoding retry and removed List/Set/Dictionary alias controls in `nested-collection-insertion.test.ts`; Reference entries continue to share targets, including unbacked local collection handles. Include local Set references, whose closed target can lower to Lookup. Check alternating shared targets and target writes as well as indexing costs, and preserve identity-based removal through generic bindings. Selection edges remain in the reference graph but must not supply a target's owned placement or generic environment. Keep backed Set payloads distinct from single-Reference cells; cover Dictionary, List and Set target mutations and owned attachment/removal when measuring incremental index work. Raw parent links preserve duplicate edges and insertion order; removing an actual owner must not scan unchanged selection parents. Preserve incremental indexing through target-list sorting and entry writes, including explicit per-entry row provenance. Include plain scalar List and Dictionary entry writes after assignment or Add, without rebuilding unrelated Reference cells. Indexed Reference assignment must preserve each selection cell and the closed stored entry contract, including removed generic aliases. Keep scalar Slot assignments distinct from backed Handle Reference assignments: a missing Dictionary key assigned a backed Handle needs its closed Lookup contract and an independent selection cell. Inline-to-backed Reference reassignment must create a selection cell rather than attach its target. Scalar field writes update only their exact raw edges while retaining write receipts and conservative fallback for unindexed or non-scalar values.
188
+
189
+ Closed collection Reference exports must include the physical target graph, including plain-string Set entries. Keep minimal target-only exports and existing-descriptor dependency completion in `reference-target-descriptors.test.ts` and `compiled-construction-types.test.ts`; do not seed unrelated constructions to satisfy export coverage.
@@ -142,6 +142,10 @@ class Child(string name) : Base {
142
142
  explicitly when needed.
143
143
  - Base-constructor arguments use the constructed class's concrete generic
144
144
  bindings, including an `Item<T>` parameter forwarded through its base chain.
145
+ - Recording a constructor argument does not claim ownership. An initializer
146
+ may pass it to a nested constructor or attach it to a collection while
147
+ retaining its identity. Giving the same aggregate two owned fields or
148
+ collection positions still requires an explicit `Clone()`.
145
149
  - Constraints may construct another generic from a sibling parameter:
146
150
 
147
151
  ```neo
@@ -3,6 +3,11 @@
3
3
  Member defaults: what they may read, when they compute, generic and
4
4
  Immutable construction, and edits to stored constructions.
5
5
 
6
+ Object initializer fields indent one level below the construction's header,
7
+ including inside call arguments. The opening brace may be on the header line
8
+ or the following line. Multiline argument lists retain their continuation
9
+ indentation, using the project's configured spaces or tabs.
10
+
6
11
  ## Initializer scope
7
12
 
8
13
  - Field initializers may read their class's static members unqualified,
@@ -28,6 +33,10 @@ Immutable construction, and edits to stored constructions.
28
33
 
29
34
  ## Computed initializers
30
35
 
36
+ The editor checks computed defaults with the same expression resolver as push.
37
+ Unknown names, missing members, invalid type arguments, and expression type
38
+ errors appear at the offending initializer expression, including nested defaults.
39
+
31
40
  A default that isn't a closed literal stores as a computed initializer and
32
41
  replays for omitted members in push, web, and SDK. A stored override stays
33
42
  pinned until reset.
@@ -4,6 +4,10 @@ Queries and mutations on `List`, `Set`, and `Dictionary` values. Collection
4
4
  declarations and storage live in
5
5
  [member kinds](../declarations/member-kinds.md).
6
6
 
7
+ Collections have no constructors. Initialize List and Set members with `[]`
8
+ and Dictionary members with `{}`, including static members. Writing `new()`
9
+ reports an editor diagnostic with the appropriate empty literal before push.
10
+
7
11
  ## Counting and matching
8
12
 
9
13
  - `items.Count` and `items.Count()` give the size; `items.Count(pred)` counts
@@ -43,7 +47,9 @@ return this.Beds
43
47
  snapshot through a writable alias makes `ThenBy` throw until a new `OrderBy`.
44
48
  - Negative skip/take counts behave as zero.
45
49
  - Read-only results keep entry identity and grant no extra write access to
46
- entries.
50
+ entries. Declared index lookups (`items.Index.Name[key]`) preserve the source
51
+ entries' write permissions: writable fields can be updated through unique
52
+ results or a bucket's entries, while bucket membership stays read-only.
47
53
 
48
54
  ## Reductions
49
55
 
@@ -69,6 +75,8 @@ return this.Beds
69
75
 
70
76
  These apply to writable collections and are statements:
71
77
 
78
+ - String-keyed dictionaries accept any string, including `__proto__` and
79
+ `constructor`, in both indexed assignment and `Add(key, value)`.
72
80
  - `items.Add(value)` appends an entry. An aggregate already owned by another
73
81
  entry or field can't be added again. Add a new value, or `Clone()` a class
74
82
  instance.