{"record":{"id":"eb33d3774807d956","repo":"can1357/oh-my-pi","slug":"bank-name-name-exceeds-64-characters","errorCode":null,"errorMessage":"Bank name '${name}' exceeds 64 characters","messagePattern":"Bank name '(.+?)' exceeds 64 characters","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"packages/mnemopi/src/core/banks.ts","lineNumber":88,"sourceCode":"\t\tif (oldName === \"default\") throw new ValueError(\"Cannot rename 'default' bank\");\n\t\tthis.validateName(newName);\n\t\tconst oldDir = join(this.banksDir, oldName);\n\t\tconst newDir = join(this.banksDir, newName);\n\t\tif (!existsSync(oldDir)) throw new ValueError(`Bank '${oldName}' does not exist`);\n\t\tif (existsSync(newDir)) throw new ValueError(`Bank '${newName}' already exists`);\n\t\trenameSync(oldDir, newDir);\n\t\treturn join(newDir, DB_FILENAME);\n\t}\n\tgetBankStats(name: string): BankStats {\n\t\tconst dbPath = this.getBankDbPath(name);\n\t\tconst present = existsSync(dbPath);\n\t\tconst size = present ? statSync(dbPath).size : 0;\n\t\treturn { name, exists: present, db_path: dbPath, dbSizeBytes: size, db_size_bytes: size };\n\t}\n\tprivate validateName(name: string): void {\n\t\tif (name.length === 0) throw new ValueError(\"Bank name cannot be empty\");\n\t\tif (name === \"default\") return;\n\t\tif (name.length > 64) throw new ValueError(`Bank name '${name}' exceeds 64 characters`);\n\t\tfor (let i = 0; i < name.length; i++) {\n\t\t\tconst code = name.charCodeAt(i);\n\t\t\tconst ok =\n\t\t\t\t(code >= 48 && code <= 57) ||\n\t\t\t\t(code >= 65 && code <= 90) ||\n\t\t\t\t(code >= 97 && code <= 122) ||\n\t\t\t\tcode === 45 ||\n\t\t\t\tcode === 95;\n\t\t\tif (!ok) throw new ValueError(`Invalid bank name '${name}'. Use alphanumeric, hyphens, underscores only.`);\n\t\t}\n\t}\n}\n\nlet defaultBank = \"default\";\n\nexport function createBank(name: string, dataDir?: string): string {\n\tconst manager = new BankManager(dataDir);\n\treturn manager.createBank(name);","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/mnemopi/src/core/banks.ts#L70-L106","documentation":"Bank names are capped at 64 characters by `validateName()` because they are used verbatim as directory names and appear in DB paths; overly long names risk filesystem path limits.","triggerScenarios":"Calling `createBank`/`deleteBank`/`renameBank(newName)`/`getBankDbPath` with a name whose length exceeds 64 (the \"default\" name short-circuits earlier and is unaffected).","commonSituations":"Using a UUID+timestamp composite as a bank name, auto-generating bank names from long project paths or branch names, copying a filesystem path in as the bank name.","solutions":["Shorten the name to ≤64 characters (hash or truncate long parts).","Derive the bank name from a short slug rather than the full path/branch name.","For rename, sanitize `newName` before calling.","Catch the ValueError and prompt for a shorter name."],"exampleFix":"// before\nbanks.createBank(branchName); // e.g. \"feature/very-long-branch-name-...\"\n// after\nconst slug = branchName.replace(/[^\\w-]/g, \"-\").slice(0, 64);\nbanks.createBank(slug);","handlingStrategy":"validation","validationCode":"if (name !== \"default\" && name.length > 64) {\n  throw new Error(`Bank name too long (${name.length} > 64): ${name.slice(0, 20)}...`);\n}","typeGuard":"null","tryCatchPattern":"try {\n  banks.createBank(name);\n} catch (err) {\n  if (err instanceof ValueError && err.message.includes(\"exceeds 64\")) {\n    banks.createBank(name.slice(0, 64));\n  } else throw err;\n}","preventionTips":["Slugify and cap derived names at 64 chars.","Don't use full paths or long branch names as bank names.","Validate name length at input boundaries.","Add a length check helper shared across bank calls."],"tags":["bank","validation","length-limit"],"backgroundTag":"invalid-argument","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}