@neocompose/cli 0.34.0 → 0.34.1

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,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.34.1] - 2026-08-19
4
+
5
+ ### Fixed
6
+
7
+ - Accept the advertised positional `NeoLookupVariantFolder<TObject, TValue>`
8
+ constructor form and lower it identically to named `path`, `collection`, and
9
+ `collectionValue` arguments.
10
+ - Preserve lookup-variant member `TValue` through the CLI/server document
11
+ boundary under the canonical `valueTypeInfo` field, including an open generic
12
+ parameter authored by an enclosing class.
13
+ - Give `neo test` the candidate project's variants and variant folders, so
14
+ variants declared in the same pending push resolve alongside root values and
15
+ declared list indexes.
16
+
3
17
  ## [0.34.0] - 2026-08-19
4
18
 
5
19
  ### Added
package/dist/neo.mjs CHANGED
@@ -18762,7 +18762,7 @@ var init_project_schema_contract_generated = __esm({
18762
18762
  "../packages/neoscript-language/src/project-schema-contract.generated.ts"() {
18763
18763
  "use strict";
18764
18764
  PROJECT_SCHEMA_MANIFEST_FORMAT_VERSION = 3;
18765
- PROJECT_SCHEMA_MANIFEST_CONTRACT_VERSION = "3.13";
18765
+ PROJECT_SCHEMA_MANIFEST_CONTRACT_VERSION = "3.14";
18766
18766
  PROJECT_FILE_UPLOAD_BATCH_SIZE = 32;
18767
18767
  NEO_PROJECT_SOURCE_RECORD_CONTRACT = {
18768
18768
  "recordFields": {
@@ -18804,7 +18804,7 @@ var init_project_schema_contract_generated = __esm({
18804
18804
  "collectionValueId",
18805
18805
  "declaredTypeInfo",
18806
18806
  "targetTypeInfo",
18807
- "variantValueTypeInfo",
18807
+ "valueTypeInfo",
18808
18808
  "dialogueGroupId",
18809
18809
  "code",
18810
18810
  "setterCode",
@@ -20934,10 +20934,20 @@ var init_project_source_construction_diagnostics = __esm({
20934
20934
  });
20935
20935
 
20936
20936
  // ../packages/neoscript-language/src/project-source-variants.ts
20937
+ function neoLookupVariantFolderArgument(expression, name) {
20938
+ const index = expression.args.findIndex((_, argumentIndex) => {
20939
+ const authoredName = expression.argumentNames?.[argumentIndex];
20940
+ return (authoredName ?? NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS[argumentIndex]?.name ?? null) === name;
20941
+ });
20942
+ return index < 0 ? void 0 : expression.args[index];
20943
+ }
20937
20944
  function neoVariantConstructionSiteCall(className, argumentNames, initializerNames) {
20938
20945
  if (className === NEO_LOOKUP_VARIANT_FOLDER_TYPE_NAME) {
20946
+ const logicalNames = argumentNames.map(
20947
+ (name, index) => name ?? NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS[index]?.name ?? null
20948
+ );
20939
20949
  return {
20940
- argumentNames: argumentNames.filter(
20950
+ argumentNames: logicalNames.filter(
20941
20951
  (name) => name !== "collection" && name !== "collectionValue"
20942
20952
  ),
20943
20953
  initializerNames
@@ -21001,21 +21011,14 @@ function neoVariantFolderAnnotationSymbol(annotations) {
21001
21011
  function folderPath(declaration) {
21002
21012
  const expression = parseInitializer(declaration);
21003
21013
  if (expression === null || expression.kind !== "new") return null;
21004
- const pathIndex = expression.argumentNames?.findIndex(
21005
- (name) => name === "path"
21006
- );
21007
- const argument2 = expression.args[pathIndex !== void 0 && pathIndex >= 0 ? pathIndex : 0];
21014
+ const argument2 = neoLookupVariantFolderArgument(expression, "path");
21008
21015
  if (argument2 === void 0 || argument2.kind !== "litString") return null;
21009
21016
  return argument2.value;
21010
21017
  }
21011
21018
  function folderCollectionPath(declaration) {
21012
21019
  const expression = parseInitializer(declaration);
21013
21020
  if (expression === null || expression.kind !== "new") return null;
21014
- const index = expression.argumentNames?.findIndex(
21015
- (name) => name === "collection"
21016
- );
21017
- if (index === void 0 || index < 0) return null;
21018
- const argument2 = expression.args[index];
21021
+ const argument2 = neoLookupVariantFolderArgument(expression, "collection");
21019
21022
  if (argument2 === void 0) return null;
21020
21023
  const parts = [];
21021
21024
  let cursor = argument2;
@@ -21746,7 +21749,7 @@ function variantDiagnostic(entry, range2, code, message) {
21746
21749
  message
21747
21750
  };
21748
21751
  }
21749
- var NEO_VARIANT_CONSTRUCTOR_ARGUMENTS, NEO_VARIANT_MEMBER_ARGUMENTS, dottedScope;
21752
+ var NEO_VARIANT_CONSTRUCTOR_ARGUMENTS, NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS, NEO_VARIANT_MEMBER_ARGUMENTS, dottedScope;
21750
21753
  var init_project_source_variants = __esm({
21751
21754
  "../packages/neoscript-language/src/project-source-variants.ts"() {
21752
21755
  "use strict";
@@ -21760,6 +21763,11 @@ var init_project_source_variants = __esm({
21760
21763
  "overrides",
21761
21764
  "childOverrides"
21762
21765
  ];
21766
+ NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS = [
21767
+ { name: "path", type: "string" },
21768
+ { name: "collection", type: "List<TValue>" },
21769
+ { name: "collectionValue", type: "Reference<List<TValue>>" }
21770
+ ];
21763
21771
  NEO_VARIANT_MEMBER_ARGUMENTS = /* @__PURE__ */ new Map([
21764
21772
  ["overrides", "Overrides"],
21765
21773
  ["childOverrides", "ChildOverrides"]
@@ -23847,7 +23855,8 @@ function validateExpression(expression, expected, scope, environment, uri, range
23847
23855
  ) ?? [];
23848
23856
  const overload = declaration && declaration.constructors.length > 0 ? matchingDeclaredConstructor(declaration, expression.argumentNames) : null;
23849
23857
  expression.args.forEach((argument2, index) => {
23850
- const named = expression.argumentNames?.[index];
23858
+ const authoredName = expression.argumentNames?.[index];
23859
+ const named = declaration.name === NEO_LOOKUP_VARIANT_FOLDER_TYPE_NAME ? authoredName ?? NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS[index]?.name : authoredName;
23851
23860
  if (declaration.name === NEO_LOOKUP_VARIANT_FOLDER_TYPE_NAME && named === "collection") {
23852
23861
  return;
23853
23862
  }
@@ -29003,11 +29012,7 @@ function projectConstructorArgumentCompletions(analysis, document, position) {
29003
29012
  }
29004
29013
  function lookupVariantFolderArgumentFields(typeName) {
29005
29014
  if (typeName !== NEO_LOOKUP_VARIANT_FOLDER_TYPE_NAME) return null;
29006
- return [
29007
- { name: "path", type: "string" },
29008
- { name: "collection", type: "List<TValue>" },
29009
- { name: "collectionValue", type: "Reference<List<TValue>>" }
29010
- ];
29015
+ return NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS;
29011
29016
  }
29012
29017
  function declaredConstructorNamedArguments(analysis, typeName, used) {
29013
29018
  const contract = classConstructionContract(
@@ -34866,7 +34871,7 @@ var init_document_contracts = __esm({
34866
34871
  "collectionValueId",
34867
34872
  "declaredTypeInfo",
34868
34873
  "targetTypeInfo",
34869
- "variantValueTypeInfo",
34874
+ "valueTypeInfo",
34870
34875
  "dialogueGroupId",
34871
34876
  "code",
34872
34877
  "setterCode",
@@ -34905,6 +34910,7 @@ var init_document_contracts = __esm({
34905
34910
  collectionValueId: "missingIsNullOnFullMember",
34906
34911
  declaredTypeInfo: "nullIsAbsent",
34907
34912
  targetTypeInfo: "nullIsAbsent",
34913
+ valueTypeInfo: "nullIsAbsent",
34908
34914
  dialogueGroupId: "missingIsNullOnFullMember",
34909
34915
  templateId: "missingIsNullOnFullMember",
34910
34916
  setterCode: "nullIsAbsent",
@@ -36335,10 +36341,10 @@ function memberFromDocument(record3, members, owners, classNames, context) {
36335
36341
  record3,
36336
36342
  "targetTypeInfo"
36337
36343
  ),
36338
- valueType: field("variantValueTypeInfo", null) === null ? null : documentTypeToManifest(
36339
- field("variantValueTypeInfo", void 0),
36344
+ valueType: field("valueTypeInfo", null) === null ? null : documentTypeToManifest(
36345
+ field("valueTypeInfo", void 0),
36340
36346
  record3,
36341
- "variantValueTypeInfo"
36347
+ "valueTypeInfo"
36342
36348
  )
36343
36349
  };
36344
36350
  }
@@ -36488,7 +36494,7 @@ function memberToDocumentFields(member, baseData3) {
36488
36494
  }
36489
36495
  if (member.kind === "variant") {
36490
36496
  fields.targetTypeInfo = manifestTypeToDocument(member.targetType);
36491
- fields.variantValueTypeInfo = member.valueType === null ? null : manifestTypeToDocument(member.valueType);
36497
+ fields.valueTypeInfo = member.valueType === null ? null : manifestTypeToDocument(member.valueType);
36492
36498
  }
36493
36499
  if (member.kind === "generic") {
36494
36500
  fields.genericParamId = member.genericParamId;
@@ -39692,10 +39698,10 @@ function assertMember2(value, path) {
39692
39698
  member.valueType,
39693
39699
  `${path}.valueType`
39694
39700
  ).kind;
39695
- if (valueKind !== "class") {
39701
+ if (valueKind !== "class" && valueKind !== "generic") {
39696
39702
  invalid(
39697
39703
  `${path}.valueType.kind`,
39698
- "a lookup variant member's TValue must be a collection entry class."
39704
+ "a lookup variant member's TValue must be a collection entry class or an open generic parameter."
39699
39705
  );
39700
39706
  }
39701
39707
  }
@@ -44154,6 +44160,11 @@ function isMemberVariantBase(value) {
44154
44160
  if (v.targetTypeInfo.type !== 7 /* Class */ && v.targetTypeInfo.type !== 21 /* Generic */) {
44155
44161
  return false;
44156
44162
  }
44163
+ if (v.valueTypeInfo !== void 0 && v.valueTypeInfo !== null && (!isNSTypeInfo(v.valueTypeInfo) || // P68's concrete folder binding resolves to a Class, while an unclosed
44164
+ // owner class can still spell the same TValue as its Generic parameter.
44165
+ v.valueTypeInfo.type !== 7 /* Class */ && v.valueTypeInfo.type !== 21 /* Generic */)) {
44166
+ return false;
44167
+ }
44157
44168
  const defaultValue = v.defaultValue;
44158
44169
  if (defaultValue === void 0 || defaultValue === null) return true;
44159
44170
  if (!isMemberValueBase(defaultValue)) return false;
@@ -60262,13 +60273,11 @@ function folderBinding(context, global) {
60262
60273
  `Lookup variant folder ${global.name} must be declared with new(...).`
60263
60274
  );
60264
60275
  }
60265
- const named = /* @__PURE__ */ new Map();
60266
- expression.args.forEach((argument2, index) => {
60267
- const name = expression.argumentNames?.[index];
60268
- if (name !== void 0 && name !== null) named.set(name, argument2);
60269
- });
60270
- const collection = named.get("collection");
60271
- const collectionValue = named.get("collectionValue");
60276
+ const collection = neoLookupVariantFolderArgument(expression, "collection");
60277
+ const collectionValue = neoLookupVariantFolderArgument(
60278
+ expression,
60279
+ "collectionValue"
60280
+ );
60272
60281
  const collectionPath = collection === void 0 ? null : dottedPath(collection);
60273
60282
  if (collectionPath === null) {
60274
60283
  throw new Error(
@@ -113164,8 +113173,8 @@ var init_registry2 = __esm({
113164
113173
  "use strict";
113165
113174
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
113166
113175
  formatVersion: 3,
113167
- contractVersion: "3.13",
113168
- cliVersion: "0.34.0",
113176
+ contractVersion: "3.14",
113177
+ cliVersion: "0.34.1",
113169
113178
  projectFileUploadBatchSize: 32,
113170
113179
  documentRecords: {
113171
113180
  member: {
@@ -113207,7 +113216,7 @@ var init_registry2 = __esm({
113207
113216
  "collectionValueId",
113208
113217
  "declaredTypeInfo",
113209
113218
  "targetTypeInfo",
113210
- "variantValueTypeInfo",
113219
+ "valueTypeInfo",
113211
113220
  "dialogueGroupId",
113212
113221
  "code",
113213
113222
  "setterCode",
@@ -113246,6 +113255,7 @@ var init_registry2 = __esm({
113246
113255
  collectionValueId: "missingIsNullOnFullMember",
113247
113256
  declaredTypeInfo: "nullIsAbsent",
113248
113257
  targetTypeInfo: "nullIsAbsent",
113258
+ valueTypeInfo: "nullIsAbsent",
113249
113259
  dialogueGroupId: "missingIsNullOnFullMember",
113250
113260
  templateId: "missingIsNullOnFullMember",
113251
113261
  setterCode: "nullIsAbsent",
@@ -114652,6 +114662,8 @@ function sharedEvaluatorBase(rawDocument) {
114652
114662
  enums: document.enums,
114653
114663
  interfaces: document.interfaces,
114654
114664
  constructors,
114665
+ variants: document.variants,
114666
+ variantFolders: document.variantFolders,
114655
114667
  projectFiles: document.projectFiles,
114656
114668
  localizationConfig: document.localizationConfig,
114657
114669
  localizedTexts: document.localizedTexts,
@@ -119764,7 +119776,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
119764
119776
  async function main() {
119765
119777
  const args = parseArgs(process.argv.slice(2));
119766
119778
  if (args.command === "--version") {
119767
- console.log("0.34.0");
119779
+ console.log("0.34.1");
119768
119780
  return;
119769
119781
  }
119770
119782
  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.34.0",
3
+ "version": "0.34.1",
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.34.0 -->
12
+ <!-- reviewed-through-cli: 0.34.1 -->
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.34.0 -->
86
+ <!-- reviewed-through-cli: 0.34.1 -->
87
87
  ```
88
88
 
89
89
  The quoted version above is checked too, so this instruction cannot go stale