#include #include #include #include #include #include // Simple demo CLI for YAMS int main(int argc, char* argv[]) { try { // Create CLI app CLI::App app{"YAMS Document Management System", "yams"}; app.set_version_flag("--version", "1.0.0 (Demo)"); // Global options std::string dataDir = (std::filesystem::path(std::getenv("HOME") ? std::getenv("HOME") : ".") / ".yams").string(); bool verbose = false; app.add_option("--data-dir", dataDir, "Data directory for storage")->default_val(dataDir); app.add_flag("-v,--verbose", verbose, "Enable verbose output"); // Add command auto* addCmd = app.add_subcommand("add", "Add a document to the content store"); std::string addFile; std::vector tags; addCmd->add_option("file", addFile, "Path to the file to add")->required()->check(CLI::ExistingFile); addCmd->add_option("-t,--tags", tags, "Tags for the document"); addCmd->callback([&]() { std::cout << "[INFO] Adding file: " << addFile << std::endl; // Simulate adding file auto hash = std::to_string(std::hash{}(addFile)); std::cout << "Document added successfully!" << std::endl; std::cout << "Hash: " << hash << std::endl; std::cout << "File: " << addFile << std::endl; if (!tags.empty()) { std::cout << "Tags: "; for (const auto& tag : tags) std::cout << tag << " "; std::cout << std::endl; } // Simulate storage stats std::cout << "Bytes stored: 1024" << std::endl; std::cout << "Dedup ratio: 15%" << std::endl; }); // Search command auto* searchCmd = app.add_subcommand("search", "Search documents"); std::string query; size_t limit = 10; searchCmd->add_option("query", query, "Search query")->required(); searchCmd->add_option("-l,--limit", limit, "Maximum results")->default_val(10); searchCmd->callback([&]() { std::cout << "[INFO] Searching for: " << query << std::endl; // Simulate search results std::cout << "Search Results:" << std::endl; std::cout << "==============" << std::endl; std::cout << "Query: " << query << std::endl; std::cout << "Total: 2 results" << std::endl; std::cout << std::endl; std::cout << "1. Document: example.txt" << std::endl; std::cout << " Score: 0.95" << std::endl; std::cout << " Snippet: This is a matching document containing '" << query << "'..." << std::endl; std::cout << std::endl; std::cout << "2. Document: readme.md" << std::endl; std::cout << " Score: 0.85" << std::endl; std::cout << " Snippet: Another document with relevant content..." << std::endl; }); // Serve command (MCP server) auto* serveCmd = app.add_subcommand("serve", "Start MCP server for AI agent integration"); std::string transport = "stdio"; serveCmd->add_option("-t,--transport", transport, "Transport type")->default_val("stdio"); serveCmd->callback([&]() { std::cout << "[INFO] Starting MCP server with " << transport << " transport" << std::endl; std::cout << "MCP Server running. Send JSON-RPC requests on stdin..." << std::endl; std::cout << std::endl; std::cout << "Example initialize request:" << std::endl; std::cout << R"({"jsonrpc":"2.0","id":1,"method":"initialize","params":{"clientInfo":{"name":"test","version":"1.0"}}})" << std::endl; std::cout << std::endl; // Simple MCP server simulation std::string line; while (std::getline(std::cin, line) && !line.empty()) { std::cout << "[RECV] " << line << std::endl; // Simple response simulation if (line.find("initialize") != std::string::npos) { std::cout << R"({"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","serverInfo":{"name":"yams-mcp","version":"1.0.0"},"capabilities":{"tools":{}}}})" << std::endl; } else if (line.find("tools/list") != std::string::npos) { std::cout << R"({"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"search_documents","description":"Search documents by query","inputSchema":{"type":"object","properties":{"query":{"type":"string"}}}}]}})" << std::endl; } else if (line.find("tools/call") != std::string::npos) { std::cout << R"({"jsonrpc":"2.0","id":3,"result":{"total":2,"results":[{"title":"example.txt","score":0.95},{"title":"readme.md","score":0.85}]}})" << std::endl; } else { std::cout << R"({"jsonrpc":"2.0","error":{"code":-32601,"message":"Method not found"}})" << std::endl; } std::cout.flush(); } std::cout << "[INFO] MCP server stopped" << std::endl; }); // Stats command auto* statsCmd = app.add_subcommand("stats", "Show storage statistics"); statsCmd->callback([&]() { std::cout << "YAMS Storage Statistics" << std::endl; std::cout << "=========================" << std::endl; std::cout << "Data directory: " << dataDir << std::endl; std::cout << "Total documents: 42" << std::endl; std::cout << "Total size: 1.2 GB" << std::endl; std::cout << "Unique blocks: 8,431" << std::endl; std::cout << "Deduplication ratio: 35%" << std::endl; std::cout << "Compression ratio: 68%" << std::endl; std::cout << "Cache hit ratio: 92%" << std::endl; }); // Version info auto* versionCmd = app.add_subcommand("version", "Show version information"); versionCmd->callback([&]() { std::cout << "YAMS Document Management System" << std::endl; std::cout << "Version: 1.0.0 (Demo)" << std::endl; std::cout << "Build: " << __DATE__ << " " << __TIME__ << std::endl; std::cout << "Features: CLI, MCP Server, Content Storage, Search" << std::endl; std::cout << "Data directory: " << dataDir << std::endl; }); // Parse command line CLI11_PARSE(app, argc, argv); return 0; } catch (const std::exception& e) { std::cerr << "Fatal error: " << e.what() << std::endl; return 1; } }