Swadhin Biswas feat: implement mervelas cli engine, built-in tools, and reactive UI · 4/3/2026
0358986
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
* XDG Base Directory utilities for Claude CLI Native Installer
*
* Implements the XDG Base Directory specification for organizing
* native installer components across appropriate system directories.
*
* @see https://specifications.freedesktop.org/basedir-spec/latest/
*/
import { homedir as osHomedir } from 'os'
import { join } from 'path'
type EnvLike = Record<string, string | undefined>
type XDGOptions = {
env?: EnvLike
homedir?: string
}
function resolveOptions(options?: XDGOptions): { env: EnvLike; home: string } {
return {
env: options?.env ?? process.env,
home: options?.homedir ?? process.env.HOME ?? osHomedir(),
}
}
/**
* Get XDG state home directory
* Default: ~/.local/state
* @param options Optional env and homedir overrides for testing
*/
export function getXDGStateHome(options?: XDGOptions): string {
const { env, home } = resolveOptions(options)
return env.XDG_STATE_HOME ?? join(home, '.local', 'state')
}
/**
* Get XDG cache home directory
* Default: ~/.cache
* @param options Optional env and homedir overrides for testing
*/
export function getXDGCacheHome(options?: XDGOptions): string {
const { env, home } = resolveOptions(options)
return env.XDG_CACHE_HOME ?? join(home, '.cache')
}
/**
* Get XDG data home directory
* Default: ~/.local/share
* @param options Optional env and homedir overrides for testing
*/
export function getXDGDataHome(options?: XDGOptions): string {
const { env, home } = resolveOptions(options)
return env.XDG_DATA_HOME ?? join(home, '.local', 'share')
}
/**
* Get user bin directory (not technically XDG but follows the convention)
* Default: ~/.local/bin
* @param options Optional homedir override for testing
*/
export function getUserBinDir(options?: XDGOptions): string {
const { home } = resolveOptions(options)
return join(home, '.local', 'bin')
}