@neocompose/cli 0.19.3 → 0.19.4

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,130 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.19.4] - 2026-08-01
4
+
5
+ ### Added
6
+
7
+ - `neo push --dry-run` rehearses the server's preparation phase — schema-commit
8
+ materialization, seeded structural rows, and whole-graph validation — against
9
+ the pulled document. A rejection that previously cost a real push and
10
+ returned an opaque `preparation-failed` now reports before anything is sent.
11
+ Everything that grades the live head stays server-only.
12
+ - Resolve `Reference<T>(key: "...")` written as a member's declaration default,
13
+ including against a row the same push creates. The key was previously
14
+ persisted verbatim as though it were a row id, so every instance default
15
+ materialized from that member pointed at nothing.
16
+
17
+ ### Changed
18
+
19
+ - A `Reference` call whose sole argument is neither `id:` nor `key:` names
20
+ itself in the error instead of being read as an id.
21
+
22
+ ### Fixed
23
+
24
+ - Seed a member's declaring-class generic environment at every value-graph
25
+ root, in both the static binding graph validator and the authored/default
26
+ seed materializers. An override placed on a generic subclass could not
27
+ compute its own `genericBindings` stamp and stayed unresolved.
28
+ - Admit a project root member as a value-graph root. Root-member seeds were
29
+ admitted and then rejected for having no declaring class, which no root has.
30
+ - Recognize a world placement row's `assetClassId` / `assetValueId` sidecar in
31
+ the schema walkers, and preserve it when the row is rebuilt. Any project with
32
+ authored tile-grid content failed to push.
33
+ - Materialize authored keys before building defaults, so a required slot whose
34
+ declared class is abstract no longer fails when the authored row supplies the
35
+ concrete class.
36
+ - Count a re-authored value row once per graph rather than once per copy. A
37
+ tile grid whose placements were all re-authored reported each row as aliased
38
+ more than once.
39
+ - Resolve a single-select lookup member to its entry type. Its declared type
40
+ rendered as `Set<entry>` regardless of arity, so a conforming initializer
41
+ body was rejected against a type the source never spells.
42
+ - Compile a required constructor's call sites as construction. A P49 class was
43
+ named by `requiredConstructorId` alone, and every route that projects a class
44
+ into the language contract read only `constructorIds`, so an S1 class looked
45
+ like it declared no constructor.
46
+ - Report member-body compile failures with the member, the value row, and the
47
+ authored file and line instead of a bare `1:1:`.
48
+ - Omit `constraint` from a re-emitted unconstrained generic parameter. The
49
+ emitter spelled it `constraint: null` where the stored record has no such
50
+ key, so every generic class differed from itself on every push — which the
51
+ `@system` protection gate rejects as an edit to platform data.
52
+
53
+ ## [0.19.3] - 2026-08-01
54
+
55
+ ### Changed
56
+
57
+ - Enforce the `@system` authoring invariant end to end. The annotation is
58
+ platform-only and belongs to `system_` records; project source must never
59
+ carry it, and an override never inherits it.
60
+
61
+ ### Fixed
62
+
63
+ - Resolve same-push static graph visibility, so a lookup target created by the
64
+ same push is found rather than reported missing.
65
+
66
+ ## [0.19.2] - 2026-08-01
67
+
68
+ ### Changed
69
+
70
+ - `optionKeyOrder` is optional on an enum record, matching the class
71
+ `schemaKeyOrder` and interface `memberKeyOrder` guards. The CLI drops a
72
+ declaration order that equals the natural key order, which for pending option
73
+ ids is exactly the push that creates the enum. No migration: this only widens
74
+ what is accepted.
75
+ - `neo push --dry-run` runs the per-record domain guards over the records it is
76
+ about to send, so a server rejection surfaces locally with the one thing the
77
+ server cannot know — the file it came from. `project-file` and
78
+ `localized-text` creates are deliberately excluded.
79
+
80
+ ## [0.19.1] - 2026-08-01
81
+
82
+ ### Changed
83
+
84
+ - `neo push --dry-run` runs the whole local pipeline, including the emit
85
+ direction: bundle emission, pending-id assignment on a clone, transport
86
+ shapes, upload hashing, and the client-side repeat of the server's commit
87
+ verification. It previously returned before re-emitting records back into
88
+ source, so half of the push had no rehearsal at all.
89
+
90
+ ### Fixed
91
+
92
+ - Seed a member default's generic environment from its declaring class's
93
+ extends chain, and close the same hole in `renderMemberType` on the
94
+ declaration side.
95
+ - Admit the pending-id prefix in the enum option `@id` format check.
96
+ - Hold entry-member and required-constructor ids to the server's re-derivation
97
+ rather than rejecting them at the UUID v4 gate.
98
+ - Hang an unordered row's subtree off the row's own id, so canonical
99
+ reordering no longer draws different pending ids on the authored and
100
+ re-lowered passes.
101
+ - Dedent accessor and function bodies, so one body lowers to the same `code` at
102
+ any nesting depth.
103
+
104
+ ## [0.19.0] - 2026-07-31
105
+
106
+ ### Changed
107
+
108
+ - Reading through a nullable receiver is a compile error. The escapes are the
109
+ constructs the grammar already had: postfix `!`, `?.`, `??`, and null-check
110
+ flow narrowing.
111
+ - A `Reference` write into a narrowed lookup requires the target row's class to
112
+ be assignable to the declared type, across the id form, the key form, and
113
+ constructor projections.
114
+
115
+ ### Fixed
116
+
117
+ - Type a lookup from its stored `declaredType` rather than its collection
118
+ entry, and stop typing every single-select lookup nullable regardless of
119
+ requiredness.
120
+ - Type an abstract `NSProperty` contract from its `returnTypeInfo` as a
121
+ read-only computed property instead of `unknown` and writable.
122
+ - Position construction-site diagnostics at their source slot rather than
123
+ collapsing to the root `new()`, and record all nine constructor-projection
124
+ argument failures as positioned, coded lowering failures.
125
+ - Identify member-body compile errors by class, member, and body kind, mapped
126
+ to the declaring `.neo` file and absolute position.
127
+
3
128
  ## [0.18.0] - 2026-07-31
4
129
 
5
130
  ### Added
package/README.md CHANGED
@@ -5,10 +5,12 @@ web editor. Working-copy format 4 is Neo-native: `.neo` defines the project
5
5
  model and authored values, `.neoflow` defines dialogue flows, and managed image
6
6
  and audio files stay as ordinary binaries.
7
7
 
8
- The complete contract is in
9
- [`specs/neo-project-source-authoring.md`](https://github.com/ryanbliss/neo-compose-specs/tree/main/new-features/complete/neo-project-source-authoring.md).
10
- The concise agent workflow is in
8
+ The current agent authoring guide is in
11
9
  [`cli/skills/neocompose-cli/SKILL.md`](skills/neocompose-cli/SKILL.md).
10
+ Feature specs in
11
+ [`neo-compose-specs/new-features`](https://github.com/ryanbliss/neo-compose-specs/tree/main/new-features)
12
+ document design intent and edge cases; the released compiler, contract, and
13
+ tests are the executable source of truth.
12
14
 
13
15
  ## Source architecture
14
16
 
@@ -142,8 +144,9 @@ The source identifier is the persisted name. `@settings` and `@storage` are
142
144
  typed by their declaration context; invalid fields and enum cases are
143
145
  diagnostics. Swift-like `.EnumCase` syntax works whenever the expected enum
144
146
  type is known. Focused annotations such as `@id`, `@locked`, `@hidden`,
145
- `@system`, and `@relations` carry cross-cutting behavior. `@hidden` marks a
146
- class the member selector and classes tree leave out; absent means visible.
147
+ and `@relations` carry cross-cutting behavior. Never author `@system`; it is
148
+ reserved for platform-owned system records. `@hidden` marks a class the member
149
+ selector and classes tree leave out; absent means visible.
147
150
 
148
151
  Lists take repeatable `@index` and `@column` annotations naming a field on the
149
152
  entry class. An index requires a non-localizable `string` or a single-select
@@ -187,12 +190,10 @@ is no `ValueRegistry` or generated `Values` namespace.
187
190
  @storage(allowed: .Immutable)
188
191
  class Assets {
189
192
  @id("capitol-member-id")
190
- static Outpost Capitol =
191
- @id("capitol-value-id")
192
- new {
193
- Name = "Capitol",
194
- Image = Images.Capitol.Slice(0),
195
- };
193
+ static Outpost Capitol = new {
194
+ Name = "Capitol",
195
+ Image = Images.Capitol.Slice(0),
196
+ };
196
197
 
197
198
  @id("home-getter-id")
198
199
  static Outpost Home {
@@ -203,13 +204,17 @@ class Assets {
203
204
  }
204
205
  ```
205
206
 
207
+ The member ID anchors the stored binding; do not add a second ID to the static
208
+ initializer. Nested class and collection rows remain independently identified.
209
+
206
210
  Defaults materialize once when a value is created. Existing instances do not
207
211
  stay linked to later class-default changes. Logical lookup/dialogue references
208
212
  use the native typed intrinsic:
209
213
 
210
214
  ```neo
211
215
  Reference(Assets.Capitol)
212
- Reference<Outpost>(id: "capitol-value-id")
216
+ Reference(root.Assets.Cosmetics.Pants)
217
+ Reference<PantsAsset>(key: "pants.long")
213
218
  Reference<Dialogue>(id: "dialogue-id")
214
219
  ```
215
220