yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
project_tool.h
Go to the documentation of this file.
1
12#ifndef YAZE_SRC_CLI_SERVICE_AGENT_TOOLS_PROJECT_TOOL_H_
13#define YAZE_SRC_CLI_SERVICE_AGENT_TOOLS_PROJECT_TOOL_H_
14
15#include <array>
16#include <chrono>
17#include <cstdint>
18#include <map>
19#include <string>
20#include <vector>
21
22#include "absl/status/status.h"
23#include "absl/status/statusor.h"
26
27namespace yaze {
28namespace cli {
29namespace agent {
30namespace tools {
31
43 uint32_t magic = 0x59415A45; // "YAZE" in hex
44 uint32_t version = 1;
45 uint32_t edit_count;
46 std::array<uint8_t, 32> base_rom_sha256;
47
48 static constexpr uint32_t kMagic = 0x59415A45;
49 static constexpr uint32_t kCurrentVersion = 1;
50};
51
56 uint32_t address;
57 uint32_t length;
58 // Followed by: old_value[length], new_value[length]
59};
60
68 std::string name;
69 std::string description;
70 std::chrono::system_clock::time_point created;
71 std::vector<RomEdit> edits; // From AgentContext
72 std::map<std::string, std::string> metadata;
73 std::array<uint8_t, 32> rom_checksum; // SHA-256 of base ROM
74
75 // Serialization
76 absl::Status SaveToFile(const std::string& filepath) const;
77 static absl::StatusOr<ProjectSnapshot> LoadFromFile(
78 const std::string& filepath);
79};
80
91 public:
92 ProjectManager() = default;
93
98 absl::Status Initialize(const std::string& base_path);
99
107 absl::Status CreateSnapshot(const std::string& name,
108 const std::string& description,
109 const std::vector<RomEdit>& edits,
110 const std::array<uint8_t, 32>& rom_checksum);
111
117 absl::Status RestoreSnapshot(const std::string& name, Rom* rom);
118
122 std::vector<std::string> ListSnapshots() const;
123
128 absl::StatusOr<ProjectSnapshot> GetSnapshot(const std::string& name) const;
129
134 absl::Status DeleteSnapshot(const std::string& name);
135
141 absl::Status ExportProject(const std::string& export_path,
142 bool include_rom = false);
143
148 absl::Status ImportProject(const std::string& archive_path);
149
155 absl::StatusOr<std::string> DiffSnapshots(const std::string& snapshot1,
156 const std::string& snapshot2) const;
157
161 const std::string& GetProjectPath() const { return project_path_; }
162
166 bool IsInitialized() const { return !project_path_.empty(); }
167
168 private:
169 std::string project_path_;
170 std::string snapshots_path_;
171 std::map<std::string, ProjectSnapshot> snapshots_;
172
173 absl::Status LoadSnapshots();
174 absl::Status SaveProjectMetadata();
175 std::string GetSnapshotFilePath(const std::string& name) const;
176};
177
182 public:
188 static std::array<uint8_t, 32> ComputeRomChecksum(const Rom* rom);
189
196 static std::array<uint8_t, 32> ComputeSHA256(const uint8_t* data,
197 size_t length);
198
204 static std::string FormatChecksum(const std::array<uint8_t, 32>& checksum);
205
211 static std::string FormatTimestamp(
212 const std::chrono::system_clock::time_point& time);
213
219 static absl::StatusOr<std::chrono::system_clock::time_point> ParseTimestamp(
220 const std::string& timestamp);
221};
222
227 protected:
231 absl::StatusOr<ProjectManager*> GetProjectManager(
232 AgentContext* context) const;
233
237 std::string FormatEdits(const std::vector<RomEdit>& edits) const;
238
242 std::string FormatSnapshot(const ProjectSnapshot& snapshot) const;
243};
244
257 public:
258 std::string GetName() const override { return "project-status"; }
259
260 std::string GetDescription() const {
261 return "Show current project state and pending edits";
262 }
263
264 std::string GetUsage() const override {
265 return "project-status [--format <json|text>]";
266 }
267
268 bool RequiresLabels() const override { return false; }
269
270 protected:
271 absl::Status ValidateArgs(
272 const resources::ArgumentParser& /*parser*/) override {
273 return absl::OkStatus();
274 }
275
276 absl::Status Execute(Rom* rom, const resources::ArgumentParser& parser,
277 resources::OutputFormatter& formatter) override;
278};
279
289 public:
290 std::string GetName() const override { return "project-snapshot"; }
291
292 std::string GetDescription() const {
293 return "Create named checkpoint with edit deltas";
294 }
295
296 std::string GetUsage() const override {
297 return "project-snapshot --name <name> [--description <desc>] [--format <json|text>]";
298 }
299
300 bool RequiresLabels() const override { return false; }
301
302 protected:
303 absl::Status ValidateArgs(const resources::ArgumentParser& parser) override {
304 return parser.RequireArgs({"name"});
305 }
306
307 absl::Status Execute(Rom* rom, const resources::ArgumentParser& parser,
308 resources::OutputFormatter& formatter) override;
309};
310
320 public:
321 std::string GetName() const override { return "project-restore"; }
322
323 std::string GetDescription() const {
324 return "Restore ROM to named checkpoint";
325 }
326
327 std::string GetUsage() const override {
328 return "project-restore --name <name> [--format <json|text>]";
329 }
330
331 bool RequiresLabels() const override { return false; }
332
333 protected:
334 absl::Status ValidateArgs(const resources::ArgumentParser& parser) override {
335 return parser.RequireArgs({"name"});
336 }
337
338 absl::Status Execute(Rom* rom, const resources::ArgumentParser& parser,
339 resources::OutputFormatter& formatter) override;
340};
341
351 public:
352 std::string GetName() const override { return "project-export"; }
353
354 std::string GetDescription() const {
355 return "Export project as portable archive";
356 }
357
358 std::string GetUsage() const override {
359 return "project-export --path <path> [--include-rom] [--format <json|text>]";
360 }
361
362 bool RequiresLabels() const override { return false; }
363
364 protected:
365 absl::Status ValidateArgs(const resources::ArgumentParser& parser) override {
366 return parser.RequireArgs({"path"});
367 }
368
369 absl::Status Execute(Rom* rom, const resources::ArgumentParser& parser,
370 resources::OutputFormatter& formatter) override;
371};
372
381 public:
382 std::string GetName() const override { return "project-import"; }
383
384 std::string GetDescription() const { return "Import project archive"; }
385
386 std::string GetUsage() const override {
387 return "project-import --path <path> [--format <json|text>]";
388 }
389
390 bool RequiresLabels() const override { return false; }
391
392 protected:
393 absl::Status ValidateArgs(const resources::ArgumentParser& parser) override {
394 return parser.RequireArgs({"path"});
395 }
396
397 absl::Status Execute(Rom* rom, const resources::ArgumentParser& parser,
398 resources::OutputFormatter& formatter) override;
399};
400
409 public:
410 std::string GetName() const override { return "project-diff"; }
411
412 std::string GetDescription() const { return "Compare two project states"; }
413
414 std::string GetUsage() const override {
415 return "project-diff --snapshot1 <name> --snapshot2 <name> [--format <json|text>]";
416 }
417
418 bool RequiresLabels() const override { return false; }
419
420 protected:
421 absl::Status ValidateArgs(const resources::ArgumentParser& parser) override {
422 return parser.RequireArgs({"snapshot1", "snapshot2"});
423 }
424
425 absl::Status Execute(Rom* rom, const resources::ArgumentParser& parser,
426 resources::OutputFormatter& formatter) override;
427};
428
429} // namespace tools
430} // namespace agent
431} // namespace cli
432} // namespace yaze
433
434#endif // YAZE_SRC_CLI_SERVICE_AGENT_TOOLS_PROJECT_TOOL_H_
Agent context for state preservation across tool calls.
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:24
Agent context for maintaining state across tool calls.
absl::Status ValidateArgs(const resources::ArgumentParser &parser) override
Validate command arguments.
std::string GetName() const override
Get the command name.
std::string GetUsage() const override
Get the command usage string.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
bool RequiresLabels() const override
Check if the command requires ROM labels.
Export project as portable archive.
absl::Status ValidateArgs(const resources::ArgumentParser &parser) override
Validate command arguments.
std::string GetName() const override
Get the command name.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
std::string GetUsage() const override
Get the command usage string.
bool RequiresLabels() const override
Check if the command requires ROM labels.
std::string GetName() const override
Get the command name.
bool RequiresLabels() const override
Check if the command requires ROM labels.
std::string GetUsage() const override
Get the command usage string.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
absl::Status ValidateArgs(const resources::ArgumentParser &parser) override
Validate command arguments.
Project manager for snapshot and version control.
std::map< std::string, ProjectSnapshot > snapshots_
std::string GetSnapshotFilePath(const std::string &name) const
absl::Status ExportProject(const std::string &export_path, bool include_rom=false)
Export project as portable archive.
std::vector< std::string > ListSnapshots() const
List all available snapshots.
absl::Status Initialize(const std::string &base_path)
Initialize project directory structure.
const std::string & GetProjectPath() const
Get project directory path.
absl::StatusOr< ProjectSnapshot > GetSnapshot(const std::string &name) const
Get snapshot details.
absl::StatusOr< std::string > DiffSnapshots(const std::string &snapshot1, const std::string &snapshot2) const
Compare two snapshots.
absl::Status CreateSnapshot(const std::string &name, const std::string &description, const std::vector< RomEdit > &edits, const std::array< uint8_t, 32 > &rom_checksum)
Create a named snapshot of current state.
absl::Status DeleteSnapshot(const std::string &name)
Delete a snapshot.
absl::Status RestoreSnapshot(const std::string &name, Rom *rom)
Restore ROM to a named snapshot.
absl::Status ImportProject(const std::string &archive_path)
Import project archive.
bool IsInitialized() const
Check if project is initialized.
Restore ROM to named checkpoint.
std::string GetUsage() const override
Get the command usage string.
std::string GetName() const override
Get the command name.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
bool RequiresLabels() const override
Check if the command requires ROM labels.
absl::Status ValidateArgs(const resources::ArgumentParser &parser) override
Validate command arguments.
Create named checkpoint with edit deltas.
std::string GetName() const override
Get the command name.
absl::Status ValidateArgs(const resources::ArgumentParser &parser) override
Validate command arguments.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
bool RequiresLabels() const override
Check if the command requires ROM labels.
std::string GetUsage() const override
Get the command usage string.
Show current project state and pending edits.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
std::string GetName() const override
Get the command name.
std::string GetUsage() const override
Get the command usage string.
absl::Status ValidateArgs(const resources::ArgumentParser &) override
Validate command arguments.
bool RequiresLabels() const override
Check if the command requires ROM labels.
Base class for project tools.
absl::StatusOr< ProjectManager * > GetProjectManager(AgentContext *context) const
Get or create project manager from context.
std::string FormatSnapshot(const ProjectSnapshot &snapshot) const
Format snapshot info as text.
std::string FormatEdits(const std::vector< RomEdit > &edits) const
Format edit list as text.
Utility functions for checksums and serialization.
static std::string FormatTimestamp(const std::chrono::system_clock::time_point &time)
Format timestamp for display.
static std::array< uint8_t, 32 > ComputeSHA256(const uint8_t *data, size_t length)
Compute SHA-256 checksum of arbitrary data.
static std::array< uint8_t, 32 > ComputeRomChecksum(const Rom *rom)
Compute SHA-256 checksum of ROM data.
static absl::StatusOr< std::chrono::system_clock::time_point > ParseTimestamp(const std::string &timestamp)
Parse timestamp from string.
static std::string FormatChecksum(const std::array< uint8_t, 32 > &checksum)
Format checksum as hex string.
Utility for parsing common CLI argument patterns.
absl::Status RequireArgs(const std::vector< std::string > &required) const
Validate that required arguments are present.
Base class for CLI command handlers.
Utility for consistent output formatting across commands.
Binary format for .edits file.
static constexpr uint32_t kMagic
static constexpr uint32_t kCurrentVersion
std::array< uint8_t, 32 > base_rom_sha256
Project snapshot with edit deltas.
absl::Status SaveToFile(const std::string &filepath) const
std::array< uint8_t, 32 > rom_checksum
std::map< std::string, std::string > metadata
std::chrono::system_clock::time_point created
static absl::StatusOr< ProjectSnapshot > LoadFromFile(const std::string &filepath)
Serialized edit record in binary format.