@neocompose/cli 0.31.0 → 0.31.2

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,21 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.31.2] - 2026-08-14
4
+
5
+ ### Fixed
6
+
7
+ - Allow newly authored `@relations` entries to create internal record
8
+ relations without requiring server-owned project and timestamp fields in
9
+ source, for both pending and explicit relation IDs.
10
+
11
+ ## [0.31.1] - 2026-08-14
12
+
13
+ ### Fixed
14
+
15
+ - `neo script check` now preserves inline Class-body context and callable
16
+ delegate/action member types, so inherited generic selectors, unqualified
17
+ instance/static fields, and action invocation statements compile as authored.
18
+
3
19
  ## [0.31.0] - 2026-08-13
4
20
 
5
21
  ### Added
package/dist/neo.mjs CHANGED
@@ -31333,6 +31333,29 @@ function memberType(member, environment, visiting, field) {
31333
31333
  `${field}.returnType`
31334
31334
  );
31335
31335
  }
31336
+ if (kind === "delegate") {
31337
+ return {
31338
+ kind: "delegate",
31339
+ returnType: manifestReturnType(
31340
+ member.returnType,
31341
+ environment,
31342
+ `${field}.returnType`
31343
+ ),
31344
+ parameterTypes: argumentsList(member.arguments, environment, field).map(
31345
+ (argument2) => argument2.type
31346
+ ),
31347
+ nullable
31348
+ };
31349
+ }
31350
+ if (kind === "action") {
31351
+ return {
31352
+ kind: "action",
31353
+ parameterTypes: argumentsList(member.arguments, environment, field).map(
31354
+ (argument2) => argument2.type
31355
+ ),
31356
+ nullable: false
31357
+ };
31358
+ }
31336
31359
  if (kind === "generic") {
31337
31360
  return typeParameter(
31338
31361
  string2(member.genericParamId, `${field}.genericParamId`),
@@ -31478,10 +31501,14 @@ function scriptContexts(members, environment) {
31478
31501
  const classId = owner?.kind === "classMember" && typeof owner.classId === "string" ? owner.classId : void 0;
31479
31502
  const memberId = string2(member.id, "member.id");
31480
31503
  const isStatic = boolean(member.isStatic, `member ${memberId}.isStatic`);
31504
+ const declaringType = classId ? { kind: "named", typeId: classId } : void 0;
31481
31505
  const context = {
31482
31506
  kind: member.kind === "computed" ? "property" : "function",
31483
31507
  memberId,
31484
- ...!isStatic && classId ? { thisClass: { kind: "named", typeId: classId } } : {},
31508
+ ...declaringType ? { declaringType } : {},
31509
+ ...!isStatic && declaringType ? { thisClass: declaringType } : {},
31510
+ implicitMemberAccess: true,
31511
+ staticMember: isStatic,
31485
31512
  returnType: manifestReturnType(
31486
31513
  member.returnType,
31487
31514
  environment,
@@ -31798,6 +31825,9 @@ function contextFromManifestScript(project, context) {
31798
31825
  kind: context.kind,
31799
31826
  project,
31800
31827
  ...context.thisClass ? { thisClass: context.thisClass } : {},
31828
+ ...context.declaringType ? { declaringType: context.declaringType } : {},
31829
+ ...context.implicitMemberAccess !== void 0 ? { implicitMemberAccess: context.implicitMemberAccess } : {},
31830
+ ...context.staticMember !== void 0 ? { staticMember: context.staticMember } : {},
31801
31831
  ...context.returnType ? { returnType: context.returnType } : {},
31802
31832
  ...context.parameters ? { parameters: context.parameters } : {},
31803
31833
  ...context.deferred !== void 0 ? { deferred: context.deferred } : {},
@@ -79495,7 +79525,7 @@ function createNeoCliPushIntent(change) {
79495
79525
  return createProjectVersionIntent(intentType, { source: "neo-cli" });
79496
79526
  }
79497
79527
  const relationData = change.kind === "delete" ? change.baseData : change.nextData;
79498
- if (!isInternalRecordRelation(relationData)) {
79528
+ if (!isPushIntentInternalRecordRelation(relationData, change.kind)) {
79499
79529
  throw new Error(
79500
79530
  `Cannot push internal record relation "${change.recordId}": ${change.kind} change has invalid relation data.`
79501
79531
  );
@@ -79505,6 +79535,29 @@ function createNeoCliPushIntent(change) {
79505
79535
  relationKind: relationData.relationKind
79506
79536
  });
79507
79537
  }
79538
+ function isPushIntentInternalRecordRelation(value, operation) {
79539
+ if (operation === "create") {
79540
+ return isAuthoredInternalRecordRelation(value);
79541
+ }
79542
+ return isInternalRecordRelation(value);
79543
+ }
79544
+ function isAuthoredInternalRecordRelation(value) {
79545
+ if (!isObjectRecord5(value)) return false;
79546
+ if (!isNonEmptyString3(value.id)) return false;
79547
+ if (!isNonEmptyString3(value.relationKind)) return false;
79548
+ if (!isProjectRecordKind(value.sourceRecordKind)) return false;
79549
+ if (!isNonEmptyString3(value.sourceRecordId)) return false;
79550
+ if (!isProjectRecordKind(value.targetRecordKind)) return false;
79551
+ if (!isNonEmptyString3(value.targetRecordId)) return false;
79552
+ if (value.orderKey === void 0) return true;
79553
+ return isNonEmptyString3(value.orderKey);
79554
+ }
79555
+ function isObjectRecord5(value) {
79556
+ return typeof value === "object" && value !== null && !Array.isArray(value);
79557
+ }
79558
+ function isNonEmptyString3(value) {
79559
+ return typeof value === "string" && value.length > 0;
79560
+ }
79508
79561
  var init_push_change_intent = __esm({
79509
79562
  "src/commands/push-change-intent.ts"() {
79510
79563
  "use strict";
@@ -106471,11 +106524,11 @@ function assertProjectFileAuthoringRecordIdentifiers(recordKind, data) {
106471
106524
  if (recordKind !== "unity-texture-template" && recordKind !== "unity-audio-clip-template") {
106472
106525
  return;
106473
106526
  }
106474
- if (!isObjectRecord5(data) || typeof data.name !== "string") return;
106527
+ if (!isObjectRecord6(data) || typeof data.name !== "string") return;
106475
106528
  const label = recordKind === "unity-texture-template" ? "Unity texture template name" : "Unity audio clip template name";
106476
106529
  assertProjectFileAuthoringIdentifier(data.name, label);
106477
106530
  }
106478
- function isObjectRecord5(value) {
106531
+ function isObjectRecord6(value) {
106479
106532
  return typeof value === "object" && value !== null && !Array.isArray(value);
106480
106533
  }
106481
106534
  var init_project_file_authoring_identifiers = __esm({
@@ -109424,7 +109477,7 @@ var init_registry2 = __esm({
109424
109477
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
109425
109478
  formatVersion: 3,
109426
109479
  contractVersion: "3.12",
109427
- cliVersion: "0.31.0",
109480
+ cliVersion: "0.31.2",
109428
109481
  projectFileUploadBatchSize: 32,
109429
109482
  documentRecords: {
109430
109483
  member: {
@@ -116016,7 +116069,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
116016
116069
  async function main() {
116017
116070
  const args = parseArgs(process.argv.slice(2));
116018
116071
  if (args.command === "--version") {
116019
- console.log("0.31.0");
116072
+ console.log("0.31.2");
116020
116073
  return;
116021
116074
  }
116022
116075
  if (args.command === null || args.command === "help" || args.command === "--help" || args.command === "-h") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.31.0",
3
+ "version": "0.31.2",
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.31.0 -->
12
+ <!-- reviewed-through-cli: 0.31.2 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -83,7 +83,7 @@ wrappers.
83
83
  The marker near the top of `SKILL.md` must exactly match the package version:
84
84
 
85
85
  ```html
86
- <!-- reviewed-through-cli: 0.31.0 -->
86
+ <!-- reviewed-through-cli: 0.31.2 -->
87
87
  ```
88
88
 
89
89
  The quoted version above is checked too, so this instruction cannot go stale
@@ -33,6 +33,9 @@ neo script eval --function Outpost.RefreshUnlock --this-value <id> --args '[3]'
33
33
 
34
34
  Prefer `--json` for automation.
35
35
 
36
+ Inside an inline Class body, unqualified names resolve against that Class;
37
+ invoke delegate and action members directly with `Selector()` or `OnChanged()`.
38
+
36
39
  ## Nullability and ownership
37
40
 
38
41
  Do not access a nullable receiver directly. First narrow it with a condition, or