#include "TaskBoardApplication.hpp" #include #include #include #include #include using namespace tp::taskboard; namespace { const char* environmentOr(const char* name, const char* fallback) { const char* value = std::getenv(name); return value && *value ? value : fallback; } McpServerCommand taskServerCommand() { const std::string directory = environmentOr("TASKBOARD_SERVER_DIR", TASKBOARD_SERVER_DIR); McpServerCommand command; command.executable = "uv"; command.arguments = { "run", "--project", directory, "python", directory + "/server.py" }; command.stderrPath = (std::filesystem::temp_directory_path() / "taskboard-server.log").string(); for (const char* name : { "TASKS_DB", "AGENTS_DATA_DIR", "AGENTS_SESSIONS_DIR", "AGENTS_TMUX_SOCKET", "TASKBOARD_CONNECTION_FILE" }) { if (const char* value = std::getenv(name)) command.environment.emplace_back(name, value); } command.environment.emplace_back("TASKBOARD_MONITOR_SESSIONS", "1"); return command; } bool launchDetached(const std::vector& command) { const pid_t child = ::fork(); if (child < 0) return false; if (child == 0) { ::setsid(); if (::fork() != 0) ::_exit(0); std::vector argv; for (const std::string& part : command) argv.push_back(const_cast(part.c_str())); argv.push_back(nullptr); ::execvp(argv[0], argv.data()); ::_exit(127); } int status = 0; ::waitpid(child, &status, 0); return WIFEXITED(status) && WEXITSTATUS(status) == 0; } bool demoRequested(int argc, char** argv) { for (int index = 1; index < argc; index++) { if (std::strcmp(argv[index], "--demo") == 0) return true; } return false; } } int main(int argc, char** argv) { TaskBoardPlatform platform; platform.connect = [](McpClient& client, const ServerConnection&, std::string& error) { return client.start(taskServerCommand(), error); }; platform.openTerminal = [](long id, const std::string& target) { return launchDetached( { environmentOr("TASKBOARD_TERMINAL", "kitty"), "--title", "task #" + std::to_string(id), "tmux", "attach", "-t", target } ); }; return runTaskBoardApplication(std::move(platform), demoRequested(argc, argv)); }