@neocompose/cli 0.32.1 → 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 +16 -0
- package/dist/neo.mjs +50 -24
- package/package.json +1 -1
- package/skills/neocompose-cli/SKILL.md +1 -1
- package/skills/neocompose-cli/references/cli-development.md +1 -1
- package/skills/neocompose-cli/references/declarations-and-construction.md +5 -0
- package/skills/neocompose-cli/references/neoscript.md +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
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
|
+
|
|
11
|
+
## [0.32.2] - 2026-08-18
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- Preserve abstract NeoScript functions as `NSFunction` declarations when
|
|
16
|
+
lowering prospective project candidates, so concrete overrides inherit their
|
|
17
|
+
signature during `neo test` and push validation.
|
|
18
|
+
|
|
3
19
|
## [0.32.1] - 2026-08-18
|
|
4
20
|
|
|
5
21
|
### 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.
|
|
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.
|
|
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 (!
|
|
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
|
|
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 (
|
|
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,
|
|
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" &&
|
|
47824
|
+
return typeof value === "string" && isValidNeoProjectIdentifier(value) && isGeneratedCSharpIdentifier(value) && !isGeneratedCSharpReservedKeyword(value);
|
|
47809
47825
|
}
|
|
47810
|
-
var
|
|
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
|
-
|
|
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
|
-
|
|
53348
|
+
init_project_source_identifiers2();
|
|
53333
53349
|
}
|
|
53334
53350
|
});
|
|
53335
53351
|
|
|
@@ -57038,6 +57054,16 @@ function lowerMemberKind(context, ownerClass, declaration, id2, owner) {
|
|
|
57038
57054
|
script: null
|
|
57039
57055
|
};
|
|
57040
57056
|
}
|
|
57057
|
+
if (declaration.modifiers.includes("abstract")) {
|
|
57058
|
+
return {
|
|
57059
|
+
...common,
|
|
57060
|
+
kind: "scriptFunction",
|
|
57061
|
+
returnType,
|
|
57062
|
+
arguments: argumentsValue,
|
|
57063
|
+
deferred: declaration.modifiers.includes("async"),
|
|
57064
|
+
script: null
|
|
57065
|
+
};
|
|
57066
|
+
}
|
|
57041
57067
|
return {
|
|
57042
57068
|
...common,
|
|
57043
57069
|
kind: "function",
|
|
@@ -109297,7 +109323,7 @@ function isObjectRecord5(value) {
|
|
|
109297
109323
|
var init_project_file_authoring_identifiers = __esm({
|
|
109298
109324
|
"../src/models/project-file-authoring-identifiers.ts"() {
|
|
109299
109325
|
"use strict";
|
|
109300
|
-
|
|
109326
|
+
init_project_source_identifiers2();
|
|
109301
109327
|
}
|
|
109302
109328
|
});
|
|
109303
109329
|
|
|
@@ -112241,7 +112267,7 @@ var init_registry2 = __esm({
|
|
|
112241
112267
|
PROJECT_SCHEMA_CONTRACT = Object.freeze({
|
|
112242
112268
|
formatVersion: 3,
|
|
112243
112269
|
contractVersion: "3.13",
|
|
112244
|
-
cliVersion: "0.32.
|
|
112270
|
+
cliVersion: "0.32.3",
|
|
112245
112271
|
projectFileUploadBatchSize: 32,
|
|
112246
112272
|
documentRecords: {
|
|
112247
112273
|
member: {
|
|
@@ -118836,7 +118862,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
|
|
|
118836
118862
|
async function main() {
|
|
118837
118863
|
const args = parseArgs(process.argv.slice(2));
|
|
118838
118864
|
if (args.command === "--version") {
|
|
118839
|
-
console.log("0.32.
|
|
118865
|
+
console.log("0.32.3");
|
|
118840
118866
|
return;
|
|
118841
118867
|
}
|
|
118842
118868
|
if (args.command === null || args.command === "help" || args.command === "--help" || args.command === "-h") {
|
package/package.json
CHANGED
|
@@ -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.
|
|
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 {
|
|
@@ -24,6 +24,10 @@ Declare a setter's value type explicitly with the canonical form
|
|
|
24
24
|
`set(int value) { ... }`. Project analysis, candidate materialization, and
|
|
25
25
|
focused script commands all use the same accessor extraction.
|
|
26
26
|
|
|
27
|
+
Declare a bodyless NeoScript contract with `abstract`, for example
|
|
28
|
+
`public abstract bool Equals(Item other);`. Reserve `native` for host-provided
|
|
29
|
+
functions; concrete NeoScript overrides inherit the abstract signature.
|
|
30
|
+
|
|
27
31
|
Use the shared language service through focused commands:
|
|
28
32
|
|
|
29
33
|
```sh
|