@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 +31 -1
- package/dist/utils/config.js +10 -1
- package/package.json +6 -6
- package/src/utils/config.test.ts +13 -0
- package/src/utils/config.ts +10 -1
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.
|
|
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
|
package/dist/utils/config.js
CHANGED
|
@@ -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, {
|
|
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.
|
|
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": "^
|
|
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.
|
|
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": "^
|
|
85
|
-
"@types/react": "^18.
|
|
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": "^
|
|
88
|
+
"vitest": "^4.1.11"
|
|
89
89
|
}
|
|
90
90
|
}
|
package/src/utils/config.test.ts
CHANGED
|
@@ -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;
|
package/src/utils/config.ts
CHANGED
|
@@ -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, {
|
|
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
|