Files
tai/taicpp/src/cli/cli.cpp
T

88 lines
4.6 KiB
C++

#include "cli.h"
#include "version.hpp"
#include <cstdio>
#include <string>
namespace detz::cli {
std::string Parser::helpText() {
return std::string("usage: tai [options] [prompt...]\n\noptions:\n"
" --profile P --yes --yolo --auto --continue --debug [SINK] --debug-format FORMAT\n"
" --env E --no-opencode --update-models --eval-retrieval --stats-rag --version\n"
" --cap-manifest --cap-speak --cap-cwd DIR --cap-model MODEL\n"
" --cap-permission-mode MODE --cap-max-turns N --cap COMMAND...\n"
" --serve-mcp KEY --mcp-port PORT --mcp-bind HOST\n"
" --telegram --scheduler --install --install-telegram --uninstall-telegram\n"
" --plexer-wrap --mplex COMMAND... --demo --demo-shot --tui --tui-local --theme NAME\n"
" --help (-h)\n version ") + std::string(kVersion) + "\n";
}
Options Parser::parseOpts(int argc, char** argv) {
Options o;
for (int i = 1; i < argc; ++i) {
std::string a = argv[i];
auto nxt = [&](std::optional<std::string>& f) { if (i+1 < argc) f = argv[++i]; };
if (a=="--profile") nxt(o.profile);
else if (a=="--yes") o.yes = true;
else if (a=="--yolo") o.yolo = true;
else if (a=="--auto") o.auto_ = true;
else if (a=="--continue") o.resume = true;
else if (a=="--debug") { o.debug = (i+1<argc && argv[i+1][0]!='-') ? argv[++i] : "file"; }
else if (a=="--debug-format") nxt(o.debug_format);
else if (a=="--env") nxt(o.env);
else if (a=="--no-opencode") o.no_opencode = true;
else if (a=="--update-models") o.update_models = true;
else if (a=="--eval-retrieval") o.eval_retrieval = true;
else if (a=="--stats-rag") o.stats_rag = true;
else if (a=="--version") o.version = true;
else if (a=="--cap-manifest") o.cap_manifest = true;
else if (a=="--cap-speak") o.cap_speak = true;
else if (a=="--cap-cwd") nxt(o.cap_cwd);
else if (a=="--cap-model") nxt(o.cap_model);
else if (a=="--cap-permission-mode") nxt(o.cap_permission_mode);
else if (a=="--cap-max-turns") { if (i+1<argc) o.cap_max_turns = std::stoi(argv[++i]); }
else if (a=="--cap") { o.cap = std::vector<std::string>{}; while (++i<argc) o.cap->push_back(argv[i]); break; }
else if (a=="--serve-mcp") nxt(o.serve_mcp);
else if (a=="--mcp-port") { if (i+1<argc) o.mcp_port = std::stoi(argv[++i]); }
else if (a=="--mcp-bind") nxt(o.mcp_bind);
else if (a=="--telegram") o.telegram = true;
else if (a=="--scheduler") o.scheduler = true;
else if (a=="--install") o.install = true;
else if (a=="--install-telegram") o.install_telegram = true;
else if (a=="--uninstall-telegram") o.uninstall_telegram = true;
else if (a=="--plexer-wrap") o.plexer_wrap = true;
else if (a=="--mplex") { o.mplex = std::vector<std::string>{}; while (++i<argc) o.mplex->push_back(argv[i]); break; }
else if (a=="--demo") o.demo = true;
else if (a=="--demo-shot") o.demo_shot = true;
else if (a=="--model") { if(i+1<argc) o.model=argv[++i]; }
else if (a=="--driver") { if(i+1<argc) o.driver=argv[++i]; }
else if (a=="--task") { if(i+1<argc) o.task=argv[++i]; }
else if (a=="--cwd") { if(i+1<argc) o.cwd=argv[++i]; }
else if (a=="--argv") { if(i+1<argc) o.argv=argv[++i]; }
else if (a=="--binary") { if(i+1<argc) o.binary=argv[++i]; }
else if (a=="--max-risk") { if(i+1<argc) o.max_risk=argv[++i]; }
else if (a=="--auto-answer") { if(i+1<argc) o.auto_answer=argv[++i]; }
else if (a=="--allow-tool") { if(i+1<argc) o.allow_tool.push_back(argv[++i]); }
else if (a=="--deny-tool") { if(i+1<argc) o.deny_tool.push_back(argv[++i]); }
else if (a=="--tui") o.tui = true;
else if (a=="--tui-local") o.tui_local = true;
else if (a=="--theme") nxt(o.theme);
else if (a=="--help"||a=="-h") o.help = true;
else if (!a.empty() && a[0]=='-') { /* unknown flag: ignore */ }
else o.prompt.push_back(a);
}
return o;
}
Command Parser::parse(int argc, char** argv) {
Command c; c.opts = parseOpts(argc, argv);
if (c.opts.help || argc<=1) c.name = "--help";
else if (c.opts.version) c.name = "--version";
else c.name = "run";
for (int i=1;i<argc;++i) c.args.emplace_back(argv[i]);
return c;
}
int Command::run() {
if (opts.version || name=="--version") { std::puts(std::string(kVersion).c_str()); return 0; }
std::fputs(Parser::helpText().c_str(), stdout);
return 0;
}
int DetzCli::run(int argc, char** argv) { return Parser{}.parse(argc, argv).run(); }
} // namespace detz::cli