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
- Sanitize the name: replace `[^^A-Za-z0-9_-]` with `-` before calling.
- Document/limit the allowed charset at your app's input boundary.
- Use a slugifier for derived names (branch/project titles).
- 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
- Sanitize all bank names with /^[A-Za-z0-9_-]+$/ filtering before any call.
- Slugify branch/project-derived names.
- Reject unsafe names at the input layer with a clear message.
- Add a shared sanitizeBankName() utility instead of fixing per-callsite.
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
- Invalid skill name "${raw}". Use lowercase letters, digits,
- Unknown tool${unknown.length === 1 ? "" : "s"} in --tools: $
- Unknown OAuth provider '${providerArg}'. Known: ${providers
- Invalid marketplace plugin package name: ${JSON.stringify(na
- Invalid plugin name: "${name}"
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/cbed0a062b5c77f6.
Report an issue: GitHub.