@neocompose/cli 0.24.2 → 0.24.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,22 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.24.3] - 2026-08-07
4
+
5
+ ### Fixed
6
+
7
+ - Close generic classes constructed by normal member-default evaluation from
8
+ the concrete member slot, so local candidate preparation no longer rejects
9
+ values such as `NeoAnimationSegmentFrame<int>` as open generics before
10
+ `neo test` can discover or execute tests.
11
+ - Key compiled spec artifacts by the prepared candidate document as well as
12
+ source, preventing stale pending class and enum IDs from leaking across
13
+ repeated `neo test` runs.
14
+
15
+ ### Changed
16
+
17
+ - Require full-project `neo test` validation in the bundled CLI development
18
+ guidance when evaluator or candidate-materialization behavior changes.
19
+
3
20
  ## [0.24.2] - 2026-08-07
4
21
 
5
22
  ### Fixed
package/dist/neo.mjs CHANGED
@@ -60764,8 +60764,8 @@ function validateClassConstructorDescriptor(info, ctx, requireEveryRequiredField
60764
60764
  `Cannot construct abstract Class '${schemaClass2.name}'.`
60765
60765
  );
60766
60766
  }
60767
- const replaySlot = ctx.__storedConstructionReplayNestedSlots?.toReversed().find((slot) => slot.classId === classId) ?? ctx.__storedConstructionReplaySlot;
60768
- const classArguments2 = replaySlot?.classId === classId ? replaySlot.classArguments : void 0;
60767
+ const genericSlot = ctx.__constructionGenericSlots?.toReversed().find((slot) => slot.classId === classId) ?? ctx.__storedConstructionReplaySlot;
60768
+ const classArguments2 = genericSlot?.classId === classId ? genericSlot.classArguments : void 0;
60769
60769
  const instanceEnv = resolveInstanceEnv(
60770
60770
  classId,
60771
60771
  classArguments2,
@@ -61621,7 +61621,7 @@ function constructionInitEvaluator(ctx, createdValues, argumentScopes, construct
61621
61621
  };
61622
61622
  return (member, init, sourceValueId) => {
61623
61623
  const evaluate = (argumentValues = []) => {
61624
- if (ctx.storedConstructionReplay !== true || !isMemberClassBase(member) || Object.keys(member.classArguments ?? {}).length === 0) {
61624
+ if (!isMemberClassBase(member) || Object.keys(member.classArguments ?? {}).length === 0) {
61625
61625
  return evaluateInitializerInContext(
61626
61626
  init,
61627
61627
  member,
@@ -61631,8 +61631,8 @@ function constructionInitEvaluator(ctx, createdValues, argumentScopes, construct
61631
61631
  sourceValueId ?? null
61632
61632
  );
61633
61633
  }
61634
- const previousSlots = ctx.__storedConstructionReplayNestedSlots;
61635
- ctx.__storedConstructionReplayNestedSlots = [
61634
+ const previousSlots = ctx.__constructionGenericSlots;
61635
+ ctx.__constructionGenericSlots = [
61636
61636
  ...previousSlots ?? [],
61637
61637
  {
61638
61638
  classId: member.classId,
@@ -61649,7 +61649,7 @@ function constructionInitEvaluator(ctx, createdValues, argumentScopes, construct
61649
61649
  sourceValueId ?? null
61650
61650
  );
61651
61651
  } finally {
61652
- ctx.__storedConstructionReplayNestedSlots = previousSlots;
61652
+ ctx.__constructionGenericSlots = previousSlots;
61653
61653
  }
61654
61654
  };
61655
61655
  if (init.compiled === void 0) {
@@ -101546,7 +101546,7 @@ var init_registry2 = __esm({
101546
101546
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
101547
101547
  formatVersion: 3,
101548
101548
  contractVersion: "3.9",
101549
- cliVersion: "0.24.2",
101549
+ cliVersion: "0.24.3",
101550
101550
  projectFileUploadBatchSize: 32,
101551
101551
  documentRecords: {
101552
101552
  member: {
@@ -103077,7 +103077,7 @@ function preparedHookCandidate(workspace) {
103077
103077
  );
103078
103078
  }
103079
103079
  }
103080
- function compileSpec(workspace, document, absolutePath, projectSourceHash) {
103080
+ function compileSpec(workspace, document, absolutePath, projectCompilationHash2) {
103081
103081
  const scriptDocument = readDocumentArrays(document);
103082
103082
  const path = relative6(workspace.root, absolutePath).split(sep6).join("/");
103083
103083
  const source = readFileSync17(absolutePath, "utf8");
@@ -103087,12 +103087,12 @@ function compileSpec(workspace, document, absolutePath, projectSourceHash) {
103087
103087
  ".neo",
103088
103088
  "test-build",
103089
103089
  "v1",
103090
- projectSourceHash,
103090
+ projectCompilationHash2,
103091
103091
  `${sourceHash}.json`
103092
103092
  );
103093
103093
  try {
103094
103094
  const cached = JSON.parse(readFileSync17(artifactPath, "utf8"));
103095
- if (isRecord10(cached) && cached.version === 1 && cached.compilerRevision === NEOSCRIPT_COMPILER_REVISION && cached.projectSourceHash === projectSourceHash && cached.sourceHash === sourceHash && isRecord10(cached.action) && typeof cached.artifactSha256 === "string" && createHash10("sha256").update(JSON.stringify(cached.action)).digest("hex") === cached.artifactSha256 && cached.action.compilerRevision === NEOSCRIPT_COMPILER_REVISION && Array.isArray(cached.action.parameters) && Array.isArray(cached.action.instructions) && isRecord10(cached.action.typeInfo)) {
103095
+ if (isRecord10(cached) && cached.version === 1 && cached.compilerRevision === NEOSCRIPT_COMPILER_REVISION && cached.projectCompilationHash === projectCompilationHash2 && cached.sourceHash === sourceHash && isRecord10(cached.action) && typeof cached.artifactSha256 === "string" && createHash10("sha256").update(JSON.stringify(cached.action)).digest("hex") === cached.artifactSha256 && cached.action.compilerRevision === NEOSCRIPT_COMPILER_REVISION && Array.isArray(cached.action.parameters) && Array.isArray(cached.action.instructions) && isRecord10(cached.action.typeInfo)) {
103096
103096
  return {
103097
103097
  path,
103098
103098
  source,
@@ -103122,7 +103122,7 @@ function compileSpec(workspace, document, absolutePath, projectSourceHash) {
103122
103122
  `${JSON.stringify({
103123
103123
  version: 1,
103124
103124
  compilerRevision: NEOSCRIPT_COMPILER_REVISION,
103125
- projectSourceHash,
103125
+ projectCompilationHash: projectCompilationHash2,
103126
103126
  sourceHash,
103127
103127
  artifactSha256: createHash10("sha256").update(JSON.stringify(compiled.action)).digest("hex"),
103128
103128
  action: compiled.action
@@ -103131,6 +103131,9 @@ function compileSpec(workspace, document, absolutePath, projectSourceHash) {
103131
103131
  );
103132
103132
  return compiled;
103133
103133
  }
103134
+ function projectCompilationHash(projectSourceHash, document) {
103135
+ return createHash10("sha256").update(projectSourceHash).update("\0").update(JSON.stringify(document)).digest("hex");
103136
+ }
103134
103137
  function selectedSpecPaths(workspace, selectors) {
103135
103138
  const all = listProjectTestFilesV1(workspace.root);
103136
103139
  const relativePaths = new Map(
@@ -104006,6 +104009,10 @@ async function runTest(workspace, options, dependencies = {}) {
104006
104009
  }
104007
104010
  projectFingerprint = `sha256:${candidate.sourceHash}`;
104008
104011
  const rawDocument = documentRecord(candidate.document);
104012
+ const compilationHash = projectCompilationHash(
104013
+ candidate.sourceHash,
104014
+ rawDocument
104015
+ );
104009
104016
  phase = "select";
104010
104017
  let selectedPaths;
104011
104018
  try {
@@ -104023,7 +104030,7 @@ async function runTest(workspace, options, dependencies = {}) {
104023
104030
  }
104024
104031
  phase = "compile";
104025
104032
  specs = selectedPaths.map(
104026
- (path) => compileSpec(workspace, rawDocument, path, candidate.sourceHash)
104033
+ (path) => compileSpec(workspace, rawDocument, path, compilationHash)
104027
104034
  );
104028
104035
  let pattern = null;
104029
104036
  if (options.testNamePattern !== null) {
@@ -104216,10 +104223,14 @@ async function inspectNeoTestCompilation(workspace, dependencies = {}) {
104216
104223
  };
104217
104224
  }
104218
104225
  const document = documentRecord(candidate.document);
104226
+ const compilationHash = projectCompilationHash(
104227
+ candidate.sourceHash,
104228
+ document
104229
+ );
104219
104230
  const errors = [];
104220
104231
  for (const path of selectedPaths) {
104221
104232
  try {
104222
- compileSpec(workspace, document, path, candidate.sourceHash);
104233
+ compileSpec(workspace, document, path, compilationHash);
104223
104234
  } catch (error) {
104224
104235
  errors.push({
104225
104236
  file: relative6(workspace.root, path).split(sep6).join("/"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.24.2",
3
+ "version": "0.24.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.24.2 -->
12
+ <!-- reviewed-through-cli: 0.24.3 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -82,7 +82,7 @@ wrappers.
82
82
  The marker near the top of `SKILL.md` must exactly match the package version:
83
83
 
84
84
  ```html
85
- <!-- reviewed-through-cli: 0.24.2 -->
85
+ <!-- reviewed-through-cli: 0.24.3 -->
86
86
  ```
87
87
 
88
88
  The quoted version above is checked too, so this instruction cannot go stale
@@ -115,5 +115,7 @@ npm run doctor
115
115
 
116
116
  Also run contract/corpus checks, Monaco/browser parity, VSIX packaging, and
117
117
  interactive sample no-op verification when the corresponding implementation
118
- surface changes. Run `npm run doctor` last; do not rerun successful suites only
119
- because doctor formatted files.
118
+ surface changes. Evaluator or candidate-materialization changes also require an
119
+ actual `neo test` run against the affected full-project candidate; focused
120
+ Vitest coverage does not replace that end-to-end command. Run `npm run doctor`
121
+ last; do not rerun successful suites only because doctor formatted files.