Skip to content

0.17.0

2026-07-21 · View on GitHub

What's New

New rules

  • Hidden-content security rules (auto-enabled) catch content that is invisible in rendered markdown but fully visible to the agent: security-invisible-unicode (zero-width, bidi and tag codepoints, with RTL and emoji-sequence exemptions), security-hidden-instructions (directive-bearing HTML comments, exempting linter and doc-tool comment channels), and security-encoded-payload (long high-entropy base64/base64url/hex runs). (#404)
  • Lean-prompt content rules derived from frontier-model prompting guidance: content-repeated-directive (auto) flags the same instruction stated twice or restated in different words, content-emphasis-density (auto) flags IMPORTANT/MUST/NEVER inflation past a configurable line ratio, and content-missing-stop-condition (opt-in) flags open-ended loop instructions with no stopping condition. (#429)
  • content-unclosed-fence flags a top-level code fence that never closes — which previously left every content rule blind to the rest of the file — with a SUGGEST-confidence autofix that appends the matching closer. (#410)
  • content-instruction-drift (auto, INFO) reports sections copied between instruction files such as CLAUDE.md and AGENTS.md that were later edited in only one place. Identical copies never fire; similarity-threshold, min-section-words and ignore-generated are configurable. (#399)

New features

  • skillsaw lint now marks which violations are fixable — [*] for skillsaw fix, [?] for skillsaw fix --suggest — with a summary line counting each, additive fixable / fix_confidence fields in JSON output, and a marker in HTML. skillsaw fix prints repo-relative paths for single-root runs plus a closing re-lint hint. (#409)
  • TTY-aware terminal output: new --color / --no-color flags on lint, fix, explain and badge, with FORCE_COLOR / NO_COLOR / isatty() precedence so ANSI escapes no longer leak into pipes and redirects. Real terminals get clickable OSC 8 hyperlinks on rule IDs and file paths. (#418)
  • skillsaw badge --large renders a self-contained SVG report card (.skillsaw-card.svg) with the letter grade, weighted violation density, content-token count, plugin and skill counts, and the top three offending rules. Supports --theme dark|light, and prints ready-to-paste README markdown. (#400)
  • openclaw-metadata now matches OpenClaw's own frontmatter parser: accepts type as an alias for kind and lowercases it, enforces per-kind required install fields (brew→formula|cask, node→package, go→module, uv→package), type-checks cask/package/module, validates apiKey / skillKey / hidden, and suggests corrections for near-miss metadata.openclaw key typos. (#423)
  • New skillsaw-lint skill ships in the Claude Code plugin: when an agent authors or edits agentic context (skill, slash command, agent, hook, plugin, marketplace, or CLAUDE.md/AGENTS.md/GEMINI.md/Cursor/Copilot/Cline/Kiro rules), it lints that file, applies autofixes, resolves the rest via skillsaw explain, and re-lints until clean. (#405)

Fixes

  • Pre-release hardening sweep: security-invisible-unicode and openclaw-metadata no longer abort a run with rule-execution-error on legal YAML (non-string keys, anchor cycles, merge keys); false-positive and false-negative tuning across the new security and content rules; agentskill-name, marketplace-registration and content-unclosed-fence stop advertising [*] fixable for violations skillsaw fix refuses to touch; badge/card SVG writing and TERM=dumb color detection corrected. (#432)
  • instruction-imports-valid now validates mid-line @path references rather than only line-start ones, resolves imports relative to the file containing them, and follows nested imports up to four hops — while still exempting @org/team GitHub mentions and @~/ home-directory memory imports. (#406)
  • content-inconsistent-terminology no longer flags terminology used in headings, reports the specific line using the minority term instead of the whole file, and correctly attributes matches in files holding multiple content fragments (.coderabbit.yaml instructions, promptfoo prompts). (#428)
  • content-embedded-secrets now splits lines on \n only, so a planted U+2028/NEL/VT character can no longer shift a secret finding onto the wrong reported line. (#404)

Other

  • skillsaw explain openclaw-metadata now notes that OpenClaw silently ignores unrecognized fields, tabulates allowed values for the kind/os/archive/requires enums, and gives concrete fixes. "OpenClaw" is also capitalized correctly throughout the rule description, generated .skillsaw.yaml.example and docs. (#422)
  • README rewritten as a focused product overview, with the builtin-rules reference, repository types, inline suppression, installation, configuration, baseline and CI sections moved to the docs site. (#431, #389)
  • Shipped skills hardened: skillsaw-onboard no longer pipes curl output into python3 for its PyPI version lookup, and skillsaw-create-plugin, skillsaw-fix and skillsaw-onboard now declare license: Apache-2.0. CI gained a prompt-injection and malicious-pattern scan over the repo's own agent context. (#370)
  • Supply-chain hardening: all GitHub Actions are SHA-pinned, unnecessary id-token: write dropped from LLM agent jobs, plus CODEOWNERS and grouped monthly Dependabot updates. (#393)