diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a16a5eb6..3cada243 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -172,10 +172,10 @@ if (YAZE_BUILD_LIB) ${YAZE_GUI_SRC} ${YAZE_UTIL_SRC} # CLI service sources (needed for ProposalDrawer) - cli/service/proposal_registry.cc - cli/service/rom_sandbox_manager.cc + cli/service/planning/proposal_registry.cc + cli/service/rom/rom_sandbox_manager.cc # cli/service/gui_automation_client.cc # Moved to yaze_c - cli/service/test_workflow_generator.cc + cli/service/testing/test_workflow_generator.cc ) # Create full library for C API @@ -184,7 +184,7 @@ if (YAZE_BUILD_LIB) ${YAZE_CORE_SOURCES} ${YAZE_GUI_SRC} ${IMGUI_SRC} - cli/service/gui_automation_client.cc + cli/service/gui/gui_automation_client.cc ) # Add emulator sources (required for comprehensive testing) diff --git a/src/app/app.cmake b/src/app/app.cmake index c14d9336..213451b5 100644 --- a/src/app/app.cmake +++ b/src/app/app.cmake @@ -19,9 +19,9 @@ if (APPLE) ${YAZE_GUI_SRC} ${IMGUI_SRC} # CLI service sources (needed for ProposalDrawer) - cli/service/proposal_registry.cc - cli/service/rom_sandbox_manager.cc - cli/service/policy_evaluator.cc + cli/service/planning/proposal_registry.cc + cli/service/rom/rom_sandbox_manager.cc + cli/service/planning/policy_evaluator.cc # Bundled Resources ${YAZE_RESOURCE_FILES} ) @@ -58,9 +58,9 @@ else() ${YAZE_GUI_SRC} ${IMGUI_SRC} # CLI service sources (needed for ProposalDrawer) - cli/service/proposal_registry.cc - cli/service/rom_sandbox_manager.cc - cli/service/policy_evaluator.cc + cli/service/planning/proposal_registry.cc + cli/service/rom/rom_sandbox_manager.cc + cli/service/planning/policy_evaluator.cc ) # Add asset files for Windows/Linux builds diff --git a/src/app/editor/system/proposal_drawer.cc b/src/app/editor/system/proposal_drawer.cc index 0a68066b..5adf4d86 100644 --- a/src/app/editor/system/proposal_drawer.cc +++ b/src/app/editor/system/proposal_drawer.cc @@ -8,11 +8,11 @@ #include "absl/time/time.h" #include "imgui/imgui.h" #include "app/gui/icons.h" -#include "cli/service/rom_sandbox_manager.h" +#include "cli/service/rom/rom_sandbox_manager.h" // Policy evaluation support (optional, only in main yaze build) #ifdef YAZE_ENABLE_POLICY_FRAMEWORK -#include "cli/service/policy_evaluator.h" +#include "cli/service/planning/policy_evaluator.h" #endif namespace yaze { diff --git a/src/app/editor/system/proposal_drawer.h b/src/app/editor/system/proposal_drawer.h index deb861c7..16ea05bf 100644 --- a/src/app/editor/system/proposal_drawer.h +++ b/src/app/editor/system/proposal_drawer.h @@ -5,7 +5,7 @@ #include #include "absl/status/status.h" -#include "cli/service/proposal_registry.h" +#include "cli/service/planning/proposal_registry.h" namespace yaze { class Rom; diff --git a/src/app/emu/emu.cmake b/src/app/emu/emu.cmake index cad48496..21b533c8 100644 --- a/src/app/emu/emu.cmake +++ b/src/app/emu/emu.cmake @@ -15,8 +15,8 @@ if (NOT YAZE_MINIMAL_BUILD AND APPLE) ${YAZE_GUI_SRC} ${IMGUI_SRC} # CLI service sources (needed for ProposalDrawer) - cli/service/proposal_registry.cc - cli/service/rom_sandbox_manager.cc + cli/service/planning/proposal_registry.cc + cli/service/rom/rom_sandbox_manager.cc ) target_link_libraries(yaze_emu PUBLIC ${COCOA_LIBRARY}) elseif(NOT YAZE_MINIMAL_BUILD) @@ -33,8 +33,8 @@ elseif(NOT YAZE_MINIMAL_BUILD) ${YAZE_GUI_SRC} ${IMGUI_SRC} # CLI service sources (needed for ProposalDrawer) - cli/service/proposal_registry.cc - cli/service/rom_sandbox_manager.cc + cli/service/planning/proposal_registry.cc + cli/service/rom/rom_sandbox_manager.cc ) endif() diff --git a/src/cli/handlers/agent.cc b/src/cli/handlers/agent.cc index 55b9e36a..ce4066f9 100644 --- a/src/cli/handlers/agent.cc +++ b/src/cli/handlers/agent.cc @@ -12,7 +12,7 @@ namespace agent { namespace { constexpr absl::string_view kUsage = - "Usage: agent " + "Usage: agent " "[options]"; } // namespace @@ -35,6 +35,9 @@ absl::Status Agent::Run(const std::vector& arg_vec) { if (subcommand == "diff") { return agent::HandleDiffCommand(rom_, subcommand_args); } + if (subcommand == "accept") { + return agent::HandleAcceptCommand(subcommand_args, rom_); + } if (subcommand == "test") { return agent::HandleTestCommand(subcommand_args); } diff --git a/src/cli/handlers/agent/commands.h b/src/cli/handlers/agent/commands.h index 4ea01310..8b42972d 100644 --- a/src/cli/handlers/agent/commands.h +++ b/src/cli/handlers/agent/commands.h @@ -17,6 +17,7 @@ absl::Status HandleRunCommand(const std::vector& args, absl::Status HandlePlanCommand(const std::vector& args); absl::Status HandleDiffCommand(Rom& rom, const std::vector& args); +absl::Status HandleAcceptCommand(const std::vector& args, Rom& rom); absl::Status HandleTestCommand(const std::vector& args); absl::Status HandleGuiCommand(const std::vector& args); absl::Status HandleLearnCommand(); diff --git a/src/cli/handlers/agent/common.h b/src/cli/handlers/agent/common.h index cf60f307..45e06b99 100644 --- a/src/cli/handlers/agent/common.h +++ b/src/cli/handlers/agent/common.h @@ -5,7 +5,7 @@ #include #include "absl/time/time.h" -#include "cli/service/gui_automation_client.h" +#include "cli/service/gui/gui_automation_client.h" namespace yaze { namespace cli { diff --git a/src/cli/handlers/agent/general_commands.cc b/src/cli/handlers/agent/general_commands.cc index c0b512e5..b34902c9 100644 --- a/src/cli/handlers/agent/general_commands.cc +++ b/src/cli/handlers/agent/general_commands.cc @@ -18,12 +18,13 @@ #include "absl/strings/str_replace.h" #include "cli/handlers/agent/common.h" #include "cli/modern_cli.h" -#include "cli/service/ai_service.h" -#include "cli/service/ollama_ai_service.h" -#include "cli/service/gemini_ai_service.h" -#include "cli/service/proposal_registry.h" -#include "cli/service/resource_catalog.h" -#include "cli/service/rom_sandbox_manager.h" +#include "cli/service/ai/ai_service.h" +#include "cli/service/ai/ollama_ai_service.h" +#include "cli/service/ai/gemini_ai_service.h" +#include "cli/service/planning/proposal_registry.h" +#include "cli/service/planning/tile16_proposal_generator.h" +#include "cli/service/resources/resource_catalog.h" +#include "cli/service/rom/rom_sandbox_manager.h" #include "cli/z3ed.h" #include "util/macro.h" @@ -174,109 +175,84 @@ absl::Status HandleRunCommand(const std::vector& arg_vec, if (rom_path.empty()) { return absl::FailedPreconditionError( "No ROM loaded. Use --rom= to specify ROM file.\n" - "Example: z3ed agent run --rom=zelda3.sfc --prompt \"Your prompt here\""); + "Example: z3ed agent run --rom=zelda3.sfc --prompt \"Your prompt " + "here\""); } auto status = rom.LoadFromFile(rom_path); if (!status.ok()) { - return absl::FailedPreconditionError( - absl::StrFormat("Failed to load ROM from '%s': %s", rom_path, - status.message())); + return absl::FailedPreconditionError(absl::StrFormat( + "Failed to load ROM from '%s': %s", rom_path, status.message())); } } - auto sandbox_or = RomSandboxManager::Instance().CreateSandbox(rom, - "agent-run"); + // 1. Create a sandbox ROM to apply changes to + auto sandbox_or = + RomSandboxManager::Instance().CreateSandbox(rom, "agent-run"); if (!sandbox_or.ok()) { return sandbox_or.status(); } auto sandbox = sandbox_or.value(); - auto proposal_or = ProposalRegistry::Instance().CreateProposal( - sandbox.id, prompt, "Agent-generated ROM modifications"); + // 2. Get commands from the AI service + auto ai_service = CreateAIService(); // Use service factory + auto commands_or = ai_service->GetCommands(prompt); + if (!commands_or.ok()) { + return commands_or.status(); + } + std::vector commands = commands_or.value(); + + // 3. Generate a structured proposal from the commands + Tile16ProposalGenerator generator; + auto proposal_or = generator.GenerateFromCommands( + prompt, commands, "ollama", &rom); // Pass original ROM to get old tiles if (!proposal_or.ok()) { return proposal_or.status(); } auto proposal = proposal_or.value(); - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, absl::StrCat("Starting agent run with prompt: ", prompt))); - - auto ai_service = CreateAIService(); // Use service factory - auto commands_or = ai_service->GetCommands(prompt); - if (!commands_or.ok()) { - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, - absl::StrCat("AI service error: ", commands_or.status().message()))); - return commands_or.status(); - } - std::vector commands = commands_or.value(); - - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, absl::StrCat("Generated ", commands.size(), - " commands"))); - - ModernCLI cli; - int commands_executed = 0; - for (const auto& command : commands) { - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, absl::StrCat("Executing: ", command))); - - std::vector command_parts; - std::string current_part; - bool in_quotes = false; - for (char c : command) { - if (c == '"') { - in_quotes = !in_quotes; - } else if (c == ' ' && !in_quotes) { - command_parts.push_back(current_part); - current_part.clear(); - } else { - current_part += c; - } - } - command_parts.push_back(current_part); - - if (command_parts.size() < 2) { - auto error_msg = absl::StrFormat("Malformed command: %s", command); - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog(proposal.id, - error_msg)); - return absl::InvalidArgumentError(error_msg); - } - - std::string cmd_name = command_parts[0] + " " + command_parts[1]; - std::vector cmd_args(command_parts.begin() + 2, - command_parts.end()); - - auto it = cli.commands_.find(cmd_name); - if (it != cli.commands_.end()) { - auto status = it->second.handler(cmd_args); - if (!status.ok()) { - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, absl::StrCat("Command failed: ", status.message()))); - return status; - } - commands_executed++; - RETURN_IF_ERROR( - ProposalRegistry::Instance().AppendLog(proposal.id, - "Command succeeded")); - } else { - auto error_msg = absl::StrCat("Unknown command: ", cmd_name); - RETURN_IF_ERROR( - ProposalRegistry::Instance().AppendLog(proposal.id, error_msg)); - return absl::NotFoundError(error_msg); - } + // 4. Apply the proposal to the sandbox ROM for preview + Rom sandbox_rom; + auto load_status = sandbox_rom.LoadFromFile(sandbox.rom_path.string()); + if (!load_status.ok()) { + return absl::InternalError(absl::StrCat( + "Failed to load sandbox ROM: ", load_status.message())); } - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, - absl::StrCat("Completed execution of ", commands_executed, - " commands"))); + auto apply_status = generator.ApplyProposal(proposal, &sandbox_rom); + if (!apply_status.ok()) { + return absl::InternalError( + absl::StrCat("Failed to apply proposal to sandbox ROM: ", + apply_status.message())); + } - std::cout << "✅ Agent run completed successfully." << std::endl; + // 5. Save the sandbox ROM to persist the changes for diffing + auto save_status = sandbox_rom.SaveToFile({.save_new = false}); + if (!save_status.ok()) { + return absl::InternalError( + absl::StrCat("Failed to save sandbox ROM: ", save_status.message())); + } + + // 6. Save the proposal metadata for later use (accept/reject) + // For now, we'll just use the proposal generator's save function. + // A better approach would be to integrate with ProposalRegistry. + auto proposal_path = + RomSandboxManager::Instance().RootDirectory() / (proposal.id + ".json"); + auto save_proposal_status = generator.SaveProposal(proposal, proposal_path.string()); + if (!save_proposal_status.ok()) { + return absl::InternalError(absl::StrCat("Failed to save proposal file: ", + save_proposal_status.message())); + } + + std::cout << "✅ Agent successfully planned and executed changes in a sandbox." + << std::endl; std::cout << " Proposal ID: " << proposal.id << std::endl; - std::cout << " Sandbox: " << sandbox.rom_path << std::endl; - std::cout << " Use 'z3ed agent diff' to review changes" << std::endl; + std::cout << " Sandbox ROM: " << sandbox.rom_path << std::endl; + std::cout << " Proposal file: " << proposal_path << std::endl; + std::cout << "\nTo review the changes, run:\n"; + std::cout << " z3ed agent diff --proposal-id " << proposal.id << std::endl; + std::cout << "\nTo accept the changes, run:\n"; + std::cout << " z3ed agent accept --proposal-id " << proposal.id << std::endl; return absl::OkStatus(); } @@ -294,10 +270,20 @@ absl::Status HandlePlanCommand(const std::vector& arg_vec) { } std::vector commands = commands_or.value(); - std::cout << "AI Agent Plan:" << std::endl; - for (const auto& command : commands) { - std::cout << " - " << command << std::endl; + // Create a proposal from the commands + Tile16ProposalGenerator generator; + auto proposal_or = + generator.GenerateFromCommands(prompt, commands, "ollama", nullptr); + if (!proposal_or.ok()) { + return proposal_or.status(); } + auto proposal = proposal_or.value(); + + // TODO: Save the proposal to disk using ProposalRegistry + // For now, just print it. + std::cout << "AI Agent Plan (Proposal ID: " << proposal.id << "):\n"; + std::cout << proposal.ToJson() << std::endl; + return absl::OkStatus(); } @@ -542,6 +528,56 @@ absl::Status HandleDescribeCommand(const std::vector& arg_vec) { return absl::OkStatus(); } +absl::Status HandleAcceptCommand(const std::vector& arg_vec, + Rom& rom) { + if (arg_vec.empty() || arg_vec[0] != "--proposal-id") { + return absl::InvalidArgumentError( + "Usage: agent accept --proposal-id "); + } + std::string proposal_id = arg_vec[1]; + + // 1. Load the proposal from disk. + Tile16ProposalGenerator generator; + auto proposal_path = + RomSandboxManager::Instance().RootDirectory() / (proposal_id + ".json"); + auto proposal_or = generator.LoadProposal(proposal_path.string()); + if (!proposal_or.ok()) { + return absl::InternalError(absl::StrCat("Failed to load proposal file '", + proposal_path.string(), + "': ", proposal_or.status().message())); + } + auto proposal = proposal_or.value(); + + // 2. Ensure the main ROM is loaded. + if (!rom.is_loaded()) { + return absl::FailedPreconditionError( + "No ROM loaded. Use --rom= to specify the ROM to apply changes to."); + } + + // 3. Apply the proposal to the main ROM. + auto apply_status = generator.ApplyProposal(proposal, &rom); + if (!apply_status.ok()) { + return absl::InternalError( + absl::StrCat("Failed to apply proposal to main ROM: ", + apply_status.message())); + } + + // 4. Save the changes to the main ROM file. + auto save_status = rom.SaveToFile({.save_new = false}); + if (!save_status.ok()) { + return absl::InternalError( + absl::StrCat("Failed to save changes to main ROM: ", + save_status.message())); + } + + std::cout << "✅ Proposal '" << proposal_id << "' accepted and applied to '" + << rom.filename() << "'." << std::endl; + + // TODO: Clean up sandbox and proposal files. + + return absl::OkStatus(); +} + } // namespace agent } // namespace cli } // namespace yaze diff --git a/src/cli/handlers/agent/gui_commands.cc b/src/cli/handlers/agent/gui_commands.cc index a6a04839..6c022e33 100644 --- a/src/cli/handlers/agent/gui_commands.cc +++ b/src/cli/handlers/agent/gui_commands.cc @@ -13,7 +13,7 @@ #include "absl/strings/str_format.h" #include "absl/time/time.h" #include "cli/handlers/agent/common.h" -#include "cli/service/gui_automation_client.h" +#include "cli/service/gui/gui_automation_client.h" #include "util/macro.h" namespace yaze { diff --git a/src/cli/handlers/agent/test_commands.cc b/src/cli/handlers/agent/test_commands.cc index 8ee00cf8..20394fc8 100644 --- a/src/cli/handlers/agent/test_commands.cc +++ b/src/cli/handlers/agent/test_commands.cc @@ -9,8 +9,8 @@ #include "cli/handlers/agent/common.h" #ifdef YAZE_WITH_GRPC -#include "cli/service/gui_automation_client.h" -#include "cli/service/test_workflow_generator.h" +#include "cli/service/gui/gui_automation_client.h" +#include "cli/service/testing/test_workflow_generator.h" #endif namespace yaze { diff --git a/src/cli/service/ai_service.cc b/src/cli/service/ai/ai_service.cc similarity index 96% rename from src/cli/service/ai_service.cc rename to src/cli/service/ai/ai_service.cc index e0750f23..45d2b413 100644 --- a/src/cli/service/ai_service.cc +++ b/src/cli/service/ai/ai_service.cc @@ -1,4 +1,4 @@ -#include "cli/service/ai_service.h" +#include "cli/service/ai/ai_service.h" namespace yaze { namespace cli { diff --git a/src/cli/service/ai_service.h b/src/cli/service/ai/ai_service.h similarity index 100% rename from src/cli/service/ai_service.h rename to src/cli/service/ai/ai_service.h diff --git a/src/cli/service/gemini_ai_service.cc b/src/cli/service/ai/gemini_ai_service.cc similarity index 99% rename from src/cli/service/gemini_ai_service.cc rename to src/cli/service/ai/gemini_ai_service.cc index cb41bcaa..42396bbb 100644 --- a/src/cli/service/gemini_ai_service.cc +++ b/src/cli/service/ai/gemini_ai_service.cc @@ -1,4 +1,4 @@ -#include "cli/service/gemini_ai_service.h" +#include "cli/service/ai/gemini_ai_service.h" #include #include diff --git a/src/cli/service/gemini_ai_service.h b/src/cli/service/ai/gemini_ai_service.h similarity index 93% rename from src/cli/service/gemini_ai_service.h rename to src/cli/service/ai/gemini_ai_service.h index c40e9ded..05cfcbdf 100644 --- a/src/cli/service/gemini_ai_service.h +++ b/src/cli/service/ai/gemini_ai_service.h @@ -6,8 +6,8 @@ #include "absl/status/status.h" #include "absl/status/statusor.h" -#include "cli/service/ai_service.h" -#include "cli/service/prompt_builder.h" +#include "cli/service/ai/ai_service.h" +#include "cli/service/ai/prompt_builder.h" namespace yaze { namespace cli { diff --git a/src/cli/service/ollama_ai_service.cc b/src/cli/service/ai/ollama_ai_service.cc similarity index 99% rename from src/cli/service/ollama_ai_service.cc rename to src/cli/service/ai/ollama_ai_service.cc index 28db2e49..91ae66f3 100644 --- a/src/cli/service/ollama_ai_service.cc +++ b/src/cli/service/ai/ollama_ai_service.cc @@ -1,4 +1,4 @@ -#include "cli/service/ollama_ai_service.h" +#include "cli/service/ai/ollama_ai_service.h" #include diff --git a/src/cli/service/ollama_ai_service.h b/src/cli/service/ai/ollama_ai_service.h similarity index 95% rename from src/cli/service/ollama_ai_service.h rename to src/cli/service/ai/ollama_ai_service.h index 2ed3a280..37e33ca8 100644 --- a/src/cli/service/ollama_ai_service.h +++ b/src/cli/service/ai/ollama_ai_service.h @@ -6,8 +6,8 @@ #include "absl/status/status.h" #include "absl/status/statusor.h" -#include "cli/service/ai_service.h" -#include "cli/service/prompt_builder.h" +#include "cli/service/ai/ai_service.h" +#include "cli/service/ai/prompt_builder.h" namespace yaze { namespace cli { diff --git a/src/cli/service/prompt_builder.cc b/src/cli/service/ai/prompt_builder.cc similarity index 96% rename from src/cli/service/prompt_builder.cc rename to src/cli/service/ai/prompt_builder.cc index dceb701c..84023b8d 100644 --- a/src/cli/service/prompt_builder.cc +++ b/src/cli/service/ai/prompt_builder.cc @@ -1,4 +1,4 @@ -#include "cli/service/prompt_builder.h" +#include "cli/service/ai/prompt_builder.h" #include #include @@ -248,9 +248,20 @@ std::string PromptBuilder::BuildConstraintsSection() { std::string PromptBuilder::BuildContextSection(const RomContext& context) { std::ostringstream oss; - + oss << "# Current ROM Context\n\n"; - + + // Use ResourceContextBuilder if a ROM is available + if (rom_ && rom_->is_loaded()) { + if (!resource_context_builder_) { + resource_context_builder_ = std::make_unique(rom_); + } + auto resource_context_or = resource_context_builder_->BuildResourceContext(); + if (resource_context_or.ok()) { + oss << resource_context_or.value(); + } + } + if (context.rom_loaded) { oss << "- **ROM Loaded:** Yes (" << context.rom_path << ")\n"; } else { diff --git a/src/cli/service/prompt_builder.h b/src/cli/service/ai/prompt_builder.h similarity index 90% rename from src/cli/service/prompt_builder.h rename to src/cli/service/ai/prompt_builder.h index 6054d437..e4b3eb03 100644 --- a/src/cli/service/prompt_builder.h +++ b/src/cli/service/ai/prompt_builder.h @@ -6,6 +6,8 @@ #include #include "absl/status/statusor.h" +#include "cli/service/resources/resource_context_builder.h" +#include "app/rom.h" namespace yaze { namespace cli { @@ -30,6 +32,8 @@ class PromptBuilder { public: PromptBuilder(); + void SetRom(Rom* rom) { rom_ = rom; } + // Load z3ed command documentation from resources absl::Status LoadResourceCatalogue(const std::string& yaml_path); @@ -62,6 +66,8 @@ class PromptBuilder { void LoadDefaultExamples(); + Rom* rom_ = nullptr; + std::unique_ptr resource_context_builder_; std::map command_docs_; // Command name -> docs std::vector examples_; int verbosity_ = 1; diff --git a/src/cli/service/gui_automation_client.cc b/src/cli/service/gui/gui_automation_client.cc similarity index 99% rename from src/cli/service/gui_automation_client.cc rename to src/cli/service/gui/gui_automation_client.cc index 5a7c3226..d2cc8e6b 100644 --- a/src/cli/service/gui_automation_client.cc +++ b/src/cli/service/gui/gui_automation_client.cc @@ -1,7 +1,7 @@ // gui_automation_client.cc // Implementation of gRPC client for YAZE GUI automation -#include "cli/service/gui_automation_client.h" +#include "cli/service/gui/gui_automation_client.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" diff --git a/src/cli/service/gui_automation_client.h b/src/cli/service/gui/gui_automation_client.h similarity index 100% rename from src/cli/service/gui_automation_client.h rename to src/cli/service/gui/gui_automation_client.h diff --git a/src/cli/service/policy_evaluator.cc b/src/cli/service/planning/policy_evaluator.cc similarity index 99% rename from src/cli/service/policy_evaluator.cc rename to src/cli/service/planning/policy_evaluator.cc index 4a554857..d26fd842 100644 --- a/src/cli/service/policy_evaluator.cc +++ b/src/cli/service/planning/policy_evaluator.cc @@ -1,4 +1,4 @@ -#include "cli/service/policy_evaluator.h" +#include "cli/service/planning/policy_evaluator.h" #include #include @@ -6,7 +6,7 @@ #include "absl/strings/numbers.h" #include "absl/strings/str_format.h" #include "absl/strings/str_split.h" -#include "cli/service/proposal_registry.h" +#include "cli/service/planning/proposal_registry.h" namespace yaze { namespace cli { diff --git a/src/cli/service/policy_evaluator.h b/src/cli/service/planning/policy_evaluator.h similarity index 100% rename from src/cli/service/policy_evaluator.h rename to src/cli/service/planning/policy_evaluator.h diff --git a/src/cli/service/proposal_registry.cc b/src/cli/service/planning/proposal_registry.cc similarity index 99% rename from src/cli/service/proposal_registry.cc rename to src/cli/service/planning/proposal_registry.cc index ae6cd01a..26df5476 100644 --- a/src/cli/service/proposal_registry.cc +++ b/src/cli/service/planning/proposal_registry.cc @@ -1,4 +1,4 @@ -#include "cli/service/proposal_registry.h" +#include "cli/service/planning/proposal_registry.h" #include #include diff --git a/src/cli/service/proposal_registry.h b/src/cli/service/planning/proposal_registry.h similarity index 100% rename from src/cli/service/proposal_registry.h rename to src/cli/service/planning/proposal_registry.h diff --git a/src/cli/service/tile16_proposal_generator.cc b/src/cli/service/planning/tile16_proposal_generator.cc similarity index 99% rename from src/cli/service/tile16_proposal_generator.cc rename to src/cli/service/planning/tile16_proposal_generator.cc index 3d9ee8ab..fa46539f 100644 --- a/src/cli/service/tile16_proposal_generator.cc +++ b/src/cli/service/planning/tile16_proposal_generator.cc @@ -1,4 +1,4 @@ -#include "cli/service/tile16_proposal_generator.h" +#include "cli/service/planning/tile16_proposal_generator.h" #include #include diff --git a/src/cli/service/tile16_proposal_generator.h b/src/cli/service/planning/tile16_proposal_generator.h similarity index 100% rename from src/cli/service/tile16_proposal_generator.h rename to src/cli/service/planning/tile16_proposal_generator.h diff --git a/src/cli/service/resource_catalog.cc b/src/cli/service/resources/resource_catalog.cc similarity index 99% rename from src/cli/service/resource_catalog.cc rename to src/cli/service/resources/resource_catalog.cc index a8076c36..9567affb 100644 --- a/src/cli/service/resource_catalog.cc +++ b/src/cli/service/resources/resource_catalog.cc @@ -1,4 +1,4 @@ -#include "cli/service/resource_catalog.h" +#include "cli/service/resources/resource_catalog.h" #include diff --git a/src/cli/service/resource_catalog.h b/src/cli/service/resources/resource_catalog.h similarity index 100% rename from src/cli/service/resource_catalog.h rename to src/cli/service/resources/resource_catalog.h diff --git a/src/cli/service/resource_context_builder.cc b/src/cli/service/resources/resource_context_builder.cc similarity index 99% rename from src/cli/service/resource_context_builder.cc rename to src/cli/service/resources/resource_context_builder.cc index 866b38b6..7072f348 100644 --- a/src/cli/service/resource_context_builder.cc +++ b/src/cli/service/resources/resource_context_builder.cc @@ -1,4 +1,4 @@ -#include "cli/service/resource_context_builder.h" +#include "cli/service/resources/resource_context_builder.h" #include diff --git a/src/cli/service/resource_context_builder.h b/src/cli/service/resources/resource_context_builder.h similarity index 100% rename from src/cli/service/resource_context_builder.h rename to src/cli/service/resources/resource_context_builder.h diff --git a/src/cli/service/rom_sandbox_manager.cc b/src/cli/service/rom/rom_sandbox_manager.cc similarity index 99% rename from src/cli/service/rom_sandbox_manager.cc rename to src/cli/service/rom/rom_sandbox_manager.cc index c82d2961..b1169552 100644 --- a/src/cli/service/rom_sandbox_manager.cc +++ b/src/cli/service/rom/rom_sandbox_manager.cc @@ -1,4 +1,4 @@ -#include "cli/service/rom_sandbox_manager.h" +#include "cli/service/rom/rom_sandbox_manager.h" #include #include diff --git a/src/cli/service/rom_sandbox_manager.h b/src/cli/service/rom/rom_sandbox_manager.h similarity index 100% rename from src/cli/service/rom_sandbox_manager.h rename to src/cli/service/rom/rom_sandbox_manager.h diff --git a/src/cli/service/test_suite.h b/src/cli/service/testing/test_suite.h similarity index 97% rename from src/cli/service/test_suite.h rename to src/cli/service/testing/test_suite.h index 6d71efdb..b093b0ac 100644 --- a/src/cli/service/test_suite.h +++ b/src/cli/service/testing/test_suite.h @@ -7,7 +7,7 @@ #include "absl/strings/string_view.h" #include "absl/time/time.h" -#include "cli/service/gui_automation_client.h" +#include "cli/service/gui/gui_automation_client.h" namespace yaze { namespace cli { diff --git a/src/cli/service/test_suite_loader.cc b/src/cli/service/testing/test_suite_loader.cc similarity index 99% rename from src/cli/service/test_suite_loader.cc rename to src/cli/service/testing/test_suite_loader.cc index 92e7f01d..caccc619 100644 --- a/src/cli/service/test_suite_loader.cc +++ b/src/cli/service/testing/test_suite_loader.cc @@ -1,4 +1,4 @@ -#include "cli/service/test_suite_loader.h" +#include "cli/service/testing/test_suite_loader.h" #include #include diff --git a/src/cli/service/test_suite_loader.h b/src/cli/service/testing/test_suite_loader.h similarity index 91% rename from src/cli/service/test_suite_loader.h rename to src/cli/service/testing/test_suite_loader.h index ca64d974..7e47ff67 100644 --- a/src/cli/service/test_suite_loader.h +++ b/src/cli/service/testing/test_suite_loader.h @@ -5,7 +5,7 @@ #include "absl/status/statusor.h" #include "absl/strings/string_view.h" -#include "cli/service/test_suite.h" +#include "cli/service/testing/test_suite.h" namespace yaze { namespace cli { diff --git a/src/cli/service/test_suite_reporter.cc b/src/cli/service/testing/test_suite_reporter.cc similarity index 99% rename from src/cli/service/test_suite_reporter.cc rename to src/cli/service/testing/test_suite_reporter.cc index c99e3ad2..85d4b0a1 100644 --- a/src/cli/service/test_suite_reporter.cc +++ b/src/cli/service/testing/test_suite_reporter.cc @@ -1,4 +1,4 @@ -#include "cli/service/test_suite_reporter.h" +#include "cli/service/testing/test_suite_reporter.h" #include #include diff --git a/src/cli/service/test_suite_reporter.h b/src/cli/service/testing/test_suite_reporter.h similarity index 92% rename from src/cli/service/test_suite_reporter.h rename to src/cli/service/testing/test_suite_reporter.h index 3dfe52d9..f5d88b47 100644 --- a/src/cli/service/test_suite_reporter.h +++ b/src/cli/service/testing/test_suite_reporter.h @@ -4,7 +4,7 @@ #include #include "absl/status/statusor.h" -#include "cli/service/test_suite.h" +#include "cli/service/testing/test_suite.h" namespace yaze { namespace cli { diff --git a/src/cli/service/test_suite_writer.cc b/src/cli/service/testing/test_suite_writer.cc similarity index 99% rename from src/cli/service/test_suite_writer.cc rename to src/cli/service/testing/test_suite_writer.cc index 402ebb23..105b4ade 100644 --- a/src/cli/service/test_suite_writer.cc +++ b/src/cli/service/testing/test_suite_writer.cc @@ -1,4 +1,4 @@ -#include "cli/service/test_suite_writer.h" +#include "cli/service/testing/test_suite_writer.h" #include #include diff --git a/src/cli/service/test_suite_writer.h b/src/cli/service/testing/test_suite_writer.h similarity index 94% rename from src/cli/service/test_suite_writer.h rename to src/cli/service/testing/test_suite_writer.h index a892da59..7466a148 100644 --- a/src/cli/service/test_suite_writer.h +++ b/src/cli/service/testing/test_suite_writer.h @@ -4,7 +4,7 @@ #include #include "absl/status/status.h" -#include "cli/service/test_suite.h" +#include "cli/service/testing/test_suite.h" namespace yaze { namespace cli { diff --git a/src/cli/service/test_workflow_generator.cc b/src/cli/service/testing/test_workflow_generator.cc similarity index 99% rename from src/cli/service/test_workflow_generator.cc rename to src/cli/service/testing/test_workflow_generator.cc index 62ce0f6c..59632adf 100644 --- a/src/cli/service/test_workflow_generator.cc +++ b/src/cli/service/testing/test_workflow_generator.cc @@ -1,7 +1,7 @@ // test_workflow_generator.cc // Implementation of natural language to test workflow conversion -#include "cli/service/test_workflow_generator.h" +#include "cli/service/testing/test_workflow_generator.h" #include "absl/strings/ascii.h" #include "absl/strings/match.h" diff --git a/src/cli/service/test_workflow_generator.h b/src/cli/service/testing/test_workflow_generator.h similarity index 100% rename from src/cli/service/test_workflow_generator.h rename to src/cli/service/testing/test_workflow_generator.h diff --git a/src/cli/z3ed.cmake b/src/cli/z3ed.cmake index 7218d5ed..eadf5da1 100644 --- a/src/cli/z3ed.cmake +++ b/src/cli/z3ed.cmake @@ -47,25 +47,25 @@ add_executable( cli/handlers/agent/test_common.cc cli/handlers/agent/test_commands.cc cli/handlers/agent/gui_commands.cc - cli/service/ai_service.cc - cli/service/ollama_ai_service.cc - cli/service/prompt_builder.cc - cli/service/proposal_registry.cc - cli/service/resource_catalog.cc - cli/service/rom_sandbox_manager.cc - cli/service/policy_evaluator.cc - cli/service/test_suite.h - cli/service/test_suite_loader.cc - cli/service/test_suite_loader.h - cli/service/test_suite_reporter.cc - cli/service/test_suite_reporter.h - cli/service/test_suite_writer.cc - cli/service/test_suite_writer.h - cli/service/gemini_ai_service.cc - cli/service/tile16_proposal_generator.h - cli/service/tile16_proposal_generator.cc - cli/service/resource_context_builder.h - cli/service/resource_context_builder.cc + cli/service/ai/ai_service.cc + cli/service/ai/ollama_ai_service.cc + cli/service/ai/prompt_builder.cc + cli/service/planning/proposal_registry.cc + cli/service/resources/resource_catalog.cc + cli/service/rom/rom_sandbox_manager.cc + cli/service/planning/policy_evaluator.cc + cli/service/testing/test_suite.h + cli/service/testing/test_suite_loader.cc + cli/service/testing/test_suite_loader.h + cli/service/testing/test_suite_reporter.cc + cli/service/testing/test_suite_reporter.h + cli/service/testing/test_suite_writer.cc + cli/service/testing/test_suite_writer.h + cli/service/ai/gemini_ai_service.cc + cli/service/planning/tile16_proposal_generator.h + cli/service/planning/tile16_proposal_generator.cc + cli/service/resources/resource_context_builder.h + cli/service/resources/resource_context_builder.cc app/rom.cc app/core/project.cc app/core/asar_wrapper.cc @@ -83,8 +83,8 @@ if(YAZE_WITH_JSON) add_subdirectory(${CMAKE_SOURCE_DIR}/third_party/json ${CMAKE_BINARY_DIR}/third_party/json) target_compile_definitions(z3ed PRIVATE YAZE_WITH_JSON) target_link_libraries(z3ed PRIVATE nlohmann_json::nlohmann_json) - list(APPEND Z3ED_SRC_FILES cli/service/gemini_ai_service.cc) - list(APPEND Z3ED_SRC_FILES cli/service/prompt_builder.cc) + list(APPEND Z3ED_SRC_FILES cli/service/ai/gemini_ai_service.cc) + list(APPEND Z3ED_SRC_FILES cli/service/ai/prompt_builder.cc) endif() # ============================================================================ @@ -162,10 +162,10 @@ if(YAZE_WITH_GRPC) # Add CLI gRPC service sources target_sources(z3ed PRIVATE - ${CMAKE_SOURCE_DIR}/src/cli/service/gui_automation_client.cc - ${CMAKE_SOURCE_DIR}/src/cli/service/gui_automation_client.h - ${CMAKE_SOURCE_DIR}/src/cli/service/test_workflow_generator.cc - ${CMAKE_SOURCE_DIR}/src/cli/service/test_workflow_generator.h) + ${CMAKE_SOURCE_DIR}/src/cli/service/gui/gui_automation_client.cc + ${CMAKE_SOURCE_DIR}/src/cli/service/gui/gui_automation_client.h + ${CMAKE_SOURCE_DIR}/src/cli/service/testing/test_workflow_generator.cc + ${CMAKE_SOURCE_DIR}/src/cli/service/testing/test_workflow_generator.h) # Link gRPC libraries target_link_libraries(z3ed PRIVATE diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 46d3a161..cfe46cf5 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -44,7 +44,7 @@ if(YAZE_BUILD_TESTS AND NOT YAZE_BUILD_TESTS STREQUAL "OFF") unit/zelda3/dungeon_component_unit_test.cc # CLI Services (for catalog serialization tests) - ../src/cli/service/resource_catalog.cc + ../src/cli/service/resources/resource_catalog.cc # Integration Tests integration/asar_integration_test.cc @@ -98,7 +98,7 @@ if(YAZE_BUILD_TESTS AND NOT YAZE_BUILD_TESTS STREQUAL "OFF") unit/zelda3/dungeon_component_unit_test.cc # CLI Services (for catalog serialization tests) - ../src/cli/service/resource_catalog.cc + ../src/cli/service/resources/resource_catalog.cc # Integration Tests integration/asar_integration_test.cc diff --git a/test/unit/cli/resource_catalog_test.cc b/test/unit/cli/resource_catalog_test.cc index 6a1f8c1b..9861f563 100644 --- a/test/unit/cli/resource_catalog_test.cc +++ b/test/unit/cli/resource_catalog_test.cc @@ -1,4 +1,4 @@ -#include "cli/service/resource_catalog.h" +#include "cli/service/resources/resource_catalog.h" #include #include