skillshare v0.16.12 Release Notes
Release date: 2026-03-05
TL;DR
v0.16.12 adds structured JSON output to 8 more commands, bringing total --json coverage to all 12 major CLI commands. Every command now has a machine-readable output mode for agent consumption and CI/CD pipelines:
- 8 new
--jsoncommands — sync, install, update, uninstall, collect, target list, status, diff - Non-interactive by design —
--jsonon mutating commands implies--force(skips prompts) - Clean stdout — TUI, spinners, and progress suppressed; structured data to stdout only
No breaking changes. Drop-in upgrade from v0.16.11.
Structured JSON Output
The problem
AI agents (Claude Code, Codex, Cursor) and CI pipelines need to parse CLI output programmatically. Text output with colors, spinners, and tables is designed for humans — parsing it with grep/regex is brittle and breaks when formatting changes between versions.
Solution
8 commands gain --json support in two phases:
Phase 1 — Mutating commands:
| Command | --json implies
| Example |
|---|---|---|
sync
| (none) | skillshare sync --json | jq '.errors'
|
install
| --force --all
| skillshare install github.com/user/repo --json
|
update
| --force
| skillshare update --json | jq '.updated'
|
uninstall
| --force
| skillshare uninstall my-skill --json
|
collect
| --force
| skillshare collect ./path --json
|
Phase 2 — Read-only commands:
| Command | Example |
|---|---|
target list
| skillshare target list --json | jq '.[].name'
|
status
| skillshare status --json
|
diff
| skillshare diff --json | jq '.files'
|
Previously supported (unchanged):
| Command | Flag |
|---|---|
audit
| --format json (also --json as deprecated alias)
|
log
| --json (JSONL — one object per line)
|
check
| --json
|
list
| --json / -j
|
Design decisions
- Per-command JSON schema — each command defines its own output struct (e.g.,
syncJSONOutput,installJSONOutput). No universal envelope — keeps each schema focused and documented. writeJSON()helper — shared function with recursive nil-slice-to-empty-array conversion. Ensuresjqnever seesnullwhere it expects[].--jsonimplies--forcefor mutating commands — agents can't answer interactive prompts, so JSON mode skips them. This is safe because the caller explicitly opted into machine mode.- Stderr for progress, stdout for JSON — spinners and progress indicators go to stderr so they don't corrupt the JSON stream.
jqpiping works cleanly.
Usage patterns
# Agent workflow: install → verify → sync
skillshare install github.com/team/skills --json | jq -e '.skills | length > 0'
skillshare sync --json | jq -e '.errors == 0'
# CI pipeline: check for updates
skillshare check --json | jq '.tracked_repos[] | select(.has_update)'
# Dashboard: get full status
skillshare status --json | jq '{skills: .skills | length, targets: .targets | length}'Changelog
- b366f61 chore: formatting alignment and changelog jq example fix
- f03ba45 chore: update docs
- 02aa2b2 feat(cli): add --json output to 8 commands (Phase 1+2)
- 5c31332 feat(skill): add --json assertion guidance to cli-e2e-test skill
- 18bfe5f feat(skill): improve built-in skill for v0.16.12
- bcf31d8 fix(audit): show actual active analyzers in status --json output
- 9982c2e fix(cli): clean up --json output code after review
- 6b4a878 fix(cli): ensure --json mode outputs pure JSON to stdout
- 18cd0ec fix(cli): preserve non-zero exit code for --json error paths
- 4b09d2e fix(cli): redirect JSON-mode UI to /dev/null and add status --project --json
- 9a12df0 fix(cli): restore argument validation for status --project mode
- b5430e0 fix(cli): suppress UI output in --json mode for install, diff, uninstall
- d707fc6 fix(cli): suppress stderr progress messages in --json mode
- 1a4de5d fix(cli): use errors.As for jsonSilentError check in main
- 8ddf685 fix(cli): wrap collect/sync JSON errors with jsonSilentError
- 7223ac5 fix(sync): preserve non-json dry-run output stream
- 6ad930f perf(cli): parallelize git dirty checks in status --json
- 0d59f15 refactor(cli): deduplicate JSON output helpers and fix ResolvePolicy semantics
- 4535da1 refactor(cli): return updateResult from single-target update handlers