@neocompose/cli 0.50.2 → 0.50.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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.50.3] - 2026-09-14
|
|
4
|
+
|
|
5
|
+
- Preserve packed siblings when preparing push source identity for new children in an existing value graph. Pending seeds now fill missing rows without replacing reconstructed stored rows.
|
|
6
|
+
- Resolve omitted fields on stored classes without construction records from their shared declaration defaults. CLI validation, NeoScript reads, and editor value cells now agree without adding per-instance overrides or inventing constructor provenance.
|
|
7
|
+
|
|
3
8
|
## [0.50.2] - 2026-09-12
|
|
4
9
|
|
|
5
10
|
- Export Unity C# as separate files named after their generated types. Keep stable identities in the manifest to preserve Unity GUIDs through renames. Preserve unchanged files and their Unity metadata, remove obsolete owned outputs, and share the integrity manifest with editor synchronization.
|
package/dist/neo.mjs
CHANGED
|
@@ -53894,7 +53894,7 @@ function buildDefaultMemberValue(args) {
|
|
|
53894
53894
|
`Cannot create a value of missing class "${effectiveClassId}".`
|
|
53895
53895
|
);
|
|
53896
53896
|
}
|
|
53897
|
-
if (member.payload !== 1 /* Partial */ && typeof effectiveClass.requiredConstructorId === "string" && args.constructorRoot === void 0 && args.authoredRoot === void 0) {
|
|
53897
|
+
if (member.payload !== 1 /* Partial */ && typeof effectiveClass.requiredConstructorId === "string" && args.constructorRoot === void 0 && args.authoredRoot === void 0 && args.declarationRoot !== true) {
|
|
53898
53898
|
throw new Error(
|
|
53899
53899
|
`Class "${effectiveClass.name}" declares a required constructor; provide its constructor arguments.`
|
|
53900
53900
|
);
|
|
@@ -53967,6 +53967,9 @@ function buildDefaultMemberValue(args) {
|
|
|
53967
53967
|
anchorsParentClassPartition = true;
|
|
53968
53968
|
}
|
|
53969
53969
|
if (record4[schemaKey] !== void 0) continue;
|
|
53970
|
+
if (args.declarationRoot === true && !isLiteralValueContent(resolvedChildMember.defaultValue)) {
|
|
53971
|
+
continue;
|
|
53972
|
+
}
|
|
53970
53973
|
if (args.authoredRoot?.suppliedSchemaKeys.has(schemaKey) === true) {
|
|
53971
53974
|
continue;
|
|
53972
53975
|
}
|
|
@@ -81273,10 +81276,10 @@ function materializeMemberDefaultValue(args) {
|
|
|
81273
81276
|
args.readTracking?.recordUnattributableValueRead(
|
|
81274
81277
|
`declaration-owner-resolution:${args.envelope.id}`
|
|
81275
81278
|
);
|
|
81276
|
-
const { valuesById, rootOwners } = declarationInitializerContext(
|
|
81277
|
-
args.document
|
|
81278
|
-
);
|
|
81279
81279
|
const declarationArguments = (member, init, sourceValueId) => {
|
|
81280
|
+
const { valuesById, rootOwners } = declarationInitializerContext(
|
|
81281
|
+
args.document
|
|
81282
|
+
);
|
|
81280
81283
|
const ownerClass = typeof sourceValueId === "string" ? initializerOwnerContext(
|
|
81281
81284
|
args.document,
|
|
81282
81285
|
sourceValueId,
|
|
@@ -81308,6 +81311,7 @@ function materializeMemberDefaultValue(args) {
|
|
|
81308
81311
|
member: args.member,
|
|
81309
81312
|
createdValues,
|
|
81310
81313
|
storageKeyDeclarations,
|
|
81314
|
+
declarationRoot: args.declarationRoot,
|
|
81311
81315
|
...args.genericEnv === void 0 ? {} : { genericEnv: args.genericEnv },
|
|
81312
81316
|
// A declaration default may itself be init-backed one level down (P43 §2),
|
|
81313
81317
|
// and those nested initializers must evaluate against the same document.
|
|
@@ -81750,13 +81754,12 @@ function resolveVirtualInstanceGraph(args) {
|
|
|
81750
81754
|
const effective = {
|
|
81751
81755
|
...mergeExpandedAndMaterializedRow(indexed.expandedRow, materialized),
|
|
81752
81756
|
id: effectiveId,
|
|
81753
|
-
//
|
|
81754
|
-
//
|
|
81757
|
+
// Materialization has already resolved each child's storage partition.
|
|
81758
|
+
// Virtual rows inherit root timestamps; real rows retain their envelope.
|
|
81755
81759
|
...materialized === null ? {
|
|
81756
81760
|
projectId: args.instanceRoot.projectId,
|
|
81757
81761
|
createdAt: args.instanceRoot.createdAt,
|
|
81758
|
-
updatedAt: args.instanceRoot.updatedAt
|
|
81759
|
-
...args.instanceRoot.mapKey === void 0 ? {} : { mapKey: args.instanceRoot.mapKey }
|
|
81762
|
+
updatedAt: args.instanceRoot.updatedAt
|
|
81760
81763
|
} : {}
|
|
81761
81764
|
};
|
|
81762
81765
|
if (isMemberClassBase(indexed.member) && effective.value !== null) {
|
|
@@ -82036,13 +82039,26 @@ function resolvedStoredInstanceRows(args) {
|
|
|
82036
82039
|
const rows = new Map(document.values.map((row) => [row.id, row]));
|
|
82037
82040
|
const materializedIndex = buildVirtualInstanceMaterializedIndex({ document });
|
|
82038
82041
|
const queue = [{ root: args.instanceRoot, member: args.rootMember }];
|
|
82042
|
+
const stored = indexExpansion({
|
|
82043
|
+
document,
|
|
82044
|
+
instanceRoot: args.instanceRoot,
|
|
82045
|
+
rootMember: args.rootMember,
|
|
82046
|
+
expandedRoot: rows.get(args.instanceRoot.id) ?? args.instanceRoot,
|
|
82047
|
+
expandedRows: document.values
|
|
82048
|
+
});
|
|
82049
|
+
for (const node of stored.nodesByPath.values()) {
|
|
82050
|
+
if (node.expandedRow.id === args.instanceRoot.id) continue;
|
|
82051
|
+
if (!isMemberClassBase(node.member)) continue;
|
|
82052
|
+
if (!isStoredClassResolutionRoot(node.expandedRow)) continue;
|
|
82053
|
+
queue.push({ root: node.expandedRow, member: node.member });
|
|
82054
|
+
}
|
|
82039
82055
|
const resolvedRootIds = /* @__PURE__ */ new Set();
|
|
82040
82056
|
const resolvedFrameByValueId = /* @__PURE__ */ new Map();
|
|
82041
82057
|
while (queue.length > 0) {
|
|
82042
82058
|
const next = queue.shift();
|
|
82043
82059
|
if (next === void 0 || resolvedRootIds.has(next.root.id)) continue;
|
|
82044
82060
|
resolvedRootIds.add(next.root.id);
|
|
82045
|
-
const expanded =
|
|
82061
|
+
const expanded = expandStoredClassValue({
|
|
82046
82062
|
evaluateInitializer: args.evaluateInitializer,
|
|
82047
82063
|
document,
|
|
82048
82064
|
instanceRoot: next.root,
|
|
@@ -82089,6 +82105,63 @@ function resolvedStoredInstanceRows(args) {
|
|
|
82089
82105
|
}
|
|
82090
82106
|
return rows;
|
|
82091
82107
|
}
|
|
82108
|
+
function expandStoredClassValue(args) {
|
|
82109
|
+
if (isLiteralValueContent(args.instanceRoot) && isVirtualInstanceRootShape(args.instanceRoot)) {
|
|
82110
|
+
return expandStoredInstance(args);
|
|
82111
|
+
}
|
|
82112
|
+
const root = literalRow(args.instanceRoot);
|
|
82113
|
+
if (root.constructorArgs !== void 0) return expandStoredInstance(args);
|
|
82114
|
+
const member = resolveMember2(args.rootMember, args.document.members);
|
|
82115
|
+
if (!isMemberClassBase(member)) {
|
|
82116
|
+
throw new Error(
|
|
82117
|
+
`Stored default projection member "${memberIdOf(args.rootMember)}" is not Class-valued.`
|
|
82118
|
+
);
|
|
82119
|
+
}
|
|
82120
|
+
if (member.payload === 1 /* Partial */) {
|
|
82121
|
+
return { root, rows: [], pinnedRootSchemaKeys: /* @__PURE__ */ new Set() };
|
|
82122
|
+
}
|
|
82123
|
+
if (root.value === null) {
|
|
82124
|
+
return { root, rows: [], pinnedRootSchemaKeys: /* @__PURE__ */ new Set() };
|
|
82125
|
+
}
|
|
82126
|
+
const classId = root.classId ?? member.classId;
|
|
82127
|
+
args.readRecorder?.recordValueRead(root.id);
|
|
82128
|
+
args.readRecorder?.recordGlobalRead("declaration-default");
|
|
82129
|
+
const materialized = materializeMemberDefaultValue({
|
|
82130
|
+
evaluateInitializer: args.evaluateInitializer,
|
|
82131
|
+
document: args.document,
|
|
82132
|
+
member: closeClassArgumentsFromRowStamp(
|
|
82133
|
+
{
|
|
82134
|
+
...member,
|
|
82135
|
+
classId,
|
|
82136
|
+
defaultValue: derivesContentFromMemberDefault({
|
|
82137
|
+
member,
|
|
82138
|
+
instanceRoot: root,
|
|
82139
|
+
effectiveClassId: classId
|
|
82140
|
+
}) ? member.defaultValue : void 0
|
|
82141
|
+
},
|
|
82142
|
+
root
|
|
82143
|
+
),
|
|
82144
|
+
envelope: root,
|
|
82145
|
+
declarationRoot: true
|
|
82146
|
+
});
|
|
82147
|
+
return {
|
|
82148
|
+
root: { ...root, classId, value: materialized.root.value },
|
|
82149
|
+
rows: materialized.createdValues,
|
|
82150
|
+
pinnedRootSchemaKeys: /* @__PURE__ */ new Set()
|
|
82151
|
+
};
|
|
82152
|
+
}
|
|
82153
|
+
function isStoredClassResolutionRoot(value) {
|
|
82154
|
+
if (!isLiteralValueContent(value)) return false;
|
|
82155
|
+
if (isVirtualInstanceRootShape(value)) return true;
|
|
82156
|
+
return typeof value.classId === "string" && value.value !== null && typeof value.value === "object" && !Array.isArray(value.value);
|
|
82157
|
+
}
|
|
82158
|
+
function storedClassResolutionMember(member, row, members) {
|
|
82159
|
+
const resolved = resolveMember2(member, members);
|
|
82160
|
+
if (isMemberClassBase(resolved)) return resolved;
|
|
82161
|
+
if (resolved.kind !== 21 /* Generic */ || typeof row.classId !== "string")
|
|
82162
|
+
return null;
|
|
82163
|
+
return { ...resolved, kind: 7 /* Class */, classId: row.classId };
|
|
82164
|
+
}
|
|
82092
82165
|
function planVirtualOverrideWrite(args) {
|
|
82093
82166
|
const target = args.graph.locationsById.get(args.valueId);
|
|
82094
82167
|
if (target === void 0) {
|
|
@@ -83569,8 +83642,12 @@ function createHeadlessVirtualInstanceResolver(args) {
|
|
|
83569
83642
|
failedRootIds.add(rootId);
|
|
83570
83643
|
return /* @__PURE__ */ new Map();
|
|
83571
83644
|
}
|
|
83572
|
-
const member =
|
|
83573
|
-
|
|
83645
|
+
const member = storedClassResolutionMember(
|
|
83646
|
+
declaredMember,
|
|
83647
|
+
instanceRoot,
|
|
83648
|
+
document.members
|
|
83649
|
+
);
|
|
83650
|
+
if (member === null || !isLiteralValueContent(instanceRoot)) {
|
|
83574
83651
|
failedRootIds.add(rootId);
|
|
83575
83652
|
return /* @__PURE__ */ new Map();
|
|
83576
83653
|
}
|
|
@@ -83580,7 +83657,7 @@ function createHeadlessVirtualInstanceResolver(args) {
|
|
|
83580
83657
|
document: resolverDocument,
|
|
83581
83658
|
materializedRows: document.values
|
|
83582
83659
|
});
|
|
83583
|
-
const expanded =
|
|
83660
|
+
const expanded = expandStoredClassValue({
|
|
83584
83661
|
evaluateInitializer: args.evaluateInitializer,
|
|
83585
83662
|
document: resolverDocument,
|
|
83586
83663
|
instanceRoot,
|
|
@@ -83622,7 +83699,7 @@ function createHeadlessVirtualInstanceResolver(args) {
|
|
|
83622
83699
|
while (placement !== null) {
|
|
83623
83700
|
args.readRecorder?.recordValueRead(placement.valueId);
|
|
83624
83701
|
const raw = rawById.get(placement.valueId);
|
|
83625
|
-
if (raw !== void 0 && isLiteralValueContent(raw) &&
|
|
83702
|
+
if (raw !== void 0 && isLiteralValueContent(raw) && isStoredClassResolutionRoot(raw)) {
|
|
83626
83703
|
return [...expandRoot(placement.valueId, placement.memberId).values()];
|
|
83627
83704
|
}
|
|
83628
83705
|
placement = placement.parentValueId === null ? null : placements().get(placement.parentValueId) ?? null;
|
|
@@ -84032,6 +84109,12 @@ var init_materialize_values = __esm({
|
|
|
84032
84109
|
});
|
|
84033
84110
|
|
|
84034
84111
|
// ../src/runtime/virtual-instance-values.ts
|
|
84112
|
+
function expandStoredClassValue2(args) {
|
|
84113
|
+
return expandStoredClassValue({
|
|
84114
|
+
...args,
|
|
84115
|
+
evaluateInitializer: evaluateMemberInitializer
|
|
84116
|
+
});
|
|
84117
|
+
}
|
|
84035
84118
|
function expandStoredInstance2(args) {
|
|
84036
84119
|
return expandStoredInstance({
|
|
84037
84120
|
...args,
|
|
@@ -101776,6 +101859,7 @@ var init_project_version_static_value_writes = __esm({
|
|
|
101776
101859
|
dialogueIds = /* @__PURE__ */ new Set();
|
|
101777
101860
|
schemaIndex;
|
|
101778
101861
|
virtualValueIds;
|
|
101862
|
+
declarationMaterializedIndex = null;
|
|
101779
101863
|
stack = /* @__PURE__ */ new Set();
|
|
101780
101864
|
createdCollectionStampByValueId = /* @__PURE__ */ new Map();
|
|
101781
101865
|
/** Built once and reused by every nested construction-root proof. */
|
|
@@ -101902,11 +101986,51 @@ var init_project_version_static_value_writes = __esm({
|
|
|
101902
101986
|
args.genericEnv,
|
|
101903
101987
|
args.path
|
|
101904
101988
|
);
|
|
101905
|
-
this.
|
|
101989
|
+
const resolved = this.resolveDeclaredDefaults(
|
|
101990
|
+
member,
|
|
101991
|
+
value,
|
|
101992
|
+
args.genericEnv
|
|
101993
|
+
);
|
|
101994
|
+
this.validateSemanticNode({ ...args, member, value: resolved });
|
|
101906
101995
|
} finally {
|
|
101907
101996
|
this.stack.delete(value.id);
|
|
101908
101997
|
}
|
|
101909
101998
|
}
|
|
101999
|
+
resolveDeclaredDefaults(member, value, genericEnv) {
|
|
102000
|
+
const closed = substituteMember(member, genericEnv, this.document.members);
|
|
102001
|
+
if (!isMemberClassBase(closed)) return value;
|
|
102002
|
+
if (!isLiteralValueContent(value)) return value;
|
|
102003
|
+
if (value.value === null || typeof value.value !== "object" || Array.isArray(value.value))
|
|
102004
|
+
return value;
|
|
102005
|
+
if (value.instanceConstructorId !== void 0 || value.instanceVariantId != null)
|
|
102006
|
+
return value;
|
|
102007
|
+
if (this.virtualValueIds.has(value.id)) return value;
|
|
102008
|
+
const expanded = expandStoredClassValue2({
|
|
102009
|
+
document: this.merged().document,
|
|
102010
|
+
instanceRoot: value,
|
|
102011
|
+
rootMember: closed
|
|
102012
|
+
});
|
|
102013
|
+
const graph = resolveVirtualInstanceGraph({
|
|
102014
|
+
document: this.merged().document,
|
|
102015
|
+
instanceRoot: value,
|
|
102016
|
+
rootMember: closed,
|
|
102017
|
+
expandedRoot: expanded.root,
|
|
102018
|
+
expandedRows: expanded.rows,
|
|
102019
|
+
materializedIndex: this.declarationMaterializedIndex ??= buildVirtualInstanceMaterializedIndex({
|
|
102020
|
+
document: this.merged().document
|
|
102021
|
+
})
|
|
102022
|
+
});
|
|
102023
|
+
for (const [id2, row] of graph.rowsById) {
|
|
102024
|
+
if (this.valueById.has(id2)) continue;
|
|
102025
|
+
this.valueById.set(id2, row);
|
|
102026
|
+
}
|
|
102027
|
+
const resolved = graph.rowsById.get(value.id);
|
|
102028
|
+
if (resolved === void 0 || !isLiteralValueContent(resolved))
|
|
102029
|
+
return value;
|
|
102030
|
+
if (resolved.value === null || typeof resolved.value !== "object" || Array.isArray(resolved.value))
|
|
102031
|
+
return value;
|
|
102032
|
+
return { ...resolved, value: { ...resolved.value, ...value.value } };
|
|
102033
|
+
}
|
|
101910
102034
|
/**
|
|
101911
102035
|
* A static graph can contain nested construction roots under an ordinary
|
|
101912
102036
|
* list or Class root. Replay each reachable root that carries complete
|
|
@@ -130834,20 +130958,22 @@ function createPendingProjectSourceIdentityV4(workspace, status, authoredValueSe
|
|
|
130834
130958
|
});
|
|
130835
130959
|
}
|
|
130836
130960
|
if (seed.valueId === void 0) continue;
|
|
130837
|
-
records2.
|
|
130838
|
-
|
|
130839
|
-
|
|
130840
|
-
|
|
130841
|
-
|
|
130842
|
-
|
|
130843
|
-
|
|
130844
|
-
|
|
130845
|
-
|
|
130846
|
-
|
|
130847
|
-
|
|
130848
|
-
|
|
130849
|
-
|
|
130961
|
+
if (!records2.has(`value:${seed.valueId}`))
|
|
130962
|
+
records2.set(`value:${seed.valueId}`, {
|
|
130963
|
+
recordKind: "value",
|
|
130964
|
+
recordId: seed.valueId,
|
|
130965
|
+
contentHash: "",
|
|
130966
|
+
deleted: false,
|
|
130967
|
+
data: {
|
|
130968
|
+
id: seed.valueId,
|
|
130969
|
+
projectId: workspace.config.projectId,
|
|
130970
|
+
...encodeStoredValueNode(seed),
|
|
130971
|
+
createdAt: now,
|
|
130972
|
+
updatedAt: now
|
|
130973
|
+
}
|
|
130974
|
+
});
|
|
130850
130975
|
for (const value of seed.values ?? []) {
|
|
130976
|
+
if (records2.has(`value:${value.id}`)) continue;
|
|
130851
130977
|
records2.set(`value:${value.id}`, {
|
|
130852
130978
|
recordKind: "value",
|
|
130853
130979
|
recordId: value.id,
|
|
@@ -132352,7 +132478,7 @@ var init_registry2 = __esm({
|
|
|
132352
132478
|
"schema-contract/registry.mjs"() {
|
|
132353
132479
|
"use strict";
|
|
132354
132480
|
PROJECT_SCHEMA_CONTRACT = Object.freeze({
|
|
132355
|
-
cliVersion: "0.50.
|
|
132481
|
+
cliVersion: "0.50.3",
|
|
132356
132482
|
projectFileUploadBatchSize: 32,
|
|
132357
132483
|
documentRecords: {
|
|
132358
132484
|
member: {
|
|
@@ -139568,7 +139694,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
|
|
|
139568
139694
|
async function main() {
|
|
139569
139695
|
const args = parseArgs(process.argv.slice(2));
|
|
139570
139696
|
if (args.command === "--version") {
|
|
139571
|
-
console.log("0.50.
|
|
139697
|
+
console.log("0.50.3");
|
|
139572
139698
|
return;
|
|
139573
139699
|
}
|
|
139574
139700
|
if (args.command === null || args.command === "help" || args.command === "--help" || args.command === "-h") {
|
package/package.json
CHANGED
|
@@ -88,7 +88,7 @@ wrappers.
|
|
|
88
88
|
The marker near the top of `SKILL.md` must exactly match the package version:
|
|
89
89
|
|
|
90
90
|
```html
|
|
91
|
-
<!-- reviewed-through-cli: 0.50.
|
|
91
|
+
<!-- reviewed-through-cli: 0.50.3 -->
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
The quoted version above is checked too, so this instruction cannot go stale
|
|
@@ -136,6 +136,13 @@ member creates a sparse override with its deterministic projected ID; removing
|
|
|
136
136
|
that member from an existing initializer resets the override and resumes source
|
|
137
137
|
tracking. Require either transition to appear in `neo diff`.
|
|
138
138
|
|
|
139
|
+
A stored class with no construction record still inherits literal declaration
|
|
140
|
+
defaults for omitted fields. For example, `FoodInfo.Quality = .OneStar` supplies
|
|
141
|
+
the quality of an existing food row that stores only its price. Do not add an
|
|
142
|
+
instance override to repair that omission. Reads do not invent a historical
|
|
143
|
+
constructor, and required fields with no applicable default remain errors.
|
|
144
|
+
Explicit stored overrides and partial payloads keep their existing meaning.
|
|
145
|
+
|
|
139
146
|
Generic arguments specify types, not default values. A required generic member
|
|
140
147
|
must be supplied at construction unless its member declaration or an inherited
|
|
141
148
|
member declaration supplies a default. Missing required members are compile
|