@cleocode/cleo 2026.5.109 → 2026.5.110

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleocode/cleo",
3
- "version": "2026.5.109",
3
+ "version": "2026.5.110",
4
4
  "description": "CLEO CLI — the assembled product consuming @cleocode/core",
5
5
  "type": "module",
6
6
  "main": "./dist/cli/index.js",
@@ -30,18 +30,18 @@
30
30
  "tree-sitter-rust": "0.23.1",
31
31
  "tree-sitter-typescript": "^0.23.2",
32
32
  "yaml": "^2.8.3",
33
- "@cleocode/caamp": "2026.5.109",
34
- "@cleocode/animations": "2026.5.109",
35
- "@cleocode/contracts": "2026.5.109",
36
- "@cleocode/cant": "2026.5.109",
37
- "@cleocode/lafs": "2026.5.109",
38
- "@cleocode/nexus": "2026.5.109",
39
- "@cleocode/playbooks": "2026.5.109",
40
- "@cleocode/runtime": "2026.5.109",
41
- "@cleocode/paths": "2026.5.109"
33
+ "@cleocode/caamp": "2026.5.110",
34
+ "@cleocode/cant": "2026.5.110",
35
+ "@cleocode/contracts": "2026.5.110",
36
+ "@cleocode/lafs": "2026.5.110",
37
+ "@cleocode/animations": "2026.5.110",
38
+ "@cleocode/nexus": "2026.5.110",
39
+ "@cleocode/paths": "2026.5.110",
40
+ "@cleocode/runtime": "2026.5.110",
41
+ "@cleocode/playbooks": "2026.5.110"
42
42
  },
43
43
  "peerDependencies": {
44
- "@cleocode/core": "2026.5.109"
44
+ "@cleocode/core": "2026.5.110"
45
45
  },
46
46
  "peerDependenciesMeta": {
47
47
  "@cleocode/core": {
@@ -49,7 +49,7 @@
49
49
  }
50
50
  },
51
51
  "engines": {
52
- "node": ">=24.0.0"
52
+ "node": ">=24.13.0"
53
53
  },
54
54
  "license": "MIT",
55
55
  "publishConfig": {
@@ -69,6 +69,11 @@ function main() {
69
69
  ...e,
70
70
  // Import path used at runtime — relative to cli/generated/
71
71
  importPath: `../commands/${f.replace(/\.ts$/, '.js')}`,
72
+ // Whether this export is a SubCommand-only binding (mounted under a
73
+ // parent command). SubCommands MAY share a `meta.name` with a
74
+ // top-level command — the parent command's `subCommands` table
75
+ // disambiguates at run time (e.g. `cleo verify` vs `cleo backup verify`).
76
+ isSubCommand: /SubCommand$/.test(e.exportName),
72
77
  });
73
78
  }
74
79
  }
@@ -79,9 +84,13 @@ function main() {
79
84
  }
80
85
 
81
86
  // Detect duplicate command names so we surface conflicts at build time.
82
- const seenNames = new Map();
87
+ // SubCommand exports are skipped when a non-SubCommand owns the name — the
88
+ // SubCommand is mounted under its parent in source and never collides at
89
+ // the top level. Two TOP-level commands sharing a name is still an error.
90
+ const topLevelByName = new Map();
83
91
  for (const e of entries) {
84
- const prev = seenNames.get(e.name);
92
+ if (e.isSubCommand) continue;
93
+ const prev = topLevelByName.get(e.name);
85
94
  if (prev && prev.exportName !== e.exportName) {
86
95
  console.error(
87
96
  `generate-command-manifest: duplicate command name "${e.name}" — ` +
@@ -89,7 +98,17 @@ function main() {
89
98
  );
90
99
  process.exit(1);
91
100
  }
92
- seenNames.set(e.name, e);
101
+ topLevelByName.set(e.name, e);
102
+ }
103
+ // Prune SubCommand entries whose name is already owned by a top-level
104
+ // command — keeping them in the manifest would silently override the
105
+ // top-level binding via `subCommands[entry.name] = wrapper` in
106
+ // `packages/cleo/src/cli/index.ts`.
107
+ for (let i = entries.length - 1; i >= 0; i--) {
108
+ const e = entries[i];
109
+ if (e.isSubCommand && topLevelByName.has(e.name)) {
110
+ entries.splice(i, 1);
111
+ }
93
112
  }
94
113
 
95
114
  const banner = `/**