@neocompose/cli 0.89.1 → 0.89.3

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.1",
3
+ "version": "0.89.3",
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.1 -->
12
+ <!-- reviewed-through-cli: 0.89.3 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -109,7 +109,7 @@ The marker near the top of `SKILL.md` must exactly match the package version,
109
109
  and this quoted copy is checked too:
110
110
 
111
111
  ```html
112
- <!-- reviewed-through-cli: 0.89.1 -->
112
+ <!-- reviewed-through-cli: 0.89.3 -->
113
113
  ```
114
114
 
115
115
  Keep this skill on current behavior. Upgrade steps, rollout prerequisites,
@@ -17,6 +17,9 @@ Immutable construction, and edits to stored constructions.
17
17
  own their value; use `Clone()` or `Reference`.
18
18
  - Inherited initializers read parameters from the constructor that declared
19
19
  them; a storage-only override keeps that scope.
20
+ - Editing a header constructor recompiles dependent child initializers in the
21
+ new scope, including unchanged children with explicit IDs. Keep those IDs
22
+ when adding an optional parameter and updating the child expression.
20
23
  - Omitted constructor fields use their defaults. Writable collection defaults
21
24
  belong to each instance. Fields without defaults stay absent, and `null`
22
25
  arguments to generated member-wise constructors mean omission.
@@ -104,4 +104,7 @@ Each position has a derived descriptor; author no descriptor IDs. Relabeling
104
104
  keeps identity. Changing arity or moving positions needs a migration. A
105
105
  required tuple without a default must be supplied at construction. Owned
106
106
  class and collection elements follow the single-owner rule. Tuple
107
- expressions are in [types and narrowing](../neoscript/types-and-narrowing.md#tuples).
107
+ elements may use constructed generic classes, such as `(GBox<int>?, int)`.
108
+ Unity exports preserve these type arguments, including forwarded arguments
109
+ such as `GBox<T>` inside a generic class.
110
+ Tuple expressions are in [types and narrowing](../neoscript/types-and-narrowing.md#tuples).
@@ -69,6 +69,9 @@ return this.Beds
69
69
 
70
70
  These apply to writable collections and are statements:
71
71
 
72
+ - `items.Add(value)` appends an entry. An aggregate already owned by another
73
+ entry or field can't be added again. Add a new value, or `Clone()` a class
74
+ instance.
72
75
  - `items.Insert(index, value)` accepts 0 through `items.Count` (append);
73
76
  other indices throw.
74
77
  - `items.Remove(value)` removes the first equal entry; a missing value is a
@@ -39,6 +39,14 @@ Numbers format only with an explicit format: `D<n>` (int only, zero-padded),
39
39
  value, decimal rounds half away from zero, and an all-zero result has no `-`.
40
40
  For plain text, interpolate: `$"{value}"`.
41
41
 
42
+ Vector and Color interpolation follows Unity's default `ToString`: float
43
+ vectors use two decimals, integer vectors use integer coordinates, and colors
44
+ use `RGBA(r, g, b, a)` with three decimals. These use Unity's seven significant
45
+ digits and midpoint-away-from-zero rounding, including through a type parameter.
46
+ For example, `new Vector2(1.005, 2)` interpolates as `(1.01, 2.00)`.
47
+ Sequences print `<IEnumerable<T> unenumerated>` or `<IEnumerator<T> unenumerated>`;
48
+ formatting never advances them.
49
+
42
50
  ## Int-to-float conversion
43
51
 
44
52
  An int assigned to `float` rounds to float32. This applies to arguments,
@@ -89,6 +89,10 @@ classes (`Box<int> box = new(1);`). Explicit lambda parameter types accept
89
89
  the full declaration grammar, including `decimal`, generics, collections, and
90
90
  nullables.
91
91
 
92
+ Inherited tuple types use the subclass's generic bindings, including nested
93
+ tuple elements. For `Ints : G<int>` and `G<T>.Items` declared as
94
+ `Set<(T,int)>`, `new Ints().Items.Add((7,1))` accepts an `int` in the first slot.
95
+
92
96
  ## Tuples
93
97
 
94
98
  ```neo
@@ -105,7 +109,13 @@ var score = positions.Select(((r, c)) => r + c);
105
109
  discards. Assignment deconstruction is unsupported.
106
110
  - Equality is recursive by element; decimal scale is ignored, classes and
107
111
  collections compare by identity.
112
+ - Strings inside tuple sets may use the default localized format. Stored
113
+ uniqueness compares text IDs or literal strings; runtime equality compares
114
+ the text read in the active locale. Translations can make distinct stored
115
+ entries compare equal. Direct `Set<string>` entries still require `.Plain`.
108
116
  - `(int, int)?` is a nullable tuple; `(int?, int)` has a nullable element.
117
+ - Tuples can bind class type parameters, including named and nested tuples:
118
+ `Box<(int Key, (string Label, int Count) Detail)>`.
109
119
 
110
120
  Stored tuple members are covered in
111
121
  [member kinds](../declarations/member-kinds.md#stored-tuples).
@@ -57,7 +57,9 @@ and its source. An unrecognized Unity version produces a baseline warning.
57
57
 
58
58
  Closed instance extension functions can generate classic C# extension methods.
59
59
  Interface receivers, open receiver types, static extensions, and computed
60
- extension properties require C# 14. Export omits an unavailable wrapper and
61
- reports its member ID, receiver, and missing capability. It keeps the member
62
- available to the NeoScript evaluators and SDK direct invocation API. Changing
60
+ extension properties require C# 14. Export summarizes these omitted wrappers in
61
+ one warning with the affected member count. Other wrapper warnings remain
62
+ individual, and export diagnostics retain member IDs, receivers, and missing
63
+ capabilities. The members remain available to the NeoScript evaluators and SDK
64
+ direct invocation API. Changing
63
65
  the target regenerates wrappers and removes obsolete owned wrapper files.
@@ -66,6 +66,13 @@ public Reference<NeoVariant<Tree>> Look = root.Garden.Felled;
66
66
  - `Set<Reference<T>>` selections can mix bare paths and explicit references.
67
67
  Computed selections deduplicate by target identity, not by current value.
68
68
  A literal selection of fixed targets must not repeat the same target.
69
+ A selection literal may also evaluate its entries, for example
70
+ `[root.Assets.Items.First(), selected]`. Those entries must resolve to
71
+ existing objects; the selection evaluates when its owner is constructed.
72
+ A compatible `Set<T>` path is a computed selection, including a set of a
73
+ derived class assigned to `Set<Reference<Base>>`. Each selected object keeps
74
+ its identity; the selection does not acquire the source collection's row.
75
+ Convert a `List<T>` to a set with `.ToSet()`.
69
76
  - A bare path to an existing reference copies its current target when the
70
77
  object is constructed. Later rebinding of that source reference does not
71
78
  rebind the copy.