diff --git a/CMakeLists.txt b/CMakeLists.txt index dd7bfe4..874b784 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,6 +126,7 @@ add_qtc_plugin(QodeAssist tools/FindSymbolTool.hpp tools/FindSymbolTool.cpp tools/FindFileTool.hpp tools/FindFileTool.cpp tools/CreateNewFileTool.hpp tools/CreateNewFileTool.cpp + tools/BuildProjectTool.hpp tools/BuildProjectTool.cpp providers/ClaudeMessage.hpp providers/ClaudeMessage.cpp providers/OpenAIMessage.hpp providers/OpenAIMessage.cpp providers/OllamaMessage.hpp providers/OllamaMessage.cpp diff --git a/ChatView/qml/RootItem.qml b/ChatView/qml/RootItem.qml index 7472157..7f5990f 100644 --- a/ChatView/qml/RootItem.qml +++ b/ChatView/qml/RootItem.qml @@ -164,16 +164,6 @@ ChatRootView { toolContent: model.content } } - - Component { - id: fileEditSuggestionComponent - - FileEditChangesItem { - id: fileEditItem - - width: chatListView.width - 10 - } - } } ScrollView { diff --git a/tools/BuildProjectTool.cpp b/tools/BuildProjectTool.cpp new file mode 100644 index 0000000..360a927 --- /dev/null +++ b/tools/BuildProjectTool.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2025 Petr Mironychev + * + * This file is part of QodeAssist. + * + * QodeAssist is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * QodeAssist is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with QodeAssist. If not, see . + */ + +#include "BuildProjectTool.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace QodeAssist::Tools { + +BuildProjectTool::BuildProjectTool(QObject *parent) + : BaseTool(parent) +{ +} + +QString BuildProjectTool::name() const +{ + return "build_project"; +} + +QString BuildProjectTool::stringName() const +{ + return "Building project"; +} + +QString BuildProjectTool::description() const +{ + return "Build the current project in Qt Creator. " + "Returns build status and any compilation errors/warnings. " + "Optional 'rebuild' parameter: set to true to force a clean rebuild (default: false)."; +} + +QJsonObject BuildProjectTool::getDefinition(LLMCore::ToolSchemaFormat format) const +{ + QJsonObject definition; + definition["type"] = "object"; + + QJsonObject properties; + properties["rebuild"] = QJsonObject{ + {"type", "boolean"}, + {"description", "Force a clean rebuild instead of incremental build (default: false)"}}; + + definition["properties"] = properties; + definition["required"] = QJsonArray(); + + switch (format) { + case LLMCore::ToolSchemaFormat::OpenAI: + return customizeForOpenAI(definition); + case LLMCore::ToolSchemaFormat::Claude: + return customizeForClaude(definition); + case LLMCore::ToolSchemaFormat::Ollama: + return customizeForOllama(definition); + case LLMCore::ToolSchemaFormat::Google: + return customizeForGoogle(definition); + } + + return definition; +} + +LLMCore::ToolPermissions BuildProjectTool::requiredPermissions() const +{ + return LLMCore::ToolPermission::None; +} + +QFuture BuildProjectTool::executeAsync(const QJsonObject &input) +{ + auto *project = ProjectExplorer::ProjectManager::startupProject(); + if (!project) { + LOG_MESSAGE("BuildProjectTool: No active project found"); + return QtFuture::makeReadyFuture( + QString("Error: No active project found. Please open a project in Qt Creator.")); + } + + LOG_MESSAGE(QString("BuildProjectTool: Active project is '%1'").arg(project->displayName())); + + if (ProjectExplorer::BuildManager::isBuilding(project)) { + LOG_MESSAGE("BuildProjectTool: Build is already in progress"); + return QtFuture::makeReadyFuture( + QString("Error: Build is already in progress. Please wait for it to complete.")); + } + + bool rebuild = input.value("rebuild").toBool(false); + + LOG_MESSAGE(QString("BuildProjectTool: Starting %1").arg(rebuild ? "rebuild" : "build")); + + QMetaObject::invokeMethod( + qApp, + [project, rebuild]() { + if (rebuild) { + ProjectExplorer::BuildManager::rebuildProjectWithDependencies( + project, ProjectExplorer::ConfigSelection::Active); + } else { + ProjectExplorer::BuildManager::buildProjectWithDependencies( + project, ProjectExplorer::ConfigSelection::Active); + } + }, + Qt::QueuedConnection); + + return QtFuture::makeReadyFuture( + QString("Build %1 started for project '%2'. Check the Compile Output pane for progress.") + .arg(rebuild ? "rebuild" : "build") + .arg(project->displayName())); +} + +} // namespace QodeAssist::Tools diff --git a/tools/BuildProjectTool.hpp b/tools/BuildProjectTool.hpp new file mode 100644 index 0000000..bf8cb74 --- /dev/null +++ b/tools/BuildProjectTool.hpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2025 Petr Mironychev + * + * This file is part of QodeAssist. + * + * QodeAssist is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * QodeAssist is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with QodeAssist. If not, see . + */ + +#pragma once + +#include +#include + +namespace QodeAssist::Tools { + +class BuildProjectTool : public LLMCore::BaseTool +{ + Q_OBJECT +public: + explicit BuildProjectTool(QObject *parent = nullptr); + + QString name() const override; + QString stringName() const override; + QString description() const override; + QJsonObject getDefinition(LLMCore::ToolSchemaFormat format) const override; + LLMCore::ToolPermissions requiredPermissions() const override; + + QFuture executeAsync(const QJsonObject &input = QJsonObject()) override; +}; + +} // namespace QodeAssist::Tools diff --git a/tools/ToolsFactory.cpp b/tools/ToolsFactory.cpp index 613556b..70d5135 100644 --- a/tools/ToolsFactory.cpp +++ b/tools/ToolsFactory.cpp @@ -24,6 +24,7 @@ #include #include +#include "BuildProjectTool.hpp" #include "CreateNewFileTool.hpp" #include "FindFileTool.hpp" #include "FindSymbolTool.hpp" @@ -51,6 +52,7 @@ void ToolsFactory::registerTools() registerTool(new FindSymbolTool(this)); registerTool(new FindFileTool(this)); registerTool(new CreateNewFileTool(this)); + registerTool(new BuildProjectTool(this)); LOG_MESSAGE(QString("Registered %1 tools").arg(m_tools.size())); }