HookStackGitHub
Back to catalogue
ContextSessionStartSessionStartOn Claude Code session start· non-blocking

AGENTS.md context loader

Reads AGENTS.md from the project root at session start and injects it as additional context. Works seamlessly alongside CLAUDE.md — useful for projects that use the OpenAI Codex / multi-agent AGENTS.md convention to document agent roles, capabilities and coordination rules.

Use cases

  • Multi-agent projects using AGENTS.md for role definitions
  • Teams migrating from Codex/OpenAI Codex to Claude Code
  • Projects with explicit agent coordination rules

Providers & tags

Claude Code
#session#context#agents#multi-agent

settings.json fragment

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/agents-md-loader.mjs"
          }
        ]
      }
    ]
  }
}

Script · .claude/hooks/agents-md-loader.mjs

#!/usr/bin/env node
// Charge AGENTS.md comme contexte supplémentaire au démarrage de session (SessionStart)
import { readFileSync, existsSync } from 'fs';
import { join } from 'path';
import { fileURLToPath } from 'url';

export function run(
  _input,
  {
    projectDir = process.env.CLAUDE_PROJECT_DIR,
    readFile = readFileSync,
    fileExists = existsSync,
  } = {},
) {
  if (!projectDir) return null;

  const agentsPath = join(projectDir, 'AGENTS.md');
  if (!fileExists(agentsPath)) return null;

  const content = readFile(agentsPath, 'utf8');
  if (!content.trim()) return null;

  return {
    hookSpecificOutput: {
      hookEventName: 'SessionStart',
      additionalContext: content,
    },
  };
}

/* 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(JSON.stringify(result));
}