// Path: src/main/java/io/dashbase/clue/commands/ClueCommand.java
// public abstract class ClueCommand {
// 
//   protected ClueContext ctx;
//   private ArgumentParser parser;
// 
//   public ClueCommand(ClueContext ctx){
//     this(ctx, false);
//   }
// 
//   public ClueCommand(ClueContext ctx, boolean skipRegistration){
//     this.ctx = ctx;
//     if (!skipRegistration) {
//       this.ctx.registerCommand(this);
//     }
//   }
// 
//   public final Namespace parseArgs(String[] args) throws ArgumentParserException {
//      if (parser == null) {
//        this.parser = buildParser(ArgumentParsers.newFor(getName())
//                .build().defaultHelp(true).description(help()));
//        if (parser == null) {
//          return null;
//        }
//      }
//      return parser.parseArgs(args);
//   }
//   
//   public ClueContext getContext(){
//     return ctx;
//   }
// 
//   protected ArgumentParser buildParser(ArgumentParser parser) {
//     return null;
//   }
//   
//   public abstract String getName();
//   public abstract String help();
//   public abstract void execute(Namespace args, PrintStream out) throws Exception;
// }
// 
// Path: src/main/java/io/dashbase/clue/commands/CommandRegistrar.java
// @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = DefaultCommandRegistrar.class)
// @JsonSubTypes({
//         @JsonSubTypes.Type(name = "default", value = DefaultCommandRegistrar.class)
// })
// public interface CommandRegistrar {
//     void registerCommands(ClueContext ctx);
// }
// 
// Path: src/main/java/io/dashbase/clue/commands/CommandRegistry.java
// public class CommandRegistry {
//     private final SortedMap<String, ClueCommand> cmdMap = new TreeMap<String, ClueCommand>();
//     private volatile boolean readonly = true;
// 
//     public void registerCommand(ClueCommand cmd){
//         String cmdName = cmd.getName();
//         if (cmdMap.containsKey(cmdName)){
//             throw new IllegalArgumentException(cmdName+" exists!");
//         }
//         cmdMap.put(cmdName, cmd);
//     }
// 
//     public Set<String> commandNames() {
//         return cmdMap.keySet();
//     }
// 
//     public boolean exists(String command) {
//         return cmdMap.containsKey(command);
//     }
// 
//     public void setReadonly(boolean readonly) {
//         this.readonly = readonly;
//     }
// 
//     public boolean isReadonly() {
//         return this.readonly;
//     }
// 
//     public Collection<ClueCommand> getAvailableCommands() {
//         if (readonly) {
//             return cmdMap.values().stream().filter(c -> c.getClass().isAnnotationPresent(Readonly.class)).collect(Collectors.toList());
//         } else {
//             return cmdMap.values();
//         }
//     }
// 
//     public Optional<ClueCommand> getCommand(String cmd){
// 
//         ClueCommand command = cmdMap.get(cmd);
//         if (command != null) {
//             if (readonly) {
//                 if (!command.getClass().isAnnotationPresent(Readonly.class)) {
//                     command = new FilterCommand(command) {
//                         public void execute(Namespace args, PrintStream out) throws Exception {
//                             out.println("read-only mode, command: " + getName() + " is not allowed");
//                         }
//                     };
//                 }
//             }
//             return Optional.of(command);
//         } else {
//             return Optional.empty();
//         }
//     }
// }


import io.dashbase.clue.commands.ClueCommand;
import io.dashbase.clue.commands.CommandRegistrar;
import io.dashbase.clue.commands.CommandRegistry;
import java.util.Optional;
package io.dashbase.clue;



public class ClueContext {
  protected final CommandRegistry registry = new CommandRegistry();

  private final boolean interactiveMode;

// Path: src/main/java/io/dashbase/clue/commands/ClueCommand.java
// public abstract class ClueCommand {
// 
//   protected ClueContext ctx;
//   private ArgumentParser parser;
// 
//   public ClueCommand(ClueContext ctx){
//     this(ctx, false);
//   }
// 
//   public ClueCommand(ClueContext ctx, boolean skipRegistration){
//     this.ctx = ctx;
//     if (!skipRegistration) {
//       this.ctx.registerCommand(this);
//     }
//   }
// 
//   public final Namespace parseArgs(String[] args) throws ArgumentParserException {
//      if (parser == null) {
//        this.parser = buildParser(ArgumentParsers.newFor(getName())
//                .build().defaultHelp(true).description(help()));
//        if (parser == null) {
//          return null;
//        }
//      }
//      return parser.parseArgs(args);
//   }
//   
//   public ClueContext getContext(){
//     return ctx;
//   }
// 
//   protected ArgumentParser buildParser(ArgumentParser parser) {
//     return null;
//   }
//   
//   public abstract String getName();
//   public abstract String help();
//   public abstract void execute(Namespace args, PrintStream out) throws Exception;
// }
// 
// Path: src/main/java/io/dashbase/clue/commands/CommandRegistrar.java
// @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = DefaultCommandRegistrar.class)
// @JsonSubTypes({
//         @JsonSubTypes.Type(name = "default", value = DefaultCommandRegistrar.class)
// })
// public interface CommandRegistrar {
//     void registerCommands(ClueContext ctx);
// }
// 
// Path: src/main/java/io/dashbase/clue/commands/CommandRegistry.java
// public class CommandRegistry {
//     private final SortedMap<String, ClueCommand> cmdMap = new TreeMap<String, ClueCommand>();
//     private volatile boolean readonly = true;
// 
//     public void registerCommand(ClueCommand cmd){
//         String cmdName = cmd.getName();
//         if (cmdMap.containsKey(cmdName)){
//             throw new IllegalArgumentException(cmdName+" exists!");
//         }
//         cmdMap.put(cmdName, cmd);
//     }
// 
//     public Set<String> commandNames() {
//         return cmdMap.keySet();
//     }
// 
//     public boolean exists(String command) {
//         return cmdMap.containsKey(command);
//     }
// 
//     public void setReadonly(boolean readonly) {
//         this.readonly = readonly;
//     }
// 
//     public boolean isReadonly() {
//         return this.readonly;
//     }
// 
//     public Collection<ClueCommand> getAvailableCommands() {
//         if (readonly) {
//             return cmdMap.values().stream().filter(c -> c.getClass().isAnnotationPresent(Readonly.class)).collect(Collectors.toList());
//         } else {
//             return cmdMap.values();
//         }
//     }
// 
//     public Optional<ClueCommand> getCommand(String cmd){
// 
//         ClueCommand command = cmdMap.get(cmd);
//         if (command != null) {
//             if (readonly) {
//                 if (!command.getClass().isAnnotationPresent(Readonly.class)) {
//                     command = new FilterCommand(command) {
//                         public void execute(Namespace args, PrintStream out) throws Exception {
//                             out.println("read-only mode, command: " + getName() + " is not allowed");
//                         }
//                     };
//                 }
//             }
//             return Optional.of(command);
//         } else {
//             return Optional.empty();
//         }
//     }
// }


// Path: src/main/java/io/dashbase/clue/ClueContext.java
import io.dashbase.clue.commands.ClueCommand;
import io.dashbase.clue.commands.CommandRegistrar;
import io.dashbase.clue.commands.CommandRegistry;
import java.util.Optional;

package io.dashbase.clue;



public class ClueContext {
  protected final CommandRegistry registry = new CommandRegistry();

  private final boolean interactiveMode;

  public ClueContext(CommandRegistrar commandRegistrar, boolean interactiveMode) {