@neocompose/cli 0.77.1 → 0.78.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.77.1",
3
+ "version": "0.78.0",
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.77.1 -->
12
+ <!-- reviewed-through-cli: 0.78.0 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -129,7 +129,7 @@ wrappers.
129
129
  The marker near the top of `SKILL.md` must exactly match the package version:
130
130
 
131
131
  ```html
132
- <!-- reviewed-through-cli: 0.77.1 -->
132
+ <!-- reviewed-through-cli: 0.78.0 -->
133
133
  ```
134
134
 
135
135
  The quoted version above is checked too, so this instruction cannot go stale
@@ -91,7 +91,7 @@ Use context-aware typed annotations:
91
91
  - `@visibility(.Hidden)` only on a class; absence means visible.
92
92
  - Stateful settings use contextual enum cases, such as
93
93
  `@settings(format: .Plain)` and `@settings(kind: .Unordered)`.
94
- - `@settings(...)` before a `List` element or `Dictionary` value type
94
+ - `@settings(...)` before a `List` or `Set` element or `Dictionary` value type
95
95
  configures the collection's entries: `List<@settings(format: .Plain) string>`,
96
96
  `Dictionary<string, @settings(min: 0) int>`. Only the member that declares
97
97
  the collection spells them; overrides share its entries.
@@ -271,6 +271,36 @@ A `Reference<T>` member satisfies an interface `T Foo { get; }` or
271
271
 
272
272
  Constructor and function parameters use `Set<T>` for several selections.
273
273
 
274
+ ### Set members
275
+
276
+ `Set<T>` is an insertion-ordered collection that can't hold duplicates. The
277
+ element picks the storage:
278
+
279
+ - An enum `Set<Trait>` is a multi-select Enum.
280
+ - `Set<Reference<T>>` is a multi-select lookup.
281
+ - `Set<NeoDialogueReference>` is a multi-select dialogue lookup.
282
+ - Any other element makes an owned Set whose entries are rows, like a List.
283
+
284
+ An owned Set holds `bool`, `int`, `float`, `decimal`,
285
+ `@settings(format: .Plain) string`, vectors, `Color`, sprites, audio clips,
286
+ or a class. Elements can't be nullable, collections, variants, delegates,
287
+ actions, or interfaces. A class entry is unique by row, a value entry by its
288
+ value. `@index` and `@column` work as on a List; `kind:` is an error, since a
289
+ Set is always insertion-ordered.
290
+
291
+ ```neo
292
+ @index(member: Slug, kind: .Unique)
293
+ public Set<Quest> ActiveQuests = [];
294
+ public Set<int> LuckyNumbers = [3, 7];
295
+ public Set<Trait> Traits = [.Brave];
296
+ ```
297
+
298
+ `selection:` is an error everywhere: `Set<T>` selects many and `T` selects
299
+ one. The language server's quick fix rewrites `@settings(selection: .Multi)`
300
+ to a `Set<…>` type. A default literal that repeats a value fails `push`, and a
301
+ `List<Trait>` stays an ordered List of enum values. Queries over a Set, such
302
+ as `Where` and `OrderBy`, return a Set; `ToSet()` turns a List into one.
303
+
274
304
  Declare a multicast event as `NeoAction<…>`. Its value is an ordered listener
275
305
  set, so give it a bracketed list of method groups — never a lambda, and never
276
306
  a bare method group — and never mark it `required`: the rest state is the
@@ -312,6 +312,11 @@ different. The name must end with the binary's extension, because pull
312
312
  rebuilds the file's path from it. With no template annotation, the CLI persists the complete built-in
313
313
  Unity defaults for the file kind.
314
314
 
315
+ Template-backed Unity settings may contain sparse nested override values and leaf
316
+ paths such as `platformSettings.standalone.maxTextureSize` or
317
+ `spriteSettings.pivot.x`. Preserve these paths during synchronization so untouched
318
+ settings continue inheriting from the template.
319
+
315
320
  A top-level `NeoImage` or `NeoAudioClip` declaration in any definition file
316
321
  can stand in for an inline entry. The registry lists it by name
317
322
  (`NeoAudioClip SwordHit = SWORD_HIT;`), and the declaration carries the `@id`,