Summary
ConfigManager and getCacheDir() / getLocalCacheDir() hardcode their base directory to ~/.mpak/. This prevents downstream consumers (other CLIs, SDKs, embedded usage) from isolating their mpak state to a different directory.
Current behavior
ConfigManager (packages/cli/src/utils/config-manager.ts):
constructor() {
this.configDir = join(homedir(), ".mpak");
this.configFile = join(this.configDir, "config.json");
}
getCacheDir (packages/cli/src/commands/packages/run.ts):
export function getCacheDir(packageName: string): string {
const cacheBase = join(homedir(), ".mpak", "cache");
...
}
getLocalCacheDir (same file):
export function getLocalCacheDir(bundlePath: string): string {
...
return join(homedir(), ".mpak", "cache", "_local", hash);
}
All three are hardcoded. No constructor parameter, no env var, no override path.
Proposed changes
1. ConfigManager: accept optional baseDir
constructor(baseDir?: string) {
this.configDir = baseDir ?? join(homedir(), ".mpak");
this.configFile = join(this.configDir, "config.json");
this.ensureConfigDir();
}
No-arg construction retains current behavior (~/.mpak/). Passing a path overrides it.
2. getCacheDir / getLocalCacheDir: accept optional baseDir
export function getCacheDir(packageName: string, baseDir?: string): string {
const cacheBase = join(baseDir ?? join(homedir(), ".mpak"), "cache");
const safeName = packageName.replace("@", "").replace("/", "-");
return join(cacheBase, safeName);
}
export function getLocalCacheDir(bundlePath: string, baseDir?: string): string {
const absolutePath = resolve(bundlePath);
const hash = createHash("md5").update(absolutePath).digest("hex").slice(0, 12);
return join(baseDir ?? join(homedir(), ".mpak"), "cache", "_local", hash);
}
3. Environment variable fallback (optional)
Consider supporting MPAK_HOME as a fallback before the default:
const defaultBase = process.env["MPAK_HOME"] ?? join(homedir(), ".mpak");
This would be consistent with how MPAK_WORKSPACE already works for workspace paths, and follows the pattern of tools like CARGO_HOME, NPM_CONFIG_PREFIX, GOPATH, etc.
4. Export ConfigManager from SDK (optional, separate issue)
Currently ConfigManager is CLI-internal. If other tools need to read/write mpak config programmatically, it should be exported from @nimblebrain/mpak-sdk or a new @nimblebrain/mpak-config package.
Files affected
packages/cli/src/utils/config-manager.ts — Constructor signature
packages/cli/src/commands/packages/run.ts — getCacheDir(), getLocalCacheDir()
packages/cli/src/commands/config.ts — Update ConfigManager() call sites (no change needed if no-arg default preserved)
Backward compatibility
Fully backward compatible. All changes are additive optional parameters with defaults matching current behavior.
Summary
ConfigManagerandgetCacheDir()/getLocalCacheDir()hardcode their base directory to~/.mpak/. This prevents downstream consumers (other CLIs, SDKs, embedded usage) from isolating their mpak state to a different directory.Current behavior
ConfigManager (
packages/cli/src/utils/config-manager.ts):getCacheDir (
packages/cli/src/commands/packages/run.ts):getLocalCacheDir (same file):
All three are hardcoded. No constructor parameter, no env var, no override path.
Proposed changes
1. ConfigManager: accept optional
baseDirNo-arg construction retains current behavior (
~/.mpak/). Passing a path overrides it.2. getCacheDir / getLocalCacheDir: accept optional
baseDir3. Environment variable fallback (optional)
Consider supporting
MPAK_HOMEas a fallback before the default:This would be consistent with how
MPAK_WORKSPACEalready works for workspace paths, and follows the pattern of tools likeCARGO_HOME,NPM_CONFIG_PREFIX,GOPATH, etc.4. Export ConfigManager from SDK (optional, separate issue)
Currently
ConfigManageris CLI-internal. If other tools need to read/write mpak config programmatically, it should be exported from@nimblebrain/mpak-sdkor a new@nimblebrain/mpak-configpackage.Files affected
packages/cli/src/utils/config-manager.ts— Constructor signaturepackages/cli/src/commands/packages/run.ts—getCacheDir(),getLocalCacheDir()packages/cli/src/commands/config.ts— UpdateConfigManager()call sites (no change needed if no-arg default preserved)Backward compatibility
Fully backward compatible. All changes are additive optional parameters with defaults matching current behavior.