@neocompose/cli 0.32.2 → 0.32.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,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.32.3] - 2026-08-18
4
+
5
+ ### Fixed
6
+
7
+ - Accept exact-case builtin type tokens such as `Set` and `Dictionary` in
8
+ contextual project identifier slots, including member access and parameter
9
+ references, while continuing to reserve actual NeoScript keywords.
10
+
3
11
  ## [0.32.2] - 2026-08-18
4
12
 
5
13
  ### Fixed
package/dist/neo.mjs CHANGED
@@ -5919,6 +5919,26 @@ var init_strict_compile_error = __esm({
5919
5919
  }
5920
5920
  });
5921
5921
 
5922
+ // ../packages/neoscript-language/src/project-source-identifiers.ts
5923
+ function isValidNeoProjectIdentifier(name) {
5924
+ return PROJECT_IDENTIFIER_PATTERN.test(name) && !PROJECT_RESERVED_NAMES.has(name);
5925
+ }
5926
+ function isNeoProjectReservedName(name) {
5927
+ return PROJECT_RESERVED_NAMES.has(name);
5928
+ }
5929
+ var PROJECT_IDENTIFIER_PATTERN, PROJECT_RESERVED_NAMES;
5930
+ var init_project_source_identifiers = __esm({
5931
+ "../packages/neoscript-language/src/project-source-identifiers.ts"() {
5932
+ "use strict";
5933
+ init_language_spec();
5934
+ PROJECT_IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
5935
+ PROJECT_RESERVED_NAMES = /* @__PURE__ */ new Set([
5936
+ ...NEOSCRIPT_KEYWORDS,
5937
+ ...NEOSCRIPT_BUILTIN_NAMESPACES
5938
+ ]);
5939
+ }
5940
+ });
5941
+
5922
5942
  // ../packages/neoscript-language/src/strict-lexer.ts
5923
5943
  function lex2(source) {
5924
5944
  const tokens = [];
@@ -6463,6 +6483,7 @@ var init_strict_parser = __esm({
6463
6483
  "use strict";
6464
6484
  init_strict_compile_error();
6465
6485
  init_language_spec();
6486
+ init_project_source_identifiers();
6466
6487
  init_strict_lexer();
6467
6488
  Parser = class _Parser {
6468
6489
  constructor(tokens) {
@@ -6501,7 +6522,7 @@ var init_strict_parser = __esm({
6501
6522
  }
6502
6523
  expectMemberName() {
6503
6524
  const token = this.peek();
6504
- if (token.kind === "ident" || token.kind === "keyword" && token.text === "native") {
6525
+ if (token.kind === "ident" || token.kind === "keyword" && (token.text === "native" || isValidNeoProjectIdentifier(token.text))) {
6505
6526
  return this.next();
6506
6527
  }
6507
6528
  throw new CompileError(
@@ -7273,7 +7294,7 @@ var init_strict_parser = __esm({
7273
7294
  }
7274
7295
  while (true) {
7275
7296
  let name = null;
7276
- if ((this.peek().kind === "ident" || this.peek().kind === "keyword" && this.peek().text === "default") && this.peek(1).kind === "punct" && this.peek(1).text === ":") {
7297
+ if ((this.peek().kind === "ident" || this.peek().kind === "keyword" && (this.peek().text === "default" || isValidNeoProjectIdentifier(this.peek().text))) && this.peek(1).kind === "punct" && this.peek(1).text === ":") {
7277
7298
  name = this.next().text;
7278
7299
  this.next();
7279
7300
  }
@@ -7320,7 +7341,7 @@ var init_strict_parser = __esm({
7320
7341
  }
7321
7342
  if (t.kind === "punct" && t.text === ".") {
7322
7343
  this.next();
7323
- const option = this.expect("ident");
7344
+ const option = this.expectMemberName();
7324
7345
  return { kind: "contextualEnum", name: option.text, pos: t.pos };
7325
7346
  }
7326
7347
  if (t.kind === "ident" && t.text === NEOSCRIPT_CONSTRUCTOR_KEYWORD) {
@@ -7424,7 +7445,7 @@ var init_strict_parser = __esm({
7424
7445
  this.expect("punct", ")");
7425
7446
  return inner;
7426
7447
  }
7427
- if (t.kind === "ident") {
7448
+ if (t.kind === "ident" || t.kind === "keyword" && isValidNeoProjectIdentifier(t.text)) {
7428
7449
  this.next();
7429
7450
  return { kind: "ident", name: t.text, pos: t.pos };
7430
7451
  }
@@ -7440,7 +7461,7 @@ var init_strict_parser = __esm({
7440
7461
  this.expect("punct", "{");
7441
7462
  const entries = [];
7442
7463
  while (!(this.peek().kind === "punct" && this.peek().text === "}")) {
7443
- const name = this.expect("ident");
7464
+ const name = this.expectMemberName();
7444
7465
  this.expect("op", "=");
7445
7466
  entries.push({ name: name.text, value: this.parseExpr(), pos: name.pos });
7446
7467
  if (!this.eat("punct", ",")) break;
@@ -25218,7 +25239,7 @@ function validatePersistedName(uri, name, range2, diagnostics, reservedAlreadyCh
25218
25239
  );
25219
25240
  return;
25220
25241
  }
25221
- if (!RESERVED_NAMES2.has(name) || reservedAlreadyChecked) return;
25242
+ if (!isNeoProjectReservedName(name) || reservedAlreadyChecked) return;
25222
25243
  diagnose(
25223
25244
  diagnostics,
25224
25245
  uri,
@@ -26489,12 +26510,13 @@ function diagnose(diagnostics, uri, range2, code, message, relatedInformation) {
26489
26510
  ...relatedInformation?.length ? { relatedInformation } : {}
26490
26511
  });
26491
26512
  }
26492
- var BUILTIN_ARITY, BUILTIN_TYPES, RESERVED_NAMES2;
26513
+ var BUILTIN_ARITY, BUILTIN_TYPES;
26493
26514
  var init_project_source_type_checker = __esm({
26494
26515
  "../packages/neoscript-language/src/project-source-type-checker.ts"() {
26495
26516
  "use strict";
26496
26517
  init_language_spec();
26497
26518
  init_project_source_ast();
26519
+ init_project_source_identifiers();
26498
26520
  BUILTIN_ARITY = /* @__PURE__ */ new Map([
26499
26521
  ["List", 1],
26500
26522
  ["Set", 1],
@@ -26522,10 +26544,6 @@ var init_project_source_type_checker = __esm({
26522
26544
  "NeoAudioClip",
26523
26545
  "ProjectRelation"
26524
26546
  ]);
26525
- RESERVED_NAMES2 = /* @__PURE__ */ new Set([
26526
- ...NEOSCRIPT_KEYWORDS,
26527
- ...NEOSCRIPT_BUILTIN_NAMESPACES
26528
- ]);
26529
26547
  }
26530
26548
  });
26531
26549
 
@@ -27029,7 +27047,7 @@ function collectFlowSymbols(uri, content, ownerName, scopeRange, symbols, diagno
27029
27047
  }
27030
27048
  }
27031
27049
  function collectSymbol(uri, kind, name, range2, annotations, ownerName, symbols, diagnostics, scopeRange, detail, callable2, documentation, staticMember) {
27032
- if (RESERVED_NAMES3.has(name)) {
27050
+ if (isNeoProjectReservedName(name)) {
27033
27051
  diagnostics.push({
27034
27052
  uri,
27035
27053
  range: range2,
@@ -27412,12 +27430,13 @@ function emptyRange2() {
27412
27430
  end: { line: 0, character: 0 }
27413
27431
  };
27414
27432
  }
27415
- var BUILTIN_TYPE_NAMES, RESERVED_NAMES3, SYSTEM_RECORD_ID_PREFIX, RFC_4122_UUID, QUARANTINED_LEGACY_SYSTEM_ID_PREFIXES, QUARANTINED_LEGACY_SYSTEM_RECORD_IDS;
27433
+ var BUILTIN_TYPE_NAMES, SYSTEM_RECORD_ID_PREFIX, RFC_4122_UUID, QUARANTINED_LEGACY_SYSTEM_ID_PREFIXES, QUARANTINED_LEGACY_SYSTEM_RECORD_IDS;
27416
27434
  var init_project_source_analysis = __esm({
27417
27435
  "../packages/neoscript-language/src/project-source-analysis.ts"() {
27418
27436
  "use strict";
27419
27437
  init_language_spec();
27420
27438
  init_pending_id();
27439
+ init_project_source_identifiers();
27421
27440
  init_project_source_parser();
27422
27441
  init_project_source_registry();
27423
27442
  init_project_source_semantics();
@@ -27446,10 +27465,6 @@ var init_project_source_analysis = __esm({
27446
27465
  "NeoAudioClip",
27447
27466
  "ProjectRelation"
27448
27467
  ]);
27449
- RESERVED_NAMES3 = /* @__PURE__ */ new Set([
27450
- ...NEOSCRIPT_KEYWORDS,
27451
- ...NEOSCRIPT_BUILTIN_NAMESPACES
27452
- ]);
27453
27468
  SYSTEM_RECORD_ID_PREFIX = "system_";
27454
27469
  RFC_4122_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u;
27455
27470
  QUARANTINED_LEGACY_SYSTEM_ID_PREFIXES = [
@@ -33719,6 +33734,7 @@ var init_src = __esm({
33719
33734
  init_project();
33720
33735
  init_project_source_ast();
33721
33736
  init_project_source_ignore();
33737
+ init_project_source_identifiers();
33722
33738
  init_project_source_analysis();
33723
33739
  init_project_source_accessors();
33724
33740
  init_project_source_construction_diagnostics();
@@ -47805,9 +47821,9 @@ var init_files = __esm({
47805
47821
 
47806
47822
  // ../src/models/project-source-identifiers.ts
47807
47823
  function isValidProjectSourceIdentifier(value) {
47808
- return typeof value === "string" && isValidNeoIdentifier(value) && isGeneratedCSharpIdentifier(value) && !isGeneratedCSharpReservedKeyword(value);
47824
+ return typeof value === "string" && isValidNeoProjectIdentifier(value) && isGeneratedCSharpIdentifier(value) && !isGeneratedCSharpReservedKeyword(value);
47809
47825
  }
47810
- var init_project_source_identifiers = __esm({
47826
+ var init_project_source_identifiers2 = __esm({
47811
47827
  "../src/models/project-source-identifiers.ts"() {
47812
47828
  "use strict";
47813
47829
  init_src();
@@ -47821,7 +47837,7 @@ function isValidSchemaAuthoredIdentifier(value) {
47821
47837
  var init_schema_identifiers = __esm({
47822
47838
  "../src/models/schema-identifiers.ts"() {
47823
47839
  "use strict";
47824
- init_project_source_identifiers();
47840
+ init_project_source_identifiers2();
47825
47841
  }
47826
47842
  });
47827
47843
 
@@ -53329,7 +53345,7 @@ function isDialogueSourceIdentifier(value) {
53329
53345
  var init_dialogue_source_identifiers = __esm({
53330
53346
  "../src/models/dialogue/dialogue-source-identifiers.ts"() {
53331
53347
  "use strict";
53332
- init_project_source_identifiers();
53348
+ init_project_source_identifiers2();
53333
53349
  }
53334
53350
  });
53335
53351
 
@@ -109307,7 +109323,7 @@ function isObjectRecord5(value) {
109307
109323
  var init_project_file_authoring_identifiers = __esm({
109308
109324
  "../src/models/project-file-authoring-identifiers.ts"() {
109309
109325
  "use strict";
109310
- init_project_source_identifiers();
109326
+ init_project_source_identifiers2();
109311
109327
  }
109312
109328
  });
109313
109329
 
@@ -112251,7 +112267,7 @@ var init_registry2 = __esm({
112251
112267
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
112252
112268
  formatVersion: 3,
112253
112269
  contractVersion: "3.13",
112254
- cliVersion: "0.32.2",
112270
+ cliVersion: "0.32.3",
112255
112271
  projectFileUploadBatchSize: 32,
112256
112272
  documentRecords: {
112257
112273
  member: {
@@ -118846,7 +118862,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
118846
118862
  async function main() {
118847
118863
  const args = parseArgs(process.argv.slice(2));
118848
118864
  if (args.command === "--version") {
118849
- console.log("0.32.2");
118865
+ console.log("0.32.3");
118850
118866
  return;
118851
118867
  }
118852
118868
  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.32.2",
3
+ "version": "0.32.3",
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.32.2 -->
12
+ <!-- reviewed-through-cli: 0.32.3 -->
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.32.2 -->
86
+ <!-- reviewed-through-cli: 0.32.3 -->
87
87
  ```
88
88
 
89
89
  The quoted version above is checked too, so this instruction cannot go stale
@@ -21,6 +21,11 @@ migration, or `.neoflow` file. NeoFlow has its own single-dialogue exception.
21
21
  Persist the declared identifier as the schema name; there is no separate
22
22
  technical/display name. Keep existing IDs stable.
23
23
 
24
+ NeoScript keywords are case-sensitive. Lexer-classified type names remain
25
+ legal in contextual identifier slots, so a member, parameter, or enum option
26
+ may be named `Set` or `Dictionary`; lowercase keywords such as `class` and
27
+ `return`, plus the builtin `Math` namespace, remain reserved.
28
+
24
29
  ```neo
25
30
  @id("interface-named-id")
26
31
  interface INamed {