@@ -210,7 +210,8 @@ program
210210 if ( syncCtlStatus . status === 'ok' ) {
211211 console . log ( chalk . green ( ` ✓ sync-ctl v${ syncCtlStatus . version } ` ) ) ;
212212 } else if ( syncCtlStatus . status === 'outdated' ) {
213- console . log ( chalk . yellow ( ` ⚠ sync-ctl v${ syncCtlStatus . version } (outdated)` ) ) ;
213+ const latestInfo = syncCtlStatus . latestVersion ? ` → ${ syncCtlStatus . latestVersion } available` : '' ;
214+ console . log ( chalk . yellow ( ` ⚠ sync-ctl v${ syncCtlStatus . version } (outdated${ latestInfo } )` ) ) ;
214215 } else {
215216 console . log ( chalk . red ( ' ✗ sync-ctl not found' ) ) ;
216217 }
@@ -236,21 +237,30 @@ program
236237 if ( syncCtlStatus . status === 'missing' || syncCtlStatus . status === 'outdated' ) {
237238 const cargoNow = await checkCargo ( ) ;
238239 if ( cargoNow . status === 'ok' ) {
239- const message = syncCtlStatus . status === 'outdated'
240- ? 'Update syncable-cli via cargo?'
241- : 'Install syncable-cli via cargo?' ;
242- const { installCli } = opts . yes
243- ? { installCli : true }
244- : await inquirer . prompt ( [ { type : 'confirm' , name : 'installCli' , message, default : true } ] ) ;
245-
246- if ( installCli ) {
247- const spinner = ora ( ' Running: cargo install syncable-cli' ) . start ( ) ;
248- const force = syncCtlStatus . status === 'outdated' ;
249- const success = await installSyncCtl ( force ) ;
240+ if ( syncCtlStatus . status === 'outdated' ) {
241+ // Always auto-upgrade to latest — no prompt needed
242+ const latestLabel = syncCtlStatus . latestVersion ? ` to v${ syncCtlStatus . latestVersion } ` : '' ;
243+ const spinner = ora ( ` Upgrading sync-ctl${ latestLabel } ...` ) . start ( ) ;
244+ const success = await installSyncCtl ( true ) ; // force = true for upgrade
250245 if ( success ) {
251- spinner . succeed ( ' sync-ctl installed' ) ;
246+ spinner . succeed ( ` sync-ctl upgraded ${ latestLabel } ` ) ;
252247 } else {
253- spinner . fail ( ' Failed to install sync-ctl. Try: cargo install syncable-cli' ) ;
248+ spinner . fail ( ' Failed to upgrade sync-ctl. Try: cargo install syncable-cli --force' ) ;
249+ }
250+ } else {
251+ // Missing — ask to install
252+ const { installCli } = opts . yes
253+ ? { installCli : true }
254+ : await inquirer . prompt ( [ { type : 'confirm' , name : 'installCli' , message : 'Install syncable-cli via cargo?' , default : true } ] ) ;
255+
256+ if ( installCli ) {
257+ const spinner = ora ( ' Running: cargo install syncable-cli' ) . start ( ) ;
258+ const success = await installSyncCtl ( false ) ;
259+ if ( success ) {
260+ spinner . succeed ( ' sync-ctl installed' ) ;
261+ } else {
262+ spinner . fail ( ' Failed to install sync-ctl. Try: cargo install syncable-cli' ) ;
263+ }
254264 }
255265 }
256266 }
@@ -441,7 +451,8 @@ program
441451 const projectOnlyFlag = opts . projectOnly ? [ '--project-only' ] : [ ] ;
442452 const verboseFlag = opts . verbose ? [ '--verbose' ] : [ ] ;
443453 await program . commands . find ( ( c ) => c . name ( ) === 'uninstall' ) ! . parseAsync ( [ 'node' , 'x' , ...agentsFlag , ...yesFlag ] ) ;
444- await program . commands . find ( ( c ) => c . name ( ) === 'install' ) ! . parseAsync ( [ 'node' , 'x' , '--skip-cli' , ...agentsFlag , ...yesFlag , ...dryRunFlag , ...globalOnlyFlag , ...projectOnlyFlag , ...verboseFlag ] ) ;
454+ // NOTE: Do NOT pass --skip-cli here — update must always check for and install the latest sync-ctl
455+ await program . commands . find ( ( c ) => c . name ( ) === 'install' ) ! . parseAsync ( [ 'node' , 'x' , ...agentsFlag , ...yesFlag , ...dryRunFlag , ...globalOnlyFlag , ...projectOnlyFlag , ...verboseFlag ] ) ;
445456 } ) ;
446457
447458program
0 commit comments