26 return absl::OkStatus();
29 std::vector<std::string> args;
30 for (
int i = 1; i < argc; ++i) {
31 args.push_back(argv[i]);
35 if (args[0] ==
"--tui") {
39 if (!rom_status.ok()) {
46 return absl::OkStatus();
49 if (args[0] ==
"help") {
50 if (args.size() > 1) {
55 return absl::OkStatus();
59 if (args[0] ==
"agent") {
60 std::vector<std::string> agent_args(args.begin() + 1, args.end());
67 std::string command_name = args[0];
68 std::vector<std::string> command_args(args.begin() + 1, args.end());
70 if (registry.HasCommand(command_name)) {
71 return registry.Execute(command_name, command_args,
nullptr);
74 return absl::NotFoundError(absl::StrCat(
"Unknown command: ", command_name));
78 using namespace ftxui;
80 auto categories = registry.GetCategories();
82 auto banner = text(
"🎮 Z3ED - AI-Powered ROM Editor CLI") | bold | center;
84 std::vector<std::vector<std::string>> rows;
85 rows.push_back({
"Category",
"Commands",
"Description"});
88 rows.push_back({
"agent",
"chat, learn, todo, emulator-*",
"AI conversational agent + debugging tools"});
91 for (
const auto& category : categories) {
92 auto commands = registry.GetCommandsInCategory(category);
93 std::string cmd_list = commands.size() > 3
94 ? absl::StrCat(commands.size(),
" commands")
95 : absl::StrJoin(commands,
", ");
98 if (category ==
"resource") desc =
"ROM resource inspection";
99 else if (category ==
"dungeon") desc =
"Dungeon editing";
100 else if (category ==
"overworld") desc =
"Overworld editing";
101 else if (category ==
"emulator") desc =
"Emulator debugging";
102 else if (category ==
"graphics") desc =
"Graphics/palette/sprites";
103 else if (category ==
"game") desc =
"Messages/dialogue/music";
104 else desc = category +
" commands";
106 rows.push_back({category, cmd_list, desc});
110 summary.SelectAll().Border(LIGHT);
111 summary.SelectRow(0).Decorate(bold);
119 text(absl::StrFormat(
"Total: %zu commands across %zu categories",
120 registry.Count(), categories.size() + 1)) | center | dim,
121 text(
"Try `z3ed agent simple-chat` for AI-powered ROM inspection") | center,
122 text(
"Use `z3ed --list-commands` for complete list") | dim | center
125 auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(layout));
126 Render(screen, layout);
131 using namespace ftxui;
134 std::vector<std::vector<std::string>> rows;
135 rows.push_back({
"Command",
"Description",
"Requirements"});
137 auto commands = registry.GetCommandsInCategory(category);
138 for (
const auto& cmd_name : commands) {
139 auto* metadata = registry.GetMetadata(cmd_name);
141 std::string requirements;
142 if (metadata->requires_rom) requirements +=
"ROM ";
143 if (metadata->requires_grpc) requirements +=
"gRPC ";
144 if (requirements.empty()) requirements =
"—";
146 rows.push_back({cmd_name, metadata->description, requirements});
150 if (rows.size() == 1) {
151 rows.push_back({
"—",
"No commands in this category",
"—"});
155 detail.SelectAll().Border(LIGHT);
156 detail.SelectRow(0).Decorate(bold);
159 text(absl::StrCat(
"Category: ", category)) | bold | center,
163 text(
"Commands are auto-registered from CommandRegistry") | dim | center
166 auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(layout));
167 Render(screen, layout);
172 using namespace ftxui;
175 std::vector<std::vector<std::string>> rows;
176 rows.push_back({
"Command",
"Category",
"Description"});
178 auto categories = registry.GetCategories();
179 for (
const auto& category : categories) {
180 auto commands = registry.GetCommandsInCategory(category);
181 for (
const auto& cmd_name : commands) {
182 auto* metadata = registry.GetMetadata(cmd_name);
184 rows.push_back({cmd_name, metadata->category, metadata->description});
189 if (rows.size() == 1) {
190 rows.push_back({
"—",
"—",
"No commands registered"});
193 Table command_table(rows);
194 command_table.SelectAll().Border(LIGHT);
195 command_table.SelectRow(0).Decorate(bold);
198 text(
"Z3ED Command Summary") | bold | center,
200 command_table.Render(),
202 text(absl::StrFormat(
"Total: %zu commands across %zu categories",
203 registry.Count(), categories.size())) | center | dim,
204 text(
"Use `z3ed --tui` for interactive command palette.") | center | dim
207 auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(layout));
208 Render(screen, layout);