@neocompose/cli 0.68.0 → 0.68.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.
@@ -7975,30 +7975,36 @@ function substituteMember(member, env, members, preResolvedMember) {
7975
7975
  return resolved;
7976
7976
  }
7977
7977
  function substituteNestedTypeInfo(typeInfo, env, members) {
7978
- if (typeInfo.type === 21 /* Generic */) {
7979
- const entry = env.get(typeInfo.genericParamId);
7978
+ return mapGenericTypeInfo(typeInfo, (generic) => {
7979
+ const entry = env.get(generic.genericParamId);
7980
7980
  if (entry === void 0) {
7981
7981
  throw new Error(
7982
- `substituteMember: callable type references generic param "${typeInfo.genericParamId}", which is not present in the binding environment.`
7982
+ `substituteMember: callable type references generic param "${generic.genericParamId}", which is not present in the binding environment.`
7983
7983
  );
7984
7984
  }
7985
- if (entry.kind === "unbound") return typeInfo;
7986
- const binding = memberIndexFor(members).get(entry.memberId);
7987
- if (binding === void 0) {
7988
- throw new Error(
7989
- `substituteMember: callable type binding member "${entry.memberId}" for generic param "${typeInfo.genericParamId}" does not exist in the document.`
7990
- );
7991
- }
7992
- return genericBindingTypeInfo(binding, env, members);
7985
+ if (entry.kind === "unbound") return generic;
7986
+ return genericBindingTypeInfo(
7987
+ callableBindingMember(entry.memberId, generic.genericParamId, members),
7988
+ env,
7989
+ members
7990
+ );
7991
+ });
7992
+ }
7993
+ function callableBindingMember(memberId, slotName, members) {
7994
+ const binding = memberIndexFor(members).get(memberId);
7995
+ if (binding === void 0) {
7996
+ throw new Error(
7997
+ `substituteMember: callable type binding member "${memberId}" for "${slotName}" does not exist in the document.`
7998
+ );
7993
7999
  }
8000
+ return binding;
8001
+ }
8002
+ function mapGenericTypeInfo(typeInfo, close) {
8003
+ if (typeInfo.type === 21 /* Generic */) return close(typeInfo);
7994
8004
  if (typeInfo.type === 6 /* List */ || typeInfo.type === 5 /* Dictionary */ || typeInfo.type === 9 /* Lookup */) {
7995
8005
  return {
7996
8006
  ...typeInfo,
7997
- entryTypeInfo: substituteNestedTypeInfo(
7998
- typeInfo.entryTypeInfo,
7999
- env,
8000
- members
8001
- )
8007
+ entryTypeInfo: mapGenericTypeInfo(typeInfo.entryTypeInfo, close)
8002
8008
  };
8003
8009
  }
8004
8010
  if (typeInfo.type === 7 /* Class */) {
@@ -8009,7 +8015,7 @@ function substituteNestedTypeInfo(typeInfo, env, members) {
8009
8015
  typeArguments: Object.fromEntries(
8010
8016
  Object.entries(typeArguments).map(([parameterId, argument2]) => [
8011
8017
  parameterId,
8012
- substituteNestedTypeInfo(argument2, env, members)
8018
+ mapGenericTypeInfo(argument2, close)
8013
8019
  ])
8014
8020
  )
8015
8021
  };
@@ -8017,13 +8023,9 @@ function substituteNestedTypeInfo(typeInfo, env, members) {
8017
8023
  if (typeInfo.type === 25 /* NSDelegate */) {
8018
8024
  return {
8019
8025
  ...typeInfo,
8020
- returnTypeInfo: substituteNestedTypeInfo(
8021
- typeInfo.returnTypeInfo,
8022
- env,
8023
- members
8024
- ),
8026
+ returnTypeInfo: mapGenericTypeInfo(typeInfo.returnTypeInfo, close),
8025
8027
  argumentTypes: typeInfo.argumentTypes.map(
8026
- (argument2) => substituteNestedTypeInfo(argument2, env, members)
8028
+ (argument2) => mapGenericTypeInfo(argument2, close)
8027
8029
  )
8028
8030
  };
8029
8031
  }
@@ -8031,7 +8033,7 @@ function substituteNestedTypeInfo(typeInfo, env, members) {
8031
8033
  return {
8032
8034
  ...typeInfo,
8033
8035
  argumentTypes: typeInfo.argumentTypes.map(
8034
- (argument2) => substituteNestedTypeInfo(argument2, env, members)
8036
+ (argument2) => mapGenericTypeInfo(argument2, close)
8035
8037
  )
8036
8038
  };
8037
8039
  }
@@ -8063,11 +8065,16 @@ function typeInfoFromArgumentSignature(signature) {
8063
8065
  }
8064
8066
  if (signature.type === 8 /* Enum */) {
8065
8067
  const enumSignature = signature;
8066
- return {
8068
+ const enumTypeInfo = {
8067
8069
  type: 8 /* Enum */,
8068
8070
  required: enumSignature.required,
8069
8071
  enumId: enumSignature.enumId
8070
8072
  };
8073
+ return enumSignature.multiselect ? {
8074
+ type: 9 /* Lookup */,
8075
+ required: enumSignature.required,
8076
+ entryTypeInfo: { ...enumTypeInfo, required: true }
8077
+ } : enumTypeInfo;
8071
8078
  }
8072
8079
  if (signature.type === 6 /* List */) {
8073
8080
  const listSignature = signature;
@@ -49542,6 +49549,12 @@ var SOURCE_TYPE_NAME_BY_MEMBER_KIND_NUMBER = new Map(
49542
49549
  ])
49543
49550
  );
49544
49551
 
49552
+ // src/project-source/value-sources.ts
49553
+ var INITIALIZER_KEY_PLACEHOLDER = new RegExp(
49554
+ `${PENDING_ID_PREFIX}reference-key:init:\\d+`,
49555
+ "g"
49556
+ );
49557
+
49545
49558
  // src/project-manifest/record-adapters/enum.ts
49546
49559
  var ENUM_SCHEMA_RECORD_ADAPTER = {
49547
49560
  recordKind: "enum",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.68.0",
3
+ "version": "0.68.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.68.0 -->
12
+ <!-- reviewed-through-cli: 0.68.2 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -78,7 +78,7 @@ run with `npm run lint:architecture`.
78
78
 
79
79
  Keep project context refreshable without accumulating stale Monaco providers or
80
80
  LSP state. Preserve diagnostics, completion, hover, signatures, definition,
81
- references, rename, symbols, semantic tokens, code actions, and formatting
81
+ references, implementations, rename, symbols, semantic tokens, code actions, and formatting
82
82
  parity for `.neo` and `.neoflow`.
83
83
 
84
84
  The CLI prepares every push with the server's own preparation code: it
@@ -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.68.0 -->
113
+ <!-- reviewed-through-cli: 0.68.2 -->
114
114
  ```
115
115
 
116
116
  The quoted version above is checked too, so this instruction cannot go stale
@@ -63,6 +63,17 @@ cannot place one stored row in two collection positions. For a new ordinary reco
63
63
  `@id` and let a successful real push assign and insert it. Dry-run and failed pushes
64
64
  leave tracked source unchanged.
65
65
 
66
+ A local initializer's existing row ID may precede its variable declaration:
67
+
68
+ ```neo
69
+ @id("existing-quest-row-id")
70
+ Quest HardAsStone = new Quest() { Name = "Hard as stone" };
71
+ ```
72
+
73
+ This names the initializer row. It does not create a stored global. The inline
74
+ `Quest HardAsStone = @id("...") new Quest();` spelling is also accepted, and
75
+ formatting moves its ID above the declaration. Do not put an ID in both places.
76
+
66
77
  Nested class/list rows remain independently addressable and keep inline IDs:
67
78
 
68
79
  ```neo