Skip to content

Make ConfigManager and cache paths configurable #51

@mgoldsborough

Description

@mgoldsborough

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.tsgetCacheDir(), 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions