yams/tools/yams-cli/demo.cpp
2025-08-10 23:41:49 -04:00

140 lines
No EOL
6.8 KiB
C++

#include <CLI/CLI.hpp>
#include <iostream>
#include <filesystem>
#include <fstream>
#include <iomanip>
#include <sstream>
// 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<std::string> 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<std::string>{}(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;
}
}