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()));
}