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
JavaScript
/**
* ╔══════════════════════════════════════════════════════════════════════╗
* ║ 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