internal/skills/builtin/jq/SKILL.md
Crush ships a built-in jq command (via github.com/itchyny/gojq) available
in the bash tool. No external binary is required.
| Flag | Description |
|---|---|
-r, --raw-output | Output strings without quotes |
-j, --join-output | Like -r but no trailing newline |
-c, --compact-output | One-line JSON output |
-s, --slurp | Read all inputs into an array |
-n, --null-input | Use null as input (ignore stdin) |
-e, --exit-status | Exit 1 if last output is false or null |
-R, --raw-input | Read each line as a string, not JSON |
--arg name value | Bind $name to a string value |
--argjson name value | Bind $name to a parsed JSON value |
File arguments after the filter are also supported: jq '.foo' file.json.
The built-in uses gojq, which is a pure-Go jq implementation. Key differences:
keys_unsorted
and -S are unavailable."abcde"[2] returns "c".--ascii-output, --seq, --stream,
--stream-errors, -f/--from-file, --slurpfile, --rawfile,
--args, --jsonargs, input_line_number, $__loc__, some regex
features (backreferences, look-around).--yaml-input/--yaml-output but the
built-in does not currently expose these flags.Extract a field:
echo '{"name":"crush"}' | jq '.name'
Filter an array:
echo '[1,2,3,4,5]' | jq '[.[] | select(. > 3)]'
Reshape objects:
echo '{"first":"Ada","last":"Lovelace"}' | jq '{full: (.first + " " + .last)}'
Use variables:
echo '{}' | jq --arg host localhost --argjson port 8080 '{host: $host, port: $port}'
Slurp multiple JSON values:
echo '{"a":1}{"b":2}' | jq -s '.'
Compact output for piping:
echo '{"a":1}' | jq -c '.a += 1'
Raw string output:
echo '["one","two","three"]' | jq -r '.[]'
Process a file:
jq '.dependencies | keys' package.json
Null input for constructing JSON:
jq -n --arg msg hello '{"message": $msg}'
jq -r '.url' data.json | xargs curl| inside the expression, not shell pipes.try to suppress errors on missing keys: jq 'try .foo.bar'// "default" for fallback values: jq '.name // "unknown"'@csv, @tsv, @base64, @html, @uri for format strings.