@nemus-cli/nemus 0.2.2 → 0.2.4

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
@@ -7,6 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.4] - 2026-08-25
11
+
12
+ ### Changed
13
+
14
+ - Dependencies: `commander` 14 → 15 (runtime); dev tooling `@types/node` 22 → 26
15
+ and `vitest` 3 → 4.
16
+ - CI: pinned `actions/checkout` → v7, `actions/setup-node` → v7, and
17
+ `actions/github-script` → v9, which clears the "Node.js 20 is deprecated"
18
+ warnings on every run.
19
+
20
+ ### Deferred
21
+
22
+ - `react` 18 → 19 is held: `ink` 5's bundled `react-reconciler` targets React 18
23
+ internals, so React 19 needs the `ink` 7 major (a TUI-tested change).
24
+ - `inquirer` 8 → 14 and `inquirer-autocomplete-prompt` 2 → 3 are held: inquirer
25
+ v9+ split into `@inquirer/prompts`, so this is a code migration, not a bump.
26
+ - `typescript` 7 is held: it removes `moduleResolution: node10`, requiring a
27
+ `tsconfig` migration.
28
+
29
+ ## [0.2.3] - 2026-08-25
30
+
31
+ ### Fixed
32
+
33
+ - The one-time `~/.workspace-manager-cache` → `~/.nemus` migration no longer
34
+ copies `last-version-check.json`. If the old (shared) path held another tool's
35
+ update-check cache, inheriting it could make nemus report a wrong "latest"
36
+ version until the entry expired; skipping it forces one fresh lookup instead.
37
+
10
38
  ## [0.2.2] - 2026-08-25
11
39
 
12
40
  ### Changed
@@ -97,7 +125,9 @@ Initial open-source release of **Nemus**.
97
125
  - Automatic retries with backoff on flaky network operations.
98
126
  - Optional shell integration (auto-cd on create + quick-navigate helper).
99
127
 
100
- [Unreleased]: https://github.com/me-public/nemus/compare/v0.2.2...HEAD
128
+ [Unreleased]: https://github.com/me-public/nemus/compare/v0.2.4...HEAD
129
+ [0.2.4]: https://github.com/me-public/nemus/compare/v0.2.3...v0.2.4
130
+ [0.2.3]: https://github.com/me-public/nemus/compare/v0.2.2...v0.2.3
101
131
  [0.2.2]: https://github.com/me-public/nemus/compare/v0.2.1...v0.2.2
102
132
  [0.2.1]: https://github.com/me-public/nemus/compare/v0.2.0...v0.2.1
103
133
  [0.2.0]: https://github.com/me-public/nemus/compare/v0.1.0...v0.2.0
@@ -53,11 +53,20 @@ const LEGACY_CACHE_DIR = path.join(HOME_DIR, '.workspace-manager-cache');
53
53
  * location (no env override) and the new dir doesn't exist yet. Copies rather
54
54
  * than moves, so any other tool that happened to share the old path is left
55
55
  * untouched; a failure is harmless because a fresh dir is created on first write.
56
+ *
57
+ * `last-version-check.json` is deliberately NOT migrated: the old path could be
58
+ * shared by another tool whose "latest version" is unrelated to nemus, and
59
+ * copying it would make the update check report a wrong version until the entry
60
+ * expires. Skipping it just forces one fresh lookup.
56
61
  */
62
+ const MIGRATION_SKIP = new Set(['last-version-check.json']);
57
63
  function migrateLegacyCacheDir(targetDir) {
58
64
  try {
59
65
  if (targetDir === DEFAULT_CACHE_DIR && !fs.existsSync(targetDir) && fs.existsSync(LEGACY_CACHE_DIR)) {
60
- fs.cpSync(LEGACY_CACHE_DIR, targetDir, { recursive: true });
66
+ fs.cpSync(LEGACY_CACHE_DIR, targetDir, {
67
+ recursive: true,
68
+ filter: (src) => !MIGRATION_SKIP.has(path.basename(src)),
69
+ });
61
70
  }
62
71
  }
63
72
  catch {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nemus-cli/nemus",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Nemus — a CLI for managing multi-repository workspaces. Create, sync, and operate across dozens of repos with a single command, and wire them up to your favorite coding agent.",
5
5
  "keywords": [
6
6
  "workspace",
@@ -66,7 +66,7 @@
66
66
  "dependencies": {
67
67
  "@modelcontextprotocol/sdk": "^1.26.0",
68
68
  "cli-progress": "^3.12.0",
69
- "commander": "^14.0.3",
69
+ "commander": "^15.0.0",
70
70
  "fuzzy": "^0.1.3",
71
71
  "ink": "^5.0.0",
72
72
  "ink-select-input": "^6.0.0",
@@ -74,17 +74,17 @@
74
74
  "inquirer": "^8.0.0",
75
75
  "inquirer-autocomplete-prompt": "^2.0.0",
76
76
  "markdown-table": "^3.0.3",
77
- "react": "^18.2.0",
77
+ "react": "^18.3.1",
78
78
  "zod": "^4.3.6"
79
79
  },
80
80
  "devDependencies": {
81
81
  "@types/cli-progress": "^3.11.0",
82
82
  "@types/inquirer": "^9.0.3",
83
83
  "@types/inquirer-autocomplete-prompt": "^2.0.0",
84
- "@types/node": "^22.14.0",
85
- "@types/react": "^18.2.0",
84
+ "@types/node": "^26.3.0",
85
+ "@types/react": "^18.3.31",
86
86
  "ts-node": "^10.9.1",
87
87
  "typescript": "^5.9.3",
88
- "vitest": "^3.0.0"
88
+ "vitest": "^4.1.11"
89
89
  }
90
90
  }
@@ -236,6 +236,19 @@ describe('config', () => {
236
236
  expect(fs.existsSync(path.join(tempDir, '.workspace-manager-cache', 'suites.json'))).toBe(true);
237
237
  });
238
238
 
239
+ it('does not migrate last-version-check.json (avoids inheriting a foreign latest)', async () => {
240
+ delete process.env.NEMUS_CACHE_DIR;
241
+ delete process.env.WORKSPACE_MANAGER_CACHE_DIR;
242
+ const legacy = path.join(tempDir, '.workspace-manager-cache');
243
+ fs.writeFileSync(path.join(legacy, 'suites.json'), '{"x":1}');
244
+ fs.writeFileSync(path.join(legacy, 'last-version-check.json'), '{"latestVersion":"99.0.0"}');
245
+ vi.resetModules();
246
+ await loadModule();
247
+ // other state migrates, but the version-check cache is left behind
248
+ expect(fs.existsSync(path.join(tempDir, '.nemus', 'suites.json'))).toBe(true);
249
+ expect(fs.existsSync(path.join(tempDir, '.nemus', 'last-version-check.json'))).toBe(false);
250
+ });
251
+
239
252
  it('does not migrate when the new dir already exists', async () => {
240
253
  delete process.env.NEMUS_CACHE_DIR;
241
254
  delete process.env.WORKSPACE_MANAGER_CACHE_DIR;
@@ -16,11 +16,20 @@ const LEGACY_CACHE_DIR = path.join(HOME_DIR, '.workspace-manager-cache');
16
16
  * location (no env override) and the new dir doesn't exist yet. Copies rather
17
17
  * than moves, so any other tool that happened to share the old path is left
18
18
  * untouched; a failure is harmless because a fresh dir is created on first write.
19
+ *
20
+ * `last-version-check.json` is deliberately NOT migrated: the old path could be
21
+ * shared by another tool whose "latest version" is unrelated to nemus, and
22
+ * copying it would make the update check report a wrong version until the entry
23
+ * expires. Skipping it just forces one fresh lookup.
19
24
  */
25
+ const MIGRATION_SKIP = new Set(['last-version-check.json']);
20
26
  function migrateLegacyCacheDir(targetDir: string): void {
21
27
  try {
22
28
  if (targetDir === DEFAULT_CACHE_DIR && !fs.existsSync(targetDir) && fs.existsSync(LEGACY_CACHE_DIR)) {
23
- fs.cpSync(LEGACY_CACHE_DIR, targetDir, { recursive: true });
29
+ fs.cpSync(LEGACY_CACHE_DIR, targetDir, {
30
+ recursive: true,
31
+ filter: (src) => !MIGRATION_SKIP.has(path.basename(src)),
32
+ });
24
33
  }
25
34
  } catch {
26
35
  // best-effort — ignore and let the dir be created lazily