#!/usr/bin/env node /** * whats-active CLI — produce a read-only inventory of everything Claude Code * loads for a given repo path. Thin shim over scanners/lib/active-config-reader.mjs. * * Usage: * node whats-active.mjs [path] [--json] [--output-file ] * [--verbose] [--suggest-disables] * * Exit codes: 0=ok, 3=unrecoverable error. * Zero external dependencies. */ import { resolve } from 'node:path'; import { writeFile, stat } from 'node:fs/promises'; import { readActiveConfig } from './lib/active-config-reader.mjs'; async function main() { const args = process.argv.slice(2); let targetPath = '.'; let outputFile = null; let jsonMode = false; let verbose = false; let suggestDisables = false; for (let i = 0; i < args.length; i++) { if (args[i] === '--json') jsonMode = true; else if (args[i] === '--verbose') verbose = true; else if (args[i] === '--suggest-disables') suggestDisables = true; else if (args[i] === '--output-file' && args[i + 1]) outputFile = args[++i]; else if (!args[i].startsWith('-')) targetPath = args[i]; } const absPath = resolve(targetPath); try { const s = await stat(absPath); if (!s.isDirectory()) { process.stderr.write(`Error: ${absPath} is not a directory\n`); process.exit(3); } } catch { process.stderr.write(`Error: path does not exist: ${absPath}\n`); process.exit(3); } const result = await readActiveConfig(absPath, { verbose, suggestDisables }); const json = JSON.stringify(result, null, 2); if (outputFile) { await writeFile(outputFile, json, 'utf-8'); } if (jsonMode || !outputFile) { process.stdout.write(json + '\n'); } } const isDirectRun = process.argv[1] && resolve(process.argv[1]) === resolve(new URL(import.meta.url).pathname); if (isDirectRun) { main().catch(err => { process.stderr.write(`Fatal: ${err.message}\n`); process.exit(3); }); }