UNPKG

overmind-mcp

Version:

Orchestrateur universel agents IA multi-modeles via MCP. Inclut le protocole 'Custom-Nickname' pour identifier vos agents avec des surnoms originaux (The Chaos Prophet, Shadow Sniper, etc.), l'isolation mémoire (Private Memory Context) et le support pour

134 lines • 5.32 kB
/** * ╔══════════════════════════════════════════════════════════════════════╗ * ║ OVERMIND BRIDGE — ArgParser (Zero-Dep CLI Parser) ║ * ║ ║ * ║ Parser d'arguments minimaliste, cohérent avec le style du projet. ║ * ║ Supporte : ║ * ║ - Flags courts (-v) et longs (--verbose) ║ * ║ - Valeurs via = ou espace (--port 3100, --port=3100) ║ * ║ - Valeurs répétées (--include a --include b) ║ * ║ - Booléens negations (--no-auth) ║ * ║ - Stdin auto-détection ║ * ╚══════════════════════════════════════════════════════════════════════╝ */ // ─── Public API ──────────────────────────────────────────────────────────── /** * Parse process.argv.slice(2). Le premier non-flag devient `command`. */ export function parseArgs(argv = process.argv.slice(2)) { const flags = {}; const positionals = []; let command; let commandConsumed = false; for (let i = 0; i < argv.length; i++) { const arg = argv[i]; // --flag=value if (arg.startsWith('--') && arg.includes('=')) { const eqIdx = arg.indexOf('='); const key = arg.slice(2, eqIdx); const value = arg.slice(eqIdx + 1); flags[key] = coerceValue(value, true); if (!commandConsumed) { command = key; // au cas où le subcommand est en --foo=bar (rare) commandConsumed = true; } continue; } // --flag value | --flag if (arg.startsWith('--')) { const key = arg.slice(2); const next = argv[i + 1]; // Booléen si prochain arg est un autre flag ou rien if (next === undefined || next.startsWith('--')) { flags[key] = true; } else { flags[key] = coerceValue(next, false); i++; // consomme la valeur } continue; } // -f value | -f | -abc (flags courts combinés) if (arg.startsWith('-') && arg.length > 1) { // Combinés : -abc → a, b, c tous booléens if (/^-[a-z]+$/i.test(arg)) { for (const ch of arg.slice(1)) { flags[ch] = true; } continue; } // -v value const key = arg.slice(1); const next = argv[i + 1]; if (next === undefined || next.startsWith('--')) { flags[key] = true; } else { flags[key] = coerceValue(next, false); i++; } continue; } // Positionnel if (!commandConsumed) { command = arg; commandConsumed = true; } else { positionals.push(arg); } } return { command, flags, positionals, raw: argv }; } /** * Récupère un flag avec valeur par défaut et coercion de type. */ export function getFlag(args, name, defaultValue) { const value = args.flags[name]; if (value === undefined) return defaultValue; return value; } /** * Récupère un flag, throw si manquant. */ export function requireFlag(args, name) { const value = args.flags[name]; if (value === undefined) { throw new Error(`Missing required flag: --${name}`); } return value; } // ─── Helpers ─────────────────────────────────────────────────────────────── function coerceValue(raw, _fromEquals) { // Si --flag=true / false if (raw === 'true') return true; if (raw === 'false') return false; // Si nombre if (/^-?\d+(\.\d+)?$/.test(raw)) return Number(raw); // Sinon string brut return raw; } // ─── Stdin detection ─────────────────────────────────────────────────────── /** * Vérifie si stdin a des données piped (TTY = false). */ export function hasStdinData() { return !process.stdin.isTTY; } /** * Lit stdin en entier (utf-8). */ export async function readStdin() { return new Promise((resolve, reject) => { let data = ''; process.stdin.setEncoding('utf-8'); process.stdin.on('data', (chunk) => (data += chunk)); process.stdin.on('end', () => resolve(data)); process.stdin.on('error', reject); }); } //# sourceMappingURL=ArgParser.js.map