@minecraft-docker/mcctl 1.7.0 → 1.7.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.
Files changed (36) hide show
  1. package/README.md +21 -20
  2. package/dist/commands/backup.d.ts +0 -1
  3. package/dist/commands/backup.d.ts.map +1 -1
  4. package/dist/commands/backup.js +2 -28
  5. package/dist/commands/backup.js.map +1 -1
  6. package/dist/commands/console/api.js +2 -2
  7. package/dist/commands/console/init.js +2 -2
  8. package/dist/commands/console/service.js +2 -2
  9. package/dist/commands/index.d.ts +0 -1
  10. package/dist/commands/index.d.ts.map +1 -1
  11. package/dist/commands/index.js +0 -1
  12. package/dist/commands/index.js.map +1 -1
  13. package/dist/commands/init.d.ts +0 -1
  14. package/dist/commands/init.d.ts.map +1 -1
  15. package/dist/commands/init.js +3 -342
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/index.js +10 -42
  18. package/dist/index.js.map +1 -1
  19. package/dist/lib/admin-config.js +2 -2
  20. package/package.json +9 -15
  21. package/scripts/create-server.sh +2 -1
  22. package/templates/.env.example +6 -6
  23. package/templates/ecosystem.config.js +3 -3
  24. package/CHANGELOG.md +0 -278
  25. package/dist/commands/update.d.ts +0 -13
  26. package/dist/commands/update.d.ts.map +0 -1
  27. package/dist/commands/update.js +0 -117
  28. package/dist/commands/update.js.map +0 -1
  29. package/dist/lib/update-checker.d.ts +0 -28
  30. package/dist/lib/update-checker.d.ts.map +0 -1
  31. package/dist/lib/update-checker.js +0 -210
  32. package/dist/lib/update-checker.js.map +0 -1
  33. package/templates/gitignore.template +0 -70
  34. package/templates/servers/_template/logs/.gitkeep +0 -0
  35. package/templates/servers/compose.template.yml +0 -8
  36. /package/{templates/servers/_template/data → scripts}/.gitkeep +0 -0
package/CHANGELOG.md DELETED
@@ -1,278 +0,0 @@
1
- # Changelog
2
-
3
- All notable changes to this project will be documented in this file.
4
-
5
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
- and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
-
8
- ## [1.7.0] - 2026-01-31
9
-
10
- ### Added
11
- - **Router Status API** (`GET /api/router/status`) - Real-time mc-router status (#157, #171)
12
- - **Server Create/Delete API** (`POST/DELETE /api/servers/:name`) - REST API for server management (#154, #172)
13
- - **Player Management API** - Whitelist, ban, op, kick operations via REST (#155, #173)
14
- - **Backup API** (`POST /api/backup/:name`) - Trigger backups via REST (#156, #173)
15
- - **mcctl init --reconfigure** - Reconfigure existing installation (#170)
16
- - **E2E Tests** - Comprehensive API tests for router, players, backup, server create/delete
17
- - **CLI E2E Tests** - Vitest-based e2e tests for CLI commands
18
-
19
- ### Changed
20
- - Update XP methodology documentation in PRD
21
- - Improve /work command with context mode and e2e test requirements
22
- - Add issue checkbox update instructions to /work command
23
- - Agent documentation updates for multi-agent collaboration
24
-
25
- ### Documentation
26
- - Add mcctl-console implementation plan with GitHub issues #174-#190
27
- - Update Admin Service documentation for new API endpoints
28
-
29
- ## [1.6.16] - 2026-01-31
30
-
31
- ### Changed
32
- - Add README Changelog sync instructions to release-manager and technical-writer agents
33
- - Ensure npm package page displays latest changelog entries in README.md
34
-
35
- ## [1.6.15] - 2026-01-31
36
-
37
- ### Added
38
- - New `mcctl backup init` command for interactive GitHub backup setup (#167)
39
- - Guided prompts for GitHub token, repository, and branch configuration
40
- - Automatic `.env` file update with backup settings
41
- - Token validation and repository existence check
42
-
43
- ### Fixed
44
- - Include `scripts/` directory in npm package for template initialization
45
-
46
- ### Tests
47
- - Add comprehensive tests for BackupUseCase.init() (12 test cases)
48
-
49
- ## [1.6.14] - 2026-01-31
50
-
51
- ### Fixed
52
- - Sync all package versions to tag version before npm publish
53
- - CI workflow now automatically updates all monorepo package versions to match Git tag
54
-
55
- ### Changed
56
- - Split CLAUDE.md into modular files for better performance
57
-
58
- ## [1.6.13] - 2026-01-31
59
-
60
- ### Fixed
61
- - Sync CHANGELOG.md to CLI package for npm page display
62
- - Add automatic CHANGELOG sync to release workflow
63
-
64
- ## [1.6.12] - 2026-01-31
65
-
66
- ### Fixed
67
- - **Critical**: Add missing `EXTRA_ARGS=--universe /worlds/` to npm package template (#165)
68
- - **Problem**: Servers created with `mcctl create` stored worlds in `/data/` instead of shared `/worlds/` directory
69
- - **Impact**: Shared world storage feature was non-functional; worlds were recreated on server restart
70
- - **Affected versions**: 1.6.8 ~ 1.6.11 (npm package users only)
71
-
72
- ### Migration Guide for Affected Users
73
-
74
- If you created servers with mcctl versions 1.6.8 ~ 1.6.11, follow these steps:
75
-
76
- #### Option 1: Use Migration Command (Recommended)
77
-
78
- ```bash
79
- # Check which servers need migration
80
- mcctl migrate status
81
-
82
- # Migrate all servers (moves world data and updates config)
83
- mcctl migrate worlds --all
84
-
85
- # Or migrate specific server
86
- mcctl migrate worlds myserver
87
- ```
88
-
89
- #### Option 2: Manual Fix
90
-
91
- **Step 1**: Add `EXTRA_ARGS` to server's config.env:
92
-
93
- ```bash
94
- # For each affected server
95
- echo 'EXTRA_ARGS=--universe /worlds/' >> ~/minecraft-servers/servers/<server-name>/config.env
96
- ```
97
-
98
- Or add to global `.env` (applies to all servers):
99
-
100
- ```bash
101
- echo 'EXTRA_ARGS=--universe /worlds/' >> ~/minecraft-servers/.env
102
- ```
103
-
104
- **Step 2**: Move existing world data:
105
-
106
- ```bash
107
- cd ~/minecraft-servers
108
-
109
- # Stop server first
110
- mcctl stop <server-name>
111
-
112
- # Move world from data/ to worlds/
113
- mv servers/<server-name>/data/<level-name> worlds/<level-name>
114
-
115
- # Start server
116
- mcctl start <server-name>
117
- ```
118
-
119
- **Step 3**: Verify world is loading correctly:
120
-
121
- ```bash
122
- mcctl logs <server-name> -f
123
- # Should NOT see "No existing world data, creating new world"
124
- ```
125
-
126
- #### How to Check if Affected
127
-
128
- Your server is affected if:
129
-
130
- 1. Created with `mcctl create` (versions 1.6.8 ~ 1.6.11)
131
- 2. World data exists in `servers/<name>/data/<world>/` instead of `worlds/<world>/`
132
- 3. Server logs show "No existing world data, creating new world" on restart
133
-
134
- ```bash
135
- # Quick check: If this shows world folders, you're affected
136
- ls ~/minecraft-servers/servers/*/data/*/level.dat 2>/dev/null
137
- ```
138
-
139
- ## [1.6.11] - 2026-01-31
140
-
141
- ### Fixed
142
- - Include CHANGELOG.md in npm package for proper changelog display on npmjs.com
143
-
144
- ## [1.6.10] - 2026-01-30
145
-
146
- ### Added
147
- - System Requirements section in README.md
148
- - Admin Service (Web Console + REST API) in Features list
149
- - AI Assistant link for user support
150
- - CHANGELOG.md with version history
151
-
152
- ### Changed
153
- - Reorganized README.md Documentation section with Read the Docs links
154
- - Updated External Links to include project-specific resources
155
-
156
- ### Fixed
157
- - Broken documentation links in README.md
158
-
159
- ## [1.6.9] - 2026-01-30
160
-
161
- ### Fixed
162
- - Fix template file naming for npm compatibility (`.gitignore` → `gitignore.template`)
163
- - Fix `-v` flag conflict with `--version` in CLI argument parsing
164
-
165
- ### Changed
166
- - Sync shared package version for release consistency
167
-
168
- ## [1.6.8] - 2026-01-30
169
-
170
- ### Fixed
171
- - Add missing template files to npm package distribution
172
- - Include `templates/` directory in package.json files array
173
-
174
- ## [1.6.7] - 2026-01-29
175
-
176
- ### Added
177
- - Version update check with 24-hour cache (#160, #161)
178
- - Display notification when newer version available on npm
179
-
180
- ## [1.6.6] - 2026-01-29
181
-
182
- ### Fixed
183
- - Correct system architecture diagram in documentation
184
- - Convert ASCII diagrams to Mermaid for proper rendering
185
-
186
- ### Changed
187
- - Rename NotebookLM to AI Assistant chatbot
188
- - Simplify mcctl-api Internal Architecture diagram
189
-
190
- ## [1.6.5] - 2026-01-28
191
-
192
- ### Added
193
- - REST API reference documentation
194
- - AI Assistant help section to homepage
195
- - NotebookLM AI Assistant link to navigation
196
-
197
- ### Fixed
198
- - Remove mcctl-console from E2E tests (not yet implemented)
199
-
200
- ## [1.6.4] - 2026-01-27
201
-
202
- ### Fixed
203
- - Skip already published npm packages in release workflow
204
- - Add mod-source-modrinth package to release workflow (#158, #159)
205
-
206
- ## [1.6.3] - 2026-01-27
207
-
208
- ### Added
209
- - Comprehensive LLM knowledge base update for ChatGPT integration
210
-
211
- ### Fixed
212
- - World new command to create directory and .meta file correctly
213
-
214
- ## [1.6.2] - 2026-01-26
215
-
216
- ### Added
217
- - API documentation with implementation status and SSE streaming
218
- - Admin service documentation for native PM2 services (#142, #153)
219
- - E2E tests using PM2 instead of Docker (#141, #152)
220
- - Console init for native PM2 execution (#137, #151)
221
- - PM2 service management types (#135, #144)
222
- - PM2 ecosystem template (#139, #143)
223
- - Console remove command
224
- - Port configuration to console init
225
-
226
- ### Changed
227
- - Optimize console for native PM2 execution (#140, #150)
228
- - Remove Docker configs from API and Console (#147, #148, #149)
229
- - Remove Docker dependencies from API for native execution (#138, #145)
230
- - Migrate console service commands to PM2 (#146)
231
-
232
- ### Fixed
233
- - Auto-build Docker images from source when missing
234
-
235
- ## [1.6.1] - 2026-01-25
236
-
237
- ### Changed
238
- - Major refactoring for PM2 native service execution
239
- - Remove Docker dependency for Admin Service
240
-
241
- ## [1.6.0] - 2026-01-24
242
-
243
- ### Added
244
- - Admin Service: REST API (mcctl-api) + Web Console (mcctl-console)
245
- - `mcctl console` commands for admin service management
246
- - User management with role-based access
247
- - API key authentication support
248
-
249
- ### Changed
250
- - Deprecated `mcctl admin` commands (use `mcctl console` instead)
251
-
252
- ## [1.5.0] - 2026-01-20
253
-
254
- ### Added
255
- - Mod management commands (`mcctl mod search/add/remove/list/sources`)
256
- - Modrinth, CurseForge, Spiget, and direct URL mod sources
257
- - Server backup/restore commands (`mcctl server-backup`, `mcctl server-restore`)
258
-
259
- ## [1.4.0] - 2026-01-15
260
-
261
- ### Added
262
- - Player management commands (whitelist, ban, op, kick)
263
- - World management improvements with `.meta` file support
264
- - Interactive world selection in `mcctl create`
265
-
266
- ## [1.3.0] - 2026-01-10
267
-
268
- ### Added
269
- - nip.io magic DNS support for hostname routing
270
- - VPN mesh network support (Tailscale, ZeroTier)
271
- - Migration script for existing servers to nip.io
272
-
273
- ### Changed
274
- - Dual hostname generation: `.local` and `.nip.io`
275
-
276
- ---
277
-
278
- For older versions, see [GitHub Releases](https://github.com/smallmiro/minecraft-server-manager/releases).
@@ -1,13 +0,0 @@
1
- /**
2
- * Update command options
3
- */
4
- export interface UpdateCommandOptions {
5
- check?: boolean;
6
- force?: boolean;
7
- yes?: boolean;
8
- }
9
- /**
10
- * Execute update command
11
- */
12
- export declare function updateCommand(options: UpdateCommandOptions): Promise<number>;
13
- //# sourceMappingURL=update.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAyCD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4FlF"}
@@ -1,117 +0,0 @@
1
- import { log, colors } from '@minecraft-docker/shared';
2
- import { getInstalledVersion, fetchLatestVersionForced, getCachedVersion, clearCache, isUpdateAvailable, } from '../lib/update-checker.js';
3
- import { spawnSync } from 'child_process';
4
- import * as prompts from '@clack/prompts';
5
- const PACKAGE_NAME = '@minecraft-docker/mcctl';
6
- /**
7
- * Print version comparison box
8
- */
9
- function printVersionInfo(currentVersion, latestVersion, hasUpdate) {
10
- console.log('');
11
- console.log(colors.bold('mcctl Version Info'));
12
- console.log('');
13
- console.log(` Installed: ${colors.cyan(currentVersion)}`);
14
- console.log(` Latest: ${hasUpdate ? colors.yellow(latestVersion) : colors.green(latestVersion)}`);
15
- console.log('');
16
- if (hasUpdate) {
17
- console.log(colors.yellow(` Update available: ${currentVersion} → ${latestVersion}`));
18
- console.log('');
19
- }
20
- else {
21
- console.log(colors.green(' You are using the latest version.'));
22
- console.log('');
23
- }
24
- }
25
- /**
26
- * Execute npm install command using spawnSync (safe, no shell injection)
27
- */
28
- function runNpmInstall() {
29
- console.log('');
30
- console.log(colors.dim(`Running: npm install -g ${PACKAGE_NAME}`));
31
- console.log('');
32
- const result = spawnSync('npm', ['install', '-g', PACKAGE_NAME], {
33
- stdio: 'inherit',
34
- });
35
- return result.status === 0;
36
- }
37
- /**
38
- * Execute update command
39
- */
40
- export async function updateCommand(options) {
41
- const currentVersion = getInstalledVersion();
42
- // If --force, clear cache first
43
- if (options.force) {
44
- clearCache();
45
- }
46
- // Get latest version
47
- let latestVersion;
48
- if (options.force) {
49
- // Force fetch from npm
50
- const spinner = prompts.spinner();
51
- spinner.start('Checking for updates...');
52
- latestVersion = await fetchLatestVersionForced();
53
- if (!latestVersion) {
54
- spinner.stop('Failed to fetch latest version from npm registry');
55
- return 1;
56
- }
57
- spinner.stop('Version check complete');
58
- }
59
- else {
60
- // Try cache first, then fetch
61
- latestVersion = getCachedVersion();
62
- if (!latestVersion) {
63
- const spinner = prompts.spinner();
64
- spinner.start('Checking for updates...');
65
- latestVersion = await fetchLatestVersionForced();
66
- if (!latestVersion) {
67
- spinner.stop('Failed to fetch latest version from npm registry');
68
- return 1;
69
- }
70
- spinner.stop('Version check complete');
71
- }
72
- }
73
- const hasUpdate = isUpdateAvailable(currentVersion, latestVersion);
74
- // Print version info
75
- printVersionInfo(currentVersion, latestVersion, hasUpdate);
76
- // If --check, just show info and exit
77
- if (options.check) {
78
- return hasUpdate ? 1 : 0; // Exit code 1 if update available (useful for scripts)
79
- }
80
- // If no update available, we're done
81
- if (!hasUpdate) {
82
- return 0;
83
- }
84
- // Ask user if they want to update (unless --yes)
85
- if (!options.yes) {
86
- const confirm = await prompts.confirm({
87
- message: `Update mcctl to ${latestVersion}?`,
88
- });
89
- if (prompts.isCancel(confirm) || !confirm) {
90
- console.log('');
91
- console.log(colors.dim('Update cancelled.'));
92
- console.log('');
93
- console.log(` To update manually, run:`);
94
- console.log(colors.cyan(` npm install -g ${PACKAGE_NAME}`));
95
- console.log('');
96
- return 0;
97
- }
98
- }
99
- // Run npm install
100
- const success = runNpmInstall();
101
- if (success) {
102
- console.log('');
103
- console.log(colors.green('✓ mcctl updated successfully!'));
104
- console.log('');
105
- // Clear cache after successful update
106
- clearCache();
107
- return 0;
108
- }
109
- else {
110
- console.log('');
111
- log.error('Update failed. Try running manually:');
112
- console.log(colors.cyan(` sudo npm install -g ${PACKAGE_NAME}`));
113
- console.log('');
114
- return 1;
115
- }
116
- }
117
- //# sourceMappingURL=update.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- /**
2
- * Check for updates and print notification if available
3
- */
4
- /**
5
- * Get the current version (exported for update command)
6
- */
7
- export declare function getInstalledVersion(): string;
8
- /**
9
- * Force fetch latest version from npm (ignores cache)
10
- */
11
- export declare function fetchLatestVersionForced(): Promise<string | null>;
12
- /**
13
- * Get cached latest version if available
14
- */
15
- export declare function getCachedVersion(): string | null;
16
- /**
17
- * Clear the update check cache
18
- */
19
- export declare function clearCache(): void;
20
- /**
21
- * Compare versions and return if update is available
22
- */
23
- export declare function isUpdateAvailable(currentVersion: string, latestVersion: string): boolean;
24
- /**
25
- * Check for updates and print notification if available
26
- */
27
- export declare function checkForUpdates(): Promise<void>;
28
- //# sourceMappingURL=update-checker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/lib/update-checker.ts"],"names":[],"mappings":"AA8JA;;GAEG;AACH;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAGhD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAQjC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAExF;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAgCrD"}
@@ -1,210 +0,0 @@
1
- import { homedir } from 'os';
2
- import { join } from 'path';
3
- import { readFileSync, writeFileSync, existsSync, unlinkSync } from 'fs';
4
- import { colors } from '@minecraft-docker/shared';
5
- const PACKAGE_NAME = '@minecraft-docker/mcctl';
6
- const CACHE_FILE = join(homedir(), '.mcctl-update-check.json');
7
- const CACHE_DURATION_MS = 24 * 60 * 60 * 1000; // 24 hours
8
- const FETCH_TIMEOUT_MS = 2000; // 2 seconds
9
- /**
10
- * Get the current installed version from package.json
11
- */
12
- function getCurrentVersion() {
13
- try {
14
- // Read from the package.json in the dist directory's parent
15
- const packageJsonPath = new URL('../../package.json', import.meta.url);
16
- const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
17
- return packageJson.version;
18
- }
19
- catch {
20
- return '0.0.0';
21
- }
22
- }
23
- /**
24
- * Read cache file
25
- */
26
- function readCache() {
27
- try {
28
- if (!existsSync(CACHE_FILE)) {
29
- return null;
30
- }
31
- const data = readFileSync(CACHE_FILE, 'utf-8');
32
- return JSON.parse(data);
33
- }
34
- catch {
35
- return null;
36
- }
37
- }
38
- /**
39
- * Write cache file
40
- */
41
- function writeCache(data) {
42
- try {
43
- writeFileSync(CACHE_FILE, JSON.stringify(data, null, 2));
44
- }
45
- catch {
46
- // Ignore write errors
47
- }
48
- }
49
- /**
50
- * Fetch latest version from npm registry
51
- */
52
- async function fetchLatestVersion() {
53
- const controller = new AbortController();
54
- const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
55
- try {
56
- const response = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, { signal: controller.signal });
57
- clearTimeout(timeoutId);
58
- if (!response.ok) {
59
- return null;
60
- }
61
- const data = await response.json();
62
- return data.version;
63
- }
64
- catch {
65
- clearTimeout(timeoutId);
66
- return null;
67
- }
68
- }
69
- /**
70
- * Compare two semantic versions
71
- * Returns true if version2 is newer than version1
72
- */
73
- function isNewerVersion(currentVersion, latestVersion) {
74
- const parseVersion = (v) => {
75
- return v.replace(/^v/, '').split('.').map(n => parseInt(n, 10) || 0);
76
- };
77
- const current = parseVersion(currentVersion);
78
- const latest = parseVersion(latestVersion);
79
- for (let i = 0; i < Math.max(current.length, latest.length); i++) {
80
- const c = current[i] ?? 0;
81
- const l = latest[i] ?? 0;
82
- if (l > c)
83
- return true;
84
- if (l < c)
85
- return false;
86
- }
87
- return false;
88
- }
89
- /**
90
- * Print update notification box
91
- */
92
- function printUpdateNotification(currentVersion, latestVersion) {
93
- const message1 = `Update available: ${currentVersion} → ${latestVersion}`;
94
- const message2 = `Run: npm i -g ${PACKAGE_NAME}`;
95
- const maxLen = Math.max(message1.length, message2.length);
96
- const padding = 2;
97
- const boxWidth = maxLen + padding * 2;
98
- const topBorder = '┌' + '─'.repeat(boxWidth) + '┐';
99
- const bottomBorder = '└' + '─'.repeat(boxWidth) + '┘';
100
- const emptyLine = '│' + ' '.repeat(boxWidth) + '│';
101
- const padLine = (text) => {
102
- const leftPad = ' '.repeat(padding);
103
- const rightPad = ' '.repeat(boxWidth - text.length - padding);
104
- return '│' + leftPad + text + rightPad + '│';
105
- };
106
- console.log('');
107
- console.log(colors.yellow(topBorder));
108
- console.log(colors.yellow(emptyLine));
109
- console.log(colors.yellow(padLine(message1)));
110
- console.log(colors.yellow(padLine(message2)));
111
- console.log(colors.yellow(emptyLine));
112
- console.log(colors.yellow(bottomBorder));
113
- console.log('');
114
- }
115
- /**
116
- * Check if cache should be invalidated
117
- * Cache is invalid if:
118
- * 1. Cache doesn't exist
119
- * 2. Cache is older than CACHE_DURATION_MS (24 hours)
120
- * 3. Cached version is older than current version (user upgraded)
121
- */
122
- function isCacheValid(cache, currentVersion) {
123
- if (!cache)
124
- return false;
125
- const now = Date.now();
126
- const isExpired = (now - cache.lastCheck) >= CACHE_DURATION_MS;
127
- if (isExpired)
128
- return false;
129
- // If cached version is older than current, invalidate cache
130
- // This handles the case where user upgraded but cache still has old "latest" version
131
- const cachedIsOlderThanCurrent = isNewerVersion(cache.latestVersion, currentVersion);
132
- if (cachedIsOlderThanCurrent)
133
- return false;
134
- return true;
135
- }
136
- /**
137
- * Check for updates and print notification if available
138
- */
139
- /**
140
- * Get the current version (exported for update command)
141
- */
142
- export function getInstalledVersion() {
143
- return getCurrentVersion();
144
- }
145
- /**
146
- * Force fetch latest version from npm (ignores cache)
147
- */
148
- export async function fetchLatestVersionForced() {
149
- return fetchLatestVersion();
150
- }
151
- /**
152
- * Get cached latest version if available
153
- */
154
- export function getCachedVersion() {
155
- const cache = readCache();
156
- return cache?.latestVersion ?? null;
157
- }
158
- /**
159
- * Clear the update check cache
160
- */
161
- export function clearCache() {
162
- try {
163
- if (existsSync(CACHE_FILE)) {
164
- unlinkSync(CACHE_FILE);
165
- }
166
- }
167
- catch {
168
- // Ignore errors
169
- }
170
- }
171
- /**
172
- * Compare versions and return if update is available
173
- */
174
- export function isUpdateAvailable(currentVersion, latestVersion) {
175
- return isNewerVersion(currentVersion, latestVersion);
176
- }
177
- /**
178
- * Check for updates and print notification if available
179
- */
180
- export async function checkForUpdates() {
181
- try {
182
- const currentVersion = getCurrentVersion();
183
- const cache = readCache();
184
- // Check if cache is valid
185
- if (isCacheValid(cache, currentVersion)) {
186
- // Use cached version
187
- if (isNewerVersion(currentVersion, cache.latestVersion)) {
188
- printUpdateNotification(currentVersion, cache.latestVersion);
189
- }
190
- return;
191
- }
192
- // Fetch latest version from npm
193
- const latestVersion = await fetchLatestVersion();
194
- if (latestVersion) {
195
- // Update cache
196
- writeCache({
197
- lastCheck: Date.now(),
198
- latestVersion,
199
- });
200
- // Check if update is available
201
- if (isNewerVersion(currentVersion, latestVersion)) {
202
- printUpdateNotification(currentVersion, latestVersion);
203
- }
204
- }
205
- }
206
- catch {
207
- // Silently ignore any errors - don't disrupt the user
208
- }
209
- }
210
- //# sourceMappingURL=update-checker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/lib/update-checker.ts"],"names":[],"mappings":"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"}