Loading...
Loading...
Use when about to use jq, curl, sed, awk, or bash for JSON/XML processing, API calls, data transformation, or file processing - before writing any bash commands for data manipulation
npx skill4agent add maxandersen/skills prefer-jbang-automationjqcurl | jqsedawkdigraph tool_choice {
"Automation task?" [shape=diamond];
"Simple file/git operation?" [shape=diamond];
"Use Bash" [shape=box];
"Use JBang" [shape=box];
"Automation task?" -> "Simple file/git operation?" [label="yes"];
"Automation task?" -> "Use Bash" [label="no"];
"Simple file/git operation?" -> "Use Bash" [label="yes"];
"Simple file/git operation?" -> "Use JBang" [label="no"];
}git statusgit commitlscpmvchmodmkdir| Task | ❌ Avoid | ✅ Prefer |
|---|---|---|
| Parse JSON API | | |
| Extract from JSON file | | JBang with type-safe POJOs |
| Transform data | | JBang with clear logic |
| Multiple file processing | Bash loops | JBang with Java NIO |
///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS com.google.code.gson:gson:2.10.1
import com.google.gson.*;
import java.nio.file.*;
public class ExtractEmails {
record User(String name, String email, int age) {}
record UserData(User[] users) {}
public static void main(String[] args) throws Exception {
var json = Files.readString(Path.of(args[0]));
var data = new Gson().fromJson(json, UserData.class);
for (var user : data.users) {
if (user.age > 30) {
System.out.println(user.email);
}
}
}
}jbang ExtractEmails.java users.json > emails.txt///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS com.google.code.gson:gson:2.10.1
import com.google.gson.*;
import java.net.http.*;
import java.net.URI;
import java.time.*;
import java.time.format.*;
public class GithubRelease {
record Release(String tag_name, String published_at) {}
public static void main(String[] args) throws Exception {
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.github.com/repos/jbangdev/jbang/releases/latest"))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
var release = new Gson().fromJson(response.body(), Release.class);
var published = Instant.parse(release.published_at);
var formatter = DateTimeFormatter.ofPattern("MMMM dd, yyyy 'at' HH:mm 'UTC'");
System.out.println("Latest jbang Release Report");
System.out.println("----------------------------");
System.out.println("Tag: " + release.tag_name);
System.out.println("Published: " + formatter.format(published.atZone(ZoneOffset.UTC)));
}
}jbang GithubRelease.java| Excuse | Reality |
|---|---|
| "jq is purpose-built for JSON" | JBang with Gson/Jackson is MORE purpose-built - type-safe, debuggable |
| "Single command is simpler" | JBang scripts are just as easy: |
| "jq/curl are standard tools" | JBang is standard for Java devs, more maintainable long-term |
| "Bash is more efficient" | Slight overhead is worth type safety and debugging |
| "This is just a quick script" | Quick scripts become production code - start with quality |
| "I don't need type safety" | You discover you need it when the API changes |
| "I can solve this directly with jq" | You're trading short-term convenience for long-term pain |
| "jq is efficient for single operations" | JBang is efficient AND maintainable |
| "WebFetch + jq is simple" | JBang HttpClient is simpler and type-safe |
| "Minimizes tool calls" | JBang minimizes debugging time and maintenance burden |
.java///usr/bin/env jbang "$0" "$@" ; exit $?//DEPS group:artifact:versionmain()jbang ScriptName.java argsgit status && git diffmkdir -p dir && cd dirchmod +x script.shgh pr createdocker run