diff --git a/.bazelrc b/.bazelrc
new file mode 100644
index 0000000..36dbde3
--- /dev/null
+++ b/.bazelrc
@@ -0,0 +1,4 @@
+build --java_language_version=25
+build --java_runtime_version=25
+build --tool_java_language_version=25
+build --tool_java_runtime_version=25
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 1fac4d5..bcca68a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,10 @@
-.gradle
-build/
-!gradle/wrapper/gradle-wrapper.jar
-!**/src/main/**/build/
-!**/src/test/**/build/
-.kotlin
+/.idea/inspectionProfiles
+/MODULE.bazel.lock
+/.bazelbsp
+/bazel-bin
+/bazel-out
+/bazel-KenCommandAPI
+/bazel-testlogs
### IntelliJ IDEA ###
.idea/modules.xml
diff --git a/.idea/bazelVersionCache.xml b/.idea/bazelVersionCache.xml
index ef2f15b..dc93e11 100644
--- a/.idea/bazelVersionCache.xml
+++ b/.idea/bazelVersionCache.xml
@@ -6,7 +6,7 @@
-
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 4467ac4..6b56b62 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 79f284c..cf49dca 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -9,7 +9,7 @@
-
+
@@ -37,20 +37,49 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -145,45 +174,45 @@
- {
- "keyToString": {
- "Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [:kencommandapi-core:de.kentoj.kencommandapi.Main.main()].executor": "Run",
- "Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [build].executor": "Run",
- "Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [publish].executor": "Run",
- "Gradle.CommandParserTest.checkArgumentExpected.executor": "Run",
- "Gradle.Download Sources.executor": "Run",
- "Gradle.KenCommandAPI [:de.kencommand.Main.main()].executor": "Run",
- "Gradle.KenCommandAPI [assemble].executor": "Run",
- "Gradle.KenCommandAPI [buildEnvironment].executor": "Run",
- "Gradle.KenCommandAPI [build].executor": "Run",
- "Gradle.KenCommandAPI [clean test].executor": "Run",
- "Gradle.KenCommandAPI [clean].executor": "Run",
- "Gradle.KenCommandAPI [javadoc].executor": "Run",
- "Gradle.KenCommandAPI [publishAllPublicationsToScrowRepository].executor": "Run",
- "Gradle.KenCommandAPI [publish].executor": "Run",
- "Gradle.KenCommandAPI [test].executor": "Run",
- "Gradle.KenCommandAPI:kencommandapi-bukkit [build].executor": "Run",
- "Gradle.KenCommandAPI:kencommandapi-bukkit [generatePomFileForKenCommandAPIBukkitPublication].executor": "Run",
- "Gradle.KenCommandAPI:kencommandapi-bukkit [publishAllPublicationsToScrowRepository].executor": "Run",
- "Gradle.KenCommandAPI:kencommandapi-bukkit [publish].executor": "Run",
- "Gradle.KenCommandAPI:kencommandapi-velocity [publish].executor": "Run",
- "Gradle.kencommandapi-core [build].executor": "Run",
- "ModuleVcsDetector.initialDetectionPerformed": "true",
- "RunOnceActivity.ShowReadmeOnStart": "true",
- "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
- "RunOnceActivity.git.unshallow": "true",
- "SHARE_PROJECT_CONFIGURATION_FILES": "true",
- "bazel.project.detector.is.bazel.project": "true",
- "git-widget-placeholder": "master",
- "kotlin-language-version-configured": "true",
- "last_opened_file_path": "/home/a/src/scrow/KenCommandAPI/gradle",
- "project.structure.last.edited": "Modules",
- "project.structure.proportion": "0.15",
- "project.structure.side.proportion": "0.6268199",
- "remote.dev.show.docker.config.missing.jdk.notification": "false",
- "settings.editor.selected.configurable": "preferences.pluginManager"
+
+}]]>
@@ -200,8 +229,13 @@
+
+
+
+
+
@@ -220,13 +254,13 @@
-
-
+
+
@@ -621,6 +655,7 @@
-
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 3002d3b..ad01ec3 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,81 @@
-example usage:
-http://forge.kentoj.de/scrow/core/src/commit/a55d985773t425e099fe9650cc1a705ceb2ece00/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/command/economy
\ No newline at end of file
+## Limitations & Bugs
+
+- argument's can't require specific permissions.
+- errors are always formatted using the RootLiteral's MessageStyle
+
+## Design
+
+Commands are trees of Literals.
+Literals can have arguments.
+Literals can also have Executors.
+
+arguments can be optional by giving them a default value.
+arguments can have suggestions.
+
+`/feed `:
+- feed is the root literal
+- `` is an argument: it's value is a User Object
+
+To allow the use of `/feed` without giving a user's name, i.e. to make the argument optional, we need to assign the
+user-argument a default value.
+
+## An example command
+
+Let's say we want to make a command that allows seeing how many coins another User has.
+If we don't specify a user, it should instead show the coins the sender has.
+
+## As a tree
+
+Visualized as a tree, we have a Node/Literal `coins` with an alias `balance` with an optional argument called `user`.
+To make an argument optional, it must have a default value.
+
+```text
+literal:coins/balance
+- has argument:user
+- has executor:getCoins
+```
+
+## As code
+```java
+/**
+ * Show the amount coins a user has.
+ * If no user is given, it should show the amount the sender of the command has.
+ */
+@NoArgsConstructor(access = AccessLevel.NONE)
+public class CoinsCommand {
+
+ @Getter
+ private final Literal rootLiteral;
+ private final CommandArgumentSpec userArg;
+
+ public CoinsCommand() {
+ userArg = CommandArgumentSpec.builder("user", new UserArgumentType())
+ .withRequirement(p -> !p.hasPermission("economy.immune.getcoins"),
+ "you can't see that player's balance")
+ .withDefaultValue(CommandContext::getSender)
+ .build();
+ rootLiteral = Literal.builder("coins", "balance")
+ .withStyle(MessageStyle.PLAIN)
+ .withPermission("economy.command.coins")
+ .withArgument(userArg)
+ .withSyncExecutor(this::getCoins)
+ .build();
+ }
+
+ private Result