#!/usr/bin/env node // coord - SessionStart hook: inject this repo's pending coordination inbox // (directed messages + unseen broadcasts) as additionalContext. // // Thin Node wrapper (marketplace convention: hooks are .mjs) around the bash // engine scripts/coord-inbox.sh, which owns the mailbox semantics and is // covered by scripts/coord-selftest.sh. Zero dependencies. Always exits 0 - // a broken mailbox must never block a session. import { execFileSync } from 'node:child_process'; import { basename, dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; function emit(context) { const out = { continue: true }; if (context) { out.hookSpecificOutput = { hookEventName: 'SessionStart', additionalContext: context }; } process.stdout.write(JSON.stringify(out) + '\n'); } try { const pluginRoot = process.env.CLAUDE_PLUGIN_ROOT || join(dirname(fileURLToPath(import.meta.url)), '..', '..'); let repoRoot = ''; try { repoRoot = execFileSync('git', ['rev-parse', '--show-toplevel'], { stdio: ['ignore', 'pipe', 'ignore'], encoding: 'utf8' }).trim(); } catch { // not a git repo: fall back to the working directory below } if (!repoRoot) repoRoot = process.cwd(); const inbox = execFileSync('bash', [join(pluginRoot, 'scripts', 'coord-inbox.sh'), '--repo', basename(repoRoot)], { stdio: ['ignore', 'pipe', 'ignore'], encoding: 'utf8' }); emit(inbox.trim() ? '== Repo coordination (unread messages) ==\n' + inbox : ''); } catch { emit(''); }