- jq-transforms
- Overview
- jq-transforms is a schema-driven JSON transformation library built specifically for AI agents. It provides 60+ composable transformations for JSON manipulation, each with clear input/output contracts, comprehensive tests, and minimal implementations. The library emphasizes discoverability through schemas and composability through Unix pipes.
- When to Use This Skill
- Use this skill when:
- Transforming JSON data structures (CRUD operations, nested paths)
- Filtering or mapping arrays within JSON objects
- Extracting specific fields or patterns from JSON
- Validating JSON schemas or field types
- Converting between JSON types
- Composing multi-step JSON transformations
- Processing API responses or configuration files
- Core Transformation Categories
- CRUD Operations (crud-*)
- Path-based object manipulation for getting, setting, deleting, checking existence, merging, and querying nested JSON structures.
- Common examples:
- crud-get
-
- Retrieve value at nested path with optional default
- crud-set
-
- Set value at path, creating intermediate objects
- crud-delete
-
- Remove field at path
- crud-has
-
- Check if path exists
- crud-merge
-
- Recursively merge two objects
- Array Operations (array-*)
- Array transformations including filtering, mapping, reducing, flattening, chunking, and deduplication.
- Common examples:
- array-filter
-
- Filter array by field value
- array-map
-
- Extract field from each array element
- array-reduce
-
- Aggregate array (sum, avg, min, max, count)
- array-unique
-
- Remove duplicate values
- array-flatten
-
- Flatten nested arrays to specified depth
- String Operations (string-*)
- String manipulation within JSON objects.
- Common examples:
- string-split
-
- Split string into array by separator
- string-join
-
- Join array into string with separator
- string-replace
-
- Replace pattern in string
- string-trim
-
- Remove whitespace from string
- Extraction (extract-*)
- Pattern-based extraction from text fields.
- Common examples:
- extract-urls
-
- Extract URLs from text
- extract-code-blocks
-
- Extract code blocks from markdown
- extract-mentions
-
- Extract @mentions from text
- Validation (validate-
- , is-
- , has-*)
- Field validation and type checking.
- Common examples:
- validate-required
-
- Check required fields exist
- validate-types
-
- Validate field types
- is-timestamp
-
- Check if value is valid timestamp
- has-field
- Check if nested path exists
Type Conversions (to-*)
Convert between JSON types safely.
Common examples:
to-string
,
to-number
,
to-boolean
,
to-array
,
to-object
Usage Pattern
All transformations follow a consistent invocation pattern:
jq
-f
<
transform-dir
/transform.jq [ --arg key val ] [ --argjson key json ] input.json Example - Get nested value: echo '{"user":{"name":"skogix"}}' | \ jq -f crud-get/transform.jq --arg path "user.name"
Output: "skogix"
Example - Filter array: echo '{"items":[{"status":"active"},{"status":"inactive"}]}' | \ jq -f array-filter/transform.jq \ --arg array_field "items" \ --arg field "status" \ --arg value "active"
Output: {"items":[{"status":"active"}]}
- Example - Compose multiple transforms:
- cat
- data.json
- |
- \
- jq
- -f
- array-filter/transform.jq
- --arg
- array_field
- "users"
- --arg
- field
- "active"
- --arg
- value
- "true"
- |
- \
- jq
- -f
- array-map/transform.jq
- --arg
- array_field
- "users"
- --arg
- field
- "email"
- Transform Discovery
- To find the right transform for a task:
- By category
-
- Refer to the categories above to narrow down the domain (CRUD, array, string, etc.)
- By cheat sheet
-
- Consult
- references/CHEAT_SHEET.md
- for complete transform index with arguments and examples
- By schema
-
- Read
/schema.json - for detailed input/output contracts
- Each transform directory contains:
- transform.jq
- - The jq implementation (5-40 lines)
- schema.json
- - Input/output contract with examples
- test.sh
- - Comprehensive test suite
- test-input-*.json
- - Test fixtures
- Key Design Principles
- Schema-first
-
- Every transform has explicit input/output/args contract
- Argument-based
-
- All parameters via
- --arg
- /
- --argjson
- (no hardcoding)
- Composable
-
- Chain transforms via Unix pipes
- Type-safe
-
- Graceful handling of missing paths and wrong types
- Self-contained
-
- Each transform is isolated, no dependencies
- Minimal
- Fewer lines = fewer bugs, easier to understand Common Patterns Get value with default: jq -f crud-get/transform.jq --arg path "config.timeout" --arg default "30" Set nested value: jq -f crud-set/transform.jq --arg path "user.profile.age" --arg value "30" Filter and extract: jq -f array-filter/transform.jq --arg array_field "users" --arg field "active" --arg value "true" | \ jq -f array-map/transform.jq --arg array_field "users" --arg field "email" Validate required fields: jq -f validate-required/transform.jq --arg fields "name,email,age" Critical Implementation Notes When creating new transforms or debugging issues: Avoid common jq pitfalls: Use try-catch instead of // fallback for falsy value handling Use has() instead of != null for existence checks Check array types before using map() operations Refer to references/IMPLEMENTATION_SPEC.md for complete implementation patterns, test coverage requirements, and detailed pitfall documentation. References This skill bundles comprehensive reference documentation (loaded only when needed): CHEAT_SHEET.md - Quick reference of all 60+ transforms with arguments and examples IMPLEMENTATION_SPEC.md - Complete implementation guide with patterns and pitfalls README.md - User-facing documentation and design principles USAGE_EXAMPLES.md - Real-world usage scenarios Testing Test transforms before use:
Test specific transform
./crud-get/test.sh
Test all transforms
./test-all.sh Each transform has 8-17 test cases covering happy paths, falsy values, type safety, boundary conditions, and error cases.