@neocompose/cli 0.67.1 → 0.67.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,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.67.2] - 2026-10-04
4
+
5
+ - `neo pull --force` reads the workspace layout against the server's records instead of the baseline it is about to replace. Previously a baseline pulled before 0.67.0 failed with "Cannot recover local initializer placement before reset" in any workspace with local values, so the `--force` remedy 0.67.1 suggests could not run.
6
+ - Pull writes `float` setting bounds as the shortest decimal that reads back as the stored float, so `@settings(max: 23.99)` stays `23.99`. Previously it wrote `23.989999771118164`.
7
+
3
8
  ## [0.67.1] - 2026-10-04
4
9
 
5
10
  - Pull adopts records the server only recompiled into `.neo/state.json` before it reads local sources, even when the same pull also merges authored changes. Previously one authored change anywhere in the pull sent every recompiled record through the merge, which read the stale baseline and failed.
package/dist/neo.mjs CHANGED
@@ -30114,7 +30114,7 @@ var init_registry = __esm({
30114
30114
  "../packages/manifest/schema-contract/registry.mjs"() {
30115
30115
  "use strict";
30116
30116
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
30117
- cliVersion: "0.67.1",
30117
+ cliVersion: "0.67.2",
30118
30118
  projectFileUploadBatchSize: 32,
30119
30119
  documentRecords: {
30120
30120
  member: {
@@ -52644,14 +52644,17 @@ function renderExtendsGenericBindings(context, schemaClass2, base) {
52644
52644
  });
52645
52645
  return `<${argumentsValue.join(", ")}>`;
52646
52646
  }
52647
+ function settingsBound(value) {
52648
+ return typeof value === "number" ? formatNeoNumber(value) : value;
52649
+ }
52647
52650
  function memberSettings(context, member) {
52648
52651
  const settings = [];
52649
52652
  if (member.kind === "string") {
52650
52653
  if (!member.localizable) settings.push("format: .Plain");
52651
52654
  if (member.searchKey) settings.push("searchBy: .MemberKey");
52652
52655
  } else if (member.kind === "int" || member.kind === "float" || member.kind === "decimal") {
52653
- if (member.min !== null) settings.push(`min: ${member.min}`);
52654
- if (member.max !== null) settings.push(`max: ${member.max}`);
52656
+ if (member.min !== null) settings.push(`min: ${settingsBound(member.min)}`);
52657
+ if (member.max !== null) settings.push(`max: ${settingsBound(member.max)}`);
52655
52658
  if (member.kind !== "int" && member.decimalPoints !== null) {
52656
52659
  settings.push(`decimalPoints: ${member.decimalPoints}`);
52657
52660
  }
@@ -131368,9 +131371,25 @@ function workspaceBinaryPathsV4(workspace, local) {
131368
131371
  for (const file of local ?? []) paths.set(file.fileId, file.path);
131369
131372
  return paths;
131370
131373
  }
131371
- function readWorkspaceLayoutStatusV4(workspace) {
131374
+ function readWorkspaceLayoutStatusV4(workspace, document) {
131375
+ const records2 = {};
131376
+ for (const [key, server] of document.records) {
131377
+ if (server.deleted) continue;
131378
+ const previous = workspace.state.records[key];
131379
+ records2[key] = {
131380
+ recordKind: server.recordKind,
131381
+ recordId: server.recordId,
131382
+ contentHash: server.contentHash,
131383
+ data: server.data,
131384
+ ...previous?.file === void 0 ? {} : { file: previous.file },
131385
+ ...previous?.projectBinary === void 0 ? {} : { projectBinary: previous.projectBinary }
131386
+ };
131387
+ }
131372
131388
  try {
131373
- const status = computeWorkspaceStatus2(workspace);
131389
+ const status = computeWorkspaceStatus2({
131390
+ ...workspace,
131391
+ state: { ...workspace.state, records: records2 }
131392
+ });
131374
131393
  const failure = status.parseErrors.find(isBlockingSchemaSourceError);
131375
131394
  if (failure !== void 0) throw failure;
131376
131395
  return status;
@@ -131382,8 +131401,8 @@ function readWorkspaceLayoutStatusV4(workspace) {
131382
131401
  for (const path of listProjectSourceFilesV4(workspace.root)) {
131383
131402
  const content = readFileSync9(path, "utf8");
131384
131403
  if (neoProjectSourceKind(path, content) !== "definition") continue;
131385
- const document = parseNeoProjectSource(content, "definition", path);
131386
- if (document.declarations.some(
131404
+ const document2 = parseNeoProjectSource(content, "definition", path);
131405
+ if (document2.declarations.some(
131387
131406
  (declaration) => declaration.kind === "global" && isLocalValueGlobal(declaration)
131388
131407
  )) {
131389
131408
  throw new Error(
@@ -137771,7 +137790,7 @@ import { dirname as dirname8, join as join13, relative as relative7, sep as sep7
137771
137790
  function prepareWorkspaceResetV4(workspace, document, options = {}) {
137772
137791
  const emissionRecords = options.regenerateSourceNames ? regenerateDialogueSourceNamesV4(document.records) : document.records;
137773
137792
  const layoutWorkspace = workspaceForSourceLayoutV4(workspace, document);
137774
- const status = listProjectSourceFilesV4(workspace.root).length === 0 ? null : readWorkspaceLayoutStatusV4(layoutWorkspace);
137793
+ const status = listProjectSourceFilesV4(workspace.root).length === 0 ? null : readWorkspaceLayoutStatusV4(layoutWorkspace, document);
137775
137794
  const localValues = status?.localValues ?? workspace.state.localValues;
137776
137795
  const emitted = emitProjectDocumentFilesV4(emissionRecords, {
137777
137796
  localValues,
@@ -138343,7 +138362,7 @@ async function finishFormat4Pull(args) {
138343
138362
  for (const [key, record6] of localStatus?.reconstructed ?? []) {
138344
138363
  if (record6.file != null) recordFiles.set(key, record6.file);
138345
138364
  }
138346
- const layoutStatus = localStatus ?? (destructive ? readWorkspaceLayoutStatusV4(layoutWorkspace) : null);
138365
+ const layoutStatus = localStatus ?? (destructive ? readWorkspaceLayoutStatusV4(layoutWorkspace, document) : null);
138347
138366
  const localValues = layoutStatus?.localValues ?? workspace.state.localValues;
138348
138367
  const binaryPaths = workspaceBinaryPathsV4(
138349
138368
  workspace,
@@ -156833,7 +156852,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
156833
156852
  async function main() {
156834
156853
  const args = parseArgs(process.argv.slice(2));
156835
156854
  if (args.command === "--version") {
156836
- console.log("0.67.1");
156855
+ console.log("0.67.2");
156837
156856
  return;
156838
156857
  }
156839
156858
  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.67.1",
3
+ "version": "0.67.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.67.1 -->
12
+ <!-- reviewed-through-cli: 0.67.2 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -110,7 +110,7 @@ wrappers.
110
110
  The marker near the top of `SKILL.md` must exactly match the package version:
111
111
 
112
112
  ```html
113
- <!-- reviewed-through-cli: 0.67.1 -->
113
+ <!-- reviewed-through-cli: 0.67.2 -->
114
114
  ```
115
115
 
116
116
  The quoted version above is checked too, so this instruction cannot go stale