@neocompose/cli 0.60.0 → 0.60.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,14 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.60.2] - 2026-09-29
4
+
5
+ - A List field that overrides an abstract List getter can be pushed. List overrides no longer redeclare indexes in their records.
6
+ - `@index` on a List override reports an error at the member's source location. Declare indexes on the original List member.
7
+
8
+ ## [0.60.1] - 2026-09-28
9
+
10
+ - When push checks which classes a variant reference or a class-typed default may select, it finds the class's subclasses from one parent-to-children index. Before, it rescanned every class once per level of inheritance.
11
+
3
12
  ## [0.60.0] - 2026-09-27
4
13
 
5
14
  - **Behavior change:** A command that reads or writes a project opens one live connection to the server and uses it for every query, write, and subscription until it exits. Push no longer posts its commit to an HTTP route. The connection runs on its own thread, so it finishes opening while push prepares the commit.
package/dist/neo.mjs CHANGED
@@ -39446,12 +39446,14 @@ function memberToDocumentFields(member, baseData3) {
39446
39446
  if (member.listKind === "unordered" || isOverride) {
39447
39447
  fields.listKind = member.listKind === "unordered" ? 1 : 0;
39448
39448
  }
39449
- fields.indexes = member.indexes.map(
39450
- (index) => omitUndefined({
39451
- schemaKey: index.schemaKey,
39452
- kind: index.unique ? 1 : void 0
39453
- })
39454
- );
39449
+ if (!isOverride) {
39450
+ fields.indexes = member.indexes.map(
39451
+ (index) => omitUndefined({
39452
+ schemaKey: index.schemaKey,
39453
+ kind: index.unique ? 1 : void 0
39454
+ })
39455
+ );
39456
+ }
39455
39457
  fields.columnSettings = member.columns.map(
39456
39458
  (column) => omitUndefined({
39457
39459
  memberKey: column.memberKey,
@@ -40465,7 +40467,6 @@ var init_codecs = __esm({
40465
40467
  "minValue",
40466
40468
  "maxValue",
40467
40469
  "decimalPoints",
40468
- "indexes",
40469
40470
  "columnSettings",
40470
40471
  "schemaKeyOrder",
40471
40472
  "classArguments",
@@ -49516,17 +49517,25 @@ function resolveMemberWithIndex(member, memberIndex) {
49516
49517
  return Object.freeze(merged);
49517
49518
  }
49518
49519
  function descendantClassIds(classId, allClasses) {
49520
+ const childrenByClassId = /* @__PURE__ */ new Map();
49521
+ for (const schemaClass2 of allClasses) {
49522
+ if (!schemaClass2.extendsClassId) continue;
49523
+ const children = childrenByClassId.get(schemaClass2.extendsClassId);
49524
+ if (children === void 0) {
49525
+ childrenByClassId.set(schemaClass2.extendsClassId, [schemaClass2]);
49526
+ } else children.push(schemaClass2);
49527
+ }
49528
+ return descendantClassIdsInChildIndex(classId, childrenByClassId);
49529
+ }
49530
+ function descendantClassIdsInChildIndex(classId, childrenByClassId) {
49519
49531
  const result = /* @__PURE__ */ new Set();
49520
- let added = true;
49521
- while (added) {
49522
- added = false;
49523
- for (const t of allClasses) {
49524
- if (t.id === classId) continue;
49525
- if (result.has(t.id)) continue;
49526
- if (t.extendsClassId === classId || t.extendsClassId && result.has(t.extendsClassId)) {
49527
- result.add(t.id);
49528
- added = true;
49529
- }
49532
+ const pending = [classId];
49533
+ for (let id2 = pending.pop(); id2 !== void 0; id2 = pending.pop()) {
49534
+ for (const child of childrenByClassId.get(id2) ?? []) {
49535
+ if (child.id === classId) continue;
49536
+ if (result.has(child.id)) continue;
49537
+ result.add(child.id);
49538
+ pending.push(child.id);
49530
49539
  }
49531
49540
  }
49532
49541
  return result;
@@ -111538,7 +111547,7 @@ function lowerClass(context, declaration) {
111538
111547
  }
111539
111548
  function lowerMember(context, ownerClass, declaration, id2, owner) {
111540
111549
  const member = lowerMemberKind(context, ownerClass, declaration, id2, owner);
111541
- assertListAnnotationPlacement(ownerClass, declaration, member.kind);
111550
+ assertListAnnotationPlacement(ownerClass, declaration, member);
111542
111551
  return member;
111543
111552
  }
111544
111553
  function lowerMemberKind(context, ownerClass, declaration, id2, owner) {
@@ -112200,8 +112209,16 @@ function memberKeyArgument(value, ownerClass, declaration) {
112200
112209
  }
112201
112210
  return expression.name;
112202
112211
  }
112203
- function assertListAnnotationPlacement(ownerClass, declaration, loweredKind) {
112204
- if (loweredKind === "list") return;
112212
+ function assertListAnnotationPlacement(ownerClass, declaration, member) {
112213
+ const loweredKind = member.kind;
112214
+ if (loweredKind === "list") {
112215
+ if (member.overrideOf !== null && hasAnnotation2(declaration.annotations, "index")) {
112216
+ throw new Error(
112217
+ `@index on ${ownerClass.name}.${declaration.name} cannot be declared on an override; indexes are inherited from the declaring List.`
112218
+ );
112219
+ }
112220
+ return;
112221
+ }
112205
112222
  if (hasAnnotation2(declaration.annotations, "index")) {
112206
112223
  throw new Error(
112207
112224
  `@index on ${ownerClass.name}.${declaration.name} is only valid on a List member; this declaration lowers to a ${loweredKind} member.`
@@ -142443,7 +142460,7 @@ var init_registry2 = __esm({
142443
142460
  "schema-contract/registry.mjs"() {
142444
142461
  "use strict";
142445
142462
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
142446
- cliVersion: "0.60.0",
142463
+ cliVersion: "0.60.2",
142447
142464
  projectFileUploadBatchSize: 32,
142448
142465
  documentRecords: {
142449
142466
  member: {
@@ -151095,7 +151112,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
151095
151112
  async function main() {
151096
151113
  const args = parseArgs(process.argv.slice(2));
151097
151114
  if (args.command === "--version") {
151098
- console.log("0.60.0");
151115
+ console.log("0.60.2");
151099
151116
  return;
151100
151117
  }
151101
151118
  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.60.0",
3
+ "version": "0.60.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.60.0 -->
12
+ <!-- reviewed-through-cli: 0.60.2 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -101,7 +101,7 @@ wrappers.
101
101
  The marker near the top of `SKILL.md` must exactly match the package version:
102
102
 
103
103
  ```html
104
- <!-- reviewed-through-cli: 0.60.0 -->
104
+ <!-- reviewed-through-cli: 0.60.2 -->
105
105
  ```
106
106
 
107
107
  The quoted version above is checked too, so this instruction cannot go stale
@@ -140,7 +140,10 @@ undeclared static member of such a class is Session.
140
140
  `@column(member: Field, width: ..., visibility: ..., pin: ..., overflow: ...)`
141
141
  are repeatable List annotations. `member:` is a bare field name on the entry
142
142
  class. An index accepts a non-localizable string or single-select enum. A column
143
- may target `__other__` for the default layout of subclass-added fields.
143
+ may target `__other__` for the default layout of subclass-added fields. Declare
144
+ indexes only on the original List member. Overrides inherit its indexes, and
145
+ `@index` on an override is a source error. A List field may override an abstract
146
+ List getter.
144
147
 
145
148
  Use `.EnumCase` only when context fixes one enum type; otherwise write
146
149
  `EnumType.Case`. Defaults and settings must be statically analyzable.