feat: install.sh + auto-update checker for CLI
- tools/install.sh: standalone installer/upgrader, curl-pipe safe (main() wrapper, process.argv instead of stdin, mkdir -p prefix) - packages/mosaic/src/runtime/update-checker.ts: version check module with 1h cache at ~/.cache/mosaic/update-check.json - CLI startup: non-blocking background update check on every invocation - 'mosaic update' command: explicit check + install (--check for CI) - session-start.sh: warns agents when CLI is outdated - Proper semver comparison including pre-release precedence - eslint: allow __tests__ in packages/mosaic for projectService
This commit is contained in:
52
packages/mosaic/__tests__/update-checker.test.ts
Normal file
52
packages/mosaic/__tests__/update-checker.test.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { semverLt, formatUpdateNotice } from '../src/runtime/update-checker.js';
|
||||
import type { UpdateCheckResult } from '../src/runtime/update-checker.js';
|
||||
|
||||
describe('semverLt', () => {
|
||||
it('returns true when a < b', () => {
|
||||
expect(semverLt('0.0.1', '0.0.2')).toBe(true);
|
||||
expect(semverLt('0.1.0', '0.2.0')).toBe(true);
|
||||
expect(semverLt('1.0.0', '2.0.0')).toBe(true);
|
||||
expect(semverLt('0.0.1-alpha.1', '0.0.1-alpha.2')).toBe(true);
|
||||
expect(semverLt('0.0.1-alpha.1', '0.0.1')).toBe(true);
|
||||
});
|
||||
|
||||
it('returns false when a >= b', () => {
|
||||
expect(semverLt('0.0.2', '0.0.1')).toBe(false);
|
||||
expect(semverLt('1.0.0', '1.0.0')).toBe(false);
|
||||
expect(semverLt('2.0.0', '1.0.0')).toBe(false);
|
||||
});
|
||||
|
||||
it('returns false for empty strings', () => {
|
||||
expect(semverLt('', '1.0.0')).toBe(false);
|
||||
expect(semverLt('1.0.0', '')).toBe(false);
|
||||
expect(semverLt('', '')).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('formatUpdateNotice', () => {
|
||||
it('returns empty string when up to date', () => {
|
||||
const result: UpdateCheckResult = {
|
||||
current: '1.0.0',
|
||||
latest: '1.0.0',
|
||||
updateAvailable: false,
|
||||
checkedAt: new Date().toISOString(),
|
||||
registry: 'https://example.com',
|
||||
};
|
||||
expect(formatUpdateNotice(result)).toBe('');
|
||||
});
|
||||
|
||||
it('returns a notice when update is available', () => {
|
||||
const result: UpdateCheckResult = {
|
||||
current: '0.0.1',
|
||||
latest: '0.1.0',
|
||||
updateAvailable: true,
|
||||
checkedAt: new Date().toISOString(),
|
||||
registry: 'https://example.com',
|
||||
};
|
||||
const notice = formatUpdateNotice(result);
|
||||
expect(notice).toContain('0.0.1');
|
||||
expect(notice).toContain('0.1.0');
|
||||
expect(notice).toContain('Update available');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user