Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
63fab23
feat: replace picocli with aesh for CLI parsing
stalep May 18, 2026
69a5ffb
hardcode the sub-command names
stalep May 19, 2026
d974a25
refactor: remove reflection from CLI command introspection
stalep May 19, 2026
d7e2d5f
fix: resolve bugs found during aesh migration review
stalep May 19, 2026
c06b1e0
refactor: address medium-severity issues from aesh migration review
stalep May 19, 2026
dd2c00f
test: assert Main.getSubcommandNames() matches JBang annotation
stalep May 19, 2026
8a4dd76
fix: improve test safety and reduce unnecessary allocations
stalep May 19, 2026
813bc1f
docs: regenerate CLI docs with alias and negatable option support
stalep May 19, 2026
98af2cf
fix: address review feedback from PR #2453
stalep May 20, 2026
aed7c65
fix: improve error exit codes and doc argument labels
stalep May 20, 2026
1a93e63
docs: render --help as boolean flag in generated docs
stalep May 20, 2026
2f802e2
refactor: use registry-level DefaultValueProvider and fallbackValue
stalep May 20, 2026
4ab4ac7
refactor: replace StrictOptionParser with fallbackValue (aesh#447)
stalep May 20, 2026
d94d7d6
refactor: use aesh terminal-api ANSI constants in ConsoleOutput
stalep May 20, 2026
c445a7a
feat: add usage examples to jbang help via HelpSectionProvider
stalep May 17, 2026
e33c2c4
feat: add usage examples header and branding footer to help output
stalep May 17, 2026
be3ff66
Add tab-completion for scriptOrFile argument (files + aliases)
maxandersen May 17, 2026
8072bf7
Add catalog alias browsing to ScriptRefCompleter
maxandersen May 17, 2026
3425517
Fix fish completion script dropping current token
maxandersen May 17, 2026
bbea337
Add Maven GAV completion from local repository
maxandersen May 17, 2026
393289c
Add GitHub URL navigation completion
maxandersen May 17, 2026
38ca336
Use HEAD ref instead of guessing default branch
maxandersen May 17, 2026
9365f8c
Support bare github.com/ URLs and optional trailing slash
maxandersen May 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@ allure-results
.DS_Store
.env
assets/
.cachebro/
CLAUDE.md
PLAN-*.md
32 changes: 28 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,11 @@ dependencies {
implementation 'org.jspecify:jspecify:1.0.0'
implementation 'org.apache.commons:commons-text:1.15.0'
implementation 'org.apache.commons:commons-compress:1.27.1'
implementation 'info.picocli:picocli:4.7.7'
annotationProcessor 'info.picocli:picocli-codegen:4.7.7'
implementation('org.aesh:aesh:3.8-dev') {
exclude group: 'org.aesh', module: 'readline'
}
implementation 'org.aesh:readline-api:3.7'
annotationProcessor 'org.aesh:aesh-processor:3.8-dev'
implementation 'io.quarkus.qute:qute-core:1.13.7.Final'
implementation 'org.codehaus.plexus:plexus-java:1.2.0'
implementation 'com.google.code.gson:gson:2.13.2'
Expand Down Expand Up @@ -387,7 +390,9 @@ shadowJar {
}

test {
useJUnitPlatform()
useJUnitPlatform() {
excludeTags 'benchmark'
}
javaLauncher = testExecutionToolchain
def jvmArgsList = ["-javaagent:${configurations.agent.singleFile}"] // for allure reporting
if (testJavaVersion.asInt() >= 9) {
Expand All @@ -413,6 +418,25 @@ test {
systemProperty('jbang.test.wiremock.enable', project.findProperty('disableWiremock') == 'true' ? 'false' : 'true')
}

task benchmark(type: Test) {
description = 'Run startup benchmark tests'
group = 'verification'
useJUnitPlatform() {
includeTags 'benchmark'
}
javaLauncher = testExecutionToolchain
def jvmArgsList = []
if (testJavaVersion.asInt() >= 9) {
jvmArgsList.addAll([
"--add-opens", "java.base/java.lang=ALL-UNNAMED",
"--add-opens", "java.base/java.util=ALL-UNNAMED"
])
}
jvmArgs = jvmArgsList
testLogging.showStandardStreams = true
systemProperty('jbang.test.wiremock.enable', project.findProperty('disableWiremock') == 'true' ? 'false' : 'true')
}

jacoco {
toolVersion = '0.8.14' // 0.8.14 supports java 25
}
Expand Down Expand Up @@ -606,7 +630,7 @@ asciidoctor {
task clidoc(type: Exec) {
doFirst {
println 'Generating cli man pages'
commandLine 'build/install/jbang/bin/jbang', '--cp', 'build/install/jbang/bin/jbang.jar', '--deps','org.eclipse.sisu:org.eclipse.sisu.inject:0.3.5', 'docs/genadoc.java', '-d', 'docs/modules/cli', '--force', 'dev.jbang.cli.JBang'
commandLine 'build/install/jbang/bin/jbang', '--cp', 'build/install/jbang/bin/jbang.jar', 'docs/genadoc.java', '-d', 'docs/modules/cli', '--force', 'dev.jbang.cli.JBang'
}
}

Expand Down
1,103 changes: 273 additions & 830 deletions docs/genadoc.java

Large diffs are not rendered by default.

68 changes: 63 additions & 5 deletions docs/modules/cli/nav.adoc
Original file line number Diff line number Diff line change
@@ -1,5 +1,63 @@
* CLI Reference
+
--
include::partial$nav-jbang.adoc[]
--
* xref:jbang:cli:jbang.adoc[jbang]
** xref:jbang:cli:jbang-run.adoc[run]
** xref:jbang:cli:jbang-build.adoc[build]
** xref:jbang:cli:jbang-edit.adoc[edit]
** xref:jbang:cli:jbang-init.adoc[init]
** xref:jbang:cli:jbang-alias.adoc[alias]
*** xref:jbang:cli:jbang-alias-add.adoc[add]
*** xref:jbang:cli:jbang-alias-list.adoc[list]
*** xref:jbang:cli:jbang-alias-remove.adoc[remove]
** xref:jbang:cli:jbang-template.adoc[template]
*** xref:jbang:cli:jbang-template-add.adoc[add]
*** xref:jbang:cli:jbang-template-list.adoc[list]
*** xref:jbang:cli:jbang-template-remove.adoc[remove]
** xref:jbang:cli:jbang-catalog.adoc[catalog]
*** xref:jbang:cli:jbang-catalog-add.adoc[add]
*** xref:jbang:cli:jbang-catalog-update.adoc[update]
*** xref:jbang:cli:jbang-catalog-list.adoc[list]
*** xref:jbang:cli:jbang-catalog-remove.adoc[remove]
** xref:jbang:cli:jbang-trust.adoc[trust]
*** xref:jbang:cli:jbang-trust-add.adoc[add]
*** xref:jbang:cli:jbang-trust-list.adoc[list]
*** xref:jbang:cli:jbang-trust-remove.adoc[remove]
** xref:jbang:cli:jbang-cache.adoc[cache]
*** xref:jbang:cli:jbang-cache-clear.adoc[clear]
** xref:jbang:cli:jbang-completion.adoc[completion]
** xref:jbang:cli:jbang-jdk.adoc[jdk]
*** xref:jbang:cli:jbang-jdk-install.adoc[install]
*** xref:jbang:cli:jbang-jdk-list.adoc[list]
*** xref:jbang:cli:jbang-jdk-uninstall.adoc[uninstall]
*** xref:jbang:cli:jbang-jdk-home.adoc[home]
*** xref:jbang:cli:jbang-jdk-java-env.adoc[java-env]
*** xref:jbang:cli:jbang-jdk-exec.adoc[exec]
*** xref:jbang:cli:jbang-jdk-default.adoc[default]
** xref:jbang:cli:jbang-version.adoc[version]
** xref:jbang:cli:jbang-wrapper.adoc[wrapper]
*** xref:jbang:cli:jbang-wrapper-install.adoc[install]
** xref:jbang:cli:jbang-info.adoc[info]
*** xref:jbang:cli:jbang-info-tools.adoc[tools]
*** xref:jbang:cli:jbang-info-classpath.adoc[classpath]
*** xref:jbang:cli:jbang-info-jar.adoc[jar]
*** xref:jbang:cli:jbang-info-docs.adoc[docs]
** xref:jbang:cli:jbang-app.adoc[app]
*** xref:jbang:cli:jbang-app-install.adoc[install]
*** xref:jbang:cli:jbang-app-list.adoc[list]
*** xref:jbang:cli:jbang-app-uninstall.adoc[uninstall]
*** xref:jbang:cli:jbang-app-setup.adoc[setup]
** xref:jbang:cli:jbang-export.adoc[export]
*** xref:jbang:cli:jbang-export-portable.adoc[portable]
*** xref:jbang:cli:jbang-export-local.adoc[local]
*** xref:jbang:cli:jbang-export-mavenrepo.adoc[mavenrepo]
*** xref:jbang:cli:jbang-export-native.adoc[native]
*** xref:jbang:cli:jbang-export-fatjar.adoc[fatjar]
*** xref:jbang:cli:jbang-export-jlink.adoc[jlink]
*** xref:jbang:cli:jbang-export-gradle.adoc[gradle]
*** xref:jbang:cli:jbang-export-maven.adoc[maven]
** xref:jbang:cli:jbang-config.adoc[config]
*** xref:jbang:cli:jbang-config-get.adoc[get]
*** xref:jbang:cli:jbang-config-set.adoc[set]
*** xref:jbang:cli:jbang-config-unset.adoc[unset]
*** xref:jbang:cli:jbang-config-list.adoc[list]
** xref:jbang:cli:jbang-deps.adoc[deps]
*** xref:jbang:cli:jbang-deps-search.adoc[search]
*** xref:jbang:cli:jbang-deps-add.adoc[add]
Loading
Loading