HookStackGitHub
Back to catalogue
ContextUserPromptSubmitUserPromptSubmitOn prompt submit · can enrich input⚡ blocking

Automatic session naming

Automatically generates a creative one-word name for each session (e.g. Phoenix, Sage, Nova) on the first prompt, for more human-friendly session tracking.

Use cases

  • Identify sessions in logs by a memorable name
  • Personalize subagent TTS announcements

Providers & tags

Claude Code
#session#naming#agent#identity#personalization

settings.json fragment

{
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/user-prompt-name-agent.mjs",
            "type": "command"
          }
        ]
      }
    ]
  }
}

Script · .claude/hooks/user-prompt-name-agent.mjs

#!/usr/bin/env node
// Attribue un nom à l'agent pour la session courante (UserPromptSubmit)
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
import { join } from 'path';
import { fileURLToPath } from 'url';

const NAMES = ['Phoenix', 'Sage', 'Nova', 'Echo', 'Atlas', 'Cipher', 'Nexus', 'Oracle', 'Aurora', 'Vortex'];

export function run(
  input,
  {
    exists = existsSync,
    readFile = readFileSync,
    writeFile = writeFileSync,
    mkdir = mkdirSync,
    projectDir = process.env.CLAUDE_PROJECT_DIR ?? process.cwd(),
    pickName = () => NAMES[Math.floor(Math.random() * NAMES.length)],
  } = {},
) {
  const sessionId = input.session_id ?? 'unknown';
  const dir = join(projectDir, '.claude', 'data', 'sessions');
  mkdir(dir, { recursive: true });

  const file = join(dir, `${sessionId}.json`);
  let data = { session_id: sessionId };
  if (exists(file)) {
    try { data = JSON.parse(readFile(file, 'utf8')); } catch {}
  }

  if (data.agent_name) return null;

  data.agent_name = pickName();
  writeFile(file, JSON.stringify(data, null, 2));
  return `Tu t'appelles **${data.agent_name}** pour cette session.\n`;
}

/* v8 ignore next 5 */
if (process.argv[1] === fileURLToPath(import.meta.url)) {
  const input = JSON.parse(readFileSync(0, 'utf8'));
  const result = run(input);
  if (result) process.stdout.write(result);
}