@neocompose/cli 0.19.3 → 0.19.5

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,141 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.19.5] - 2026-08-02
4
+
5
+ ### Fixed
6
+
7
+ - `neo pull` no longer fails with `Stored member value … was not pulled` when
8
+ the workspace holds a newly declared stored static member. Its content is
9
+ carried as a seed until a push materializes it, while the member record
10
+ already binds the pending row, so emitting the local side walked a row the
11
+ document does not contain. The seed is overlaid for emission; rows the
12
+ document already carries win.
13
+
14
+ ## [0.19.4] - 2026-08-01
15
+
16
+ ### Added
17
+
18
+ - `neo push --dry-run` rehearses the server's preparation phase — schema-commit
19
+ materialization, seeded structural rows, and whole-graph validation — against
20
+ the pulled document. A rejection that previously cost a real push and
21
+ returned an opaque `preparation-failed` now reports before anything is sent.
22
+ Everything that grades the live head stays server-only.
23
+ - Resolve `Reference<T>(key: "...")` written as a member's declaration default,
24
+ including against a row the same push creates. The key was previously
25
+ persisted verbatim as though it were a row id, so every instance default
26
+ materialized from that member pointed at nothing.
27
+
28
+ ### Changed
29
+
30
+ - A `Reference` call whose sole argument is neither `id:` nor `key:` names
31
+ itself in the error instead of being read as an id.
32
+
33
+ ### Fixed
34
+
35
+ - Seed a member's declaring-class generic environment at every value-graph
36
+ root, in both the static binding graph validator and the authored/default
37
+ seed materializers. An override placed on a generic subclass could not
38
+ compute its own `genericBindings` stamp and stayed unresolved.
39
+ - Admit a project root member as a value-graph root. Root-member seeds were
40
+ admitted and then rejected for having no declaring class, which no root has.
41
+ - Recognize a world placement row's `assetClassId` / `assetValueId` sidecar in
42
+ the schema walkers, and preserve it when the row is rebuilt. Any project with
43
+ authored tile-grid content failed to push.
44
+ - Materialize authored keys before building defaults, so a required slot whose
45
+ declared class is abstract no longer fails when the authored row supplies the
46
+ concrete class.
47
+ - Count a re-authored value row once per graph rather than once per copy. A
48
+ tile grid whose placements were all re-authored reported each row as aliased
49
+ more than once.
50
+ - Resolve a single-select lookup member to its entry type. Its declared type
51
+ rendered as `Set<entry>` regardless of arity, so a conforming initializer
52
+ body was rejected against a type the source never spells.
53
+ - Compile a required constructor's call sites as construction. A P49 class was
54
+ named by `requiredConstructorId` alone, and every route that projects a class
55
+ into the language contract read only `constructorIds`, so an S1 class looked
56
+ like it declared no constructor.
57
+ - Report member-body compile failures with the member, the value row, and the
58
+ authored file and line instead of a bare `1:1:`.
59
+ - Omit `constraint` from a re-emitted unconstrained generic parameter. The
60
+ emitter spelled it `constraint: null` where the stored record has no such
61
+ key, so every generic class differed from itself on every push — which the
62
+ `@system` protection gate rejects as an edit to platform data.
63
+
64
+ ## [0.19.3] - 2026-08-01
65
+
66
+ ### Changed
67
+
68
+ - Enforce the `@system` authoring invariant end to end. The annotation is
69
+ platform-only and belongs to `system_` records; project source must never
70
+ carry it, and an override never inherits it.
71
+
72
+ ### Fixed
73
+
74
+ - Resolve same-push static graph visibility, so a lookup target created by the
75
+ same push is found rather than reported missing.
76
+
77
+ ## [0.19.2] - 2026-08-01
78
+
79
+ ### Changed
80
+
81
+ - `optionKeyOrder` is optional on an enum record, matching the class
82
+ `schemaKeyOrder` and interface `memberKeyOrder` guards. The CLI drops a
83
+ declaration order that equals the natural key order, which for pending option
84
+ ids is exactly the push that creates the enum. No migration: this only widens
85
+ what is accepted.
86
+ - `neo push --dry-run` runs the per-record domain guards over the records it is
87
+ about to send, so a server rejection surfaces locally with the one thing the
88
+ server cannot know — the file it came from. `project-file` and
89
+ `localized-text` creates are deliberately excluded.
90
+
91
+ ## [0.19.1] - 2026-08-01
92
+
93
+ ### Changed
94
+
95
+ - `neo push --dry-run` runs the whole local pipeline, including the emit
96
+ direction: bundle emission, pending-id assignment on a clone, transport
97
+ shapes, upload hashing, and the client-side repeat of the server's commit
98
+ verification. It previously returned before re-emitting records back into
99
+ source, so half of the push had no rehearsal at all.
100
+
101
+ ### Fixed
102
+
103
+ - Seed a member default's generic environment from its declaring class's
104
+ extends chain, and close the same hole in `renderMemberType` on the
105
+ declaration side.
106
+ - Admit the pending-id prefix in the enum option `@id` format check.
107
+ - Hold entry-member and required-constructor ids to the server's re-derivation
108
+ rather than rejecting them at the UUID v4 gate.
109
+ - Hang an unordered row's subtree off the row's own id, so canonical
110
+ reordering no longer draws different pending ids on the authored and
111
+ re-lowered passes.
112
+ - Dedent accessor and function bodies, so one body lowers to the same `code` at
113
+ any nesting depth.
114
+
115
+ ## [0.19.0] - 2026-07-31
116
+
117
+ ### Changed
118
+
119
+ - Reading through a nullable receiver is a compile error. The escapes are the
120
+ constructs the grammar already had: postfix `!`, `?.`, `??`, and null-check
121
+ flow narrowing.
122
+ - A `Reference` write into a narrowed lookup requires the target row's class to
123
+ be assignable to the declared type, across the id form, the key form, and
124
+ constructor projections.
125
+
126
+ ### Fixed
127
+
128
+ - Type a lookup from its stored `declaredType` rather than its collection
129
+ entry, and stop typing every single-select lookup nullable regardless of
130
+ requiredness.
131
+ - Type an abstract `NSProperty` contract from its `returnTypeInfo` as a
132
+ read-only computed property instead of `unknown` and writable.
133
+ - Position construction-site diagnostics at their source slot rather than
134
+ collapsing to the root `new()`, and record all nine constructor-projection
135
+ argument failures as positioned, coded lowering failures.
136
+ - Identify member-body compile errors by class, member, and body kind, mapped
137
+ to the declaring `.neo` file and absolute position.
138
+
3
139
  ## [0.18.0] - 2026-07-31
4
140
 
5
141
  ### 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