can1357/oh-my-pi · error · ValueError

Invalid bank name '${name}'. Use alphanumeric, hyphens, unde

Error message

Invalid bank name '${name}'. Use alphanumeric, hyphens, underscores only.

What it means

Bank names may only contain ASCII alphanumerics, hyphens, and underscores (validated per character code in `validateName()`). Anything else — spaces, slashes, dots, Unicode — is rejected, again because names map directly to directory names.

Source

Thrown at packages/mnemopi/src/core/banks.ts:97

	getBankStats(name: string): BankStats {
		const dbPath = this.getBankDbPath(name);
		const present = existsSync(dbPath);
		const size = present ? statSync(dbPath).size : 0;
		return { name, exists: present, db_path: dbPath, dbSizeBytes: size, db_size_bytes: size };
	}
	private validateName(name: string): void {
		if (name.length === 0) throw new ValueError("Bank name cannot be empty");
		if (name === "default") return;
		if (name.length > 64) throw new ValueError(`Bank name '${name}' exceeds 64 characters`);
		for (let i = 0; i < name.length; i++) {
			const code = name.charCodeAt(i);
			const ok =
				(code >= 48 && code <= 57) ||
				(code >= 65 && code <= 90) ||
				(code >= 97 && code <= 122) ||
				code === 45 ||
				code === 95;
			if (!ok) throw new ValueError(`Invalid bank name '${name}'. Use alphanumeric, hyphens, underscores only.`);
		}
	}
}

let defaultBank = "default";

export function createBank(name: string, dataDir?: string): string {
	const manager = new BankManager(dataDir);
	return manager.createBank(name);
}
export function deleteBank(name: string, dataDir?: string, force = false): boolean {
	const manager = new BankManager(dataDir);
	return manager.deleteBank(name, force);
}
export function listBanks(dataDir?: string): string[] {
	const manager = new BankManager(dataDir);
	return manager.listBanks();
}

View on GitHub (pinned to 9690622007)

Solutions

  1. Sanitize the name: replace `[^^A-Za-z0-9_-]` with `-` before calling.
  2. Document/limit the allowed charset at your app's input boundary.
  3. Use a slugifier for derived names (branch/project titles).
  4. Catch the ValueError and re-prompt or auto-fix the name.

Example fix

// before
banks.createBank("feature/auth v2");
// after
const safe = name.replace(/[^A-Za-z0-9_-]/g, "-");
banks.createBank(safe); // "feature-auth-v2"
Defensive patterns

Strategy: validation

Validate before calling

const BANK_NAME_RE = /^[A-Za-z0-9_-]+$/;
if (name !== "default" && !BANK_NAME_RE.test(name)) {
  throw new Error(`Invalid bank name: ${name}`);
}

Type guard

null

Try / catch

try {
  banks.createBank(name);
} catch (err) {
  if (err instanceof ValueError && err.message.includes("Invalid bank name")) {
    banks.createBank(name.replace(/[^A-Za-z0-9_-]/g, "-"));
  } else throw err;
}

Prevention

When it happens

Trigger: Calling any bank-taking API (`createBank`, `deleteBank`, `renameBank` old/new, `getBankDbPath`) with a name containing a forbidden character (e.g. `"my bank"`, `"project/x"`, `"café"`).

Common situations: Passing branch names with `/` or paths as bank names, names with spaces from UI input, non-ASCII names from localized tooling, shell interpolation introducing slashes.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/cbed0a062b5c77f6. Report an issue: GitHub.