Releases: nordicnode/skillpack
Releases · nordicnode/skillpack
Release list
v0.13.2
Added
- expand languages, output formats, and distribution hardening
Added
--format junitforskillpack verify: JUnit XML for xUnit-consuming CI
(GitLab CI, Jenkins, CircleCI).--format jsonforskillpack add(parity withinit/update/diff).marketplace_categoryandowner_typeoverrides inskillpack.toml— the
marketplacecategoryandowner.typefields are no longer hardcoded.- Nix, Dart/Flutter, and Haskell language detection (plus category/globs
hints), wideningintrospectbeyond the original 13 languages. - A multi-skill pack's marketplace entry now merges every skill's
keywords. - A published JSON Schema for the
verify --format jsonreport
(verify-report.schema.json). - The reusable
skillpack.ymlworkflow now emits--format github
annotations; the release pipeline gained aninstall.shsmoke job, and the
Homebrew formula pins per-platformsha256(re-pinned via
scripts/update_homebrew_sha256.py).
Fixed
update/diffnow detect skillpack-generated single-file targets
(AGENTS.md,CLAUDE.md,GEMINI.md,CONVENTIONS.md,
.goose/instructions.md,.github/copilot-instructions.md) instead of
silently dropping them from the default target set; the collision guard is
content-aware (a clean generated file is tracked, a divergent one is held).verify --watchnow reports unrecoverable errors withINIT_FATAL(3),
matching the standaloneverifypath.
v0.13.1
Added
- expand agent ecosystem coverage and power-user tooling
Fixed
- harden distribution assets and default refresh to present targets
- harden verify, config, and add against silent corruption
Added
- Native Claude Code skills directory: the Claude target now also emits
.claude/skills/<name>/SKILL.md(auto-loaded with no plugin install step). - Four new ecosystem targets: Cline (
.clinerules/<name>.md), Roo Code
(.roo/rules/<name>.md), Kilo Code (.kilocode/rules/<name>.md), and
Goose (.goose/instructions.md) —--target allnow covers 14 formats. skillpack add <name>: append a skill to an existing pack (interview or
--non-interactivebootstrap) and regenerate.--target list: print the canonical--targetvalues.--format jsonforinit/update/diff: machine-readable summaries for CI.verify --format github: GitHub Actions::error/::warningannotations
for inline PR-diff comments.skillpack config+config --validate: summarize/validate the committed
skillpack.toml; a JSON Schema ships atskillpack.schema.json.- Derived-field overrides in
skillpack.toml:allowed_tools,category,
globs,opencode_mode, andkeywordscan pin the language-derived values. - Polyglot monorepo detection:
introspectrecordssecondary_languagesand
init --autoemits one skill per detected language. - One-command
install.sh+ a Homebrew formula (homebrew/skillpack.rb) and a
staticx86_64-unknown-linux-muslrelease binary.
Fixed
initre-running on a hand-authored[[skills]]pack no longer collapses it
to the primary skill (it now renders every skill).- Subcommand capture now honors a total
--helpspawn budget (breadth cap),
truncating wide CLIs instead of forking thousands of probes. - Subcommand parsing now recognizes cobra (
Available Commands:) and argparse
({cmd1,cmd2}usage) help shapes, not just clap. command_from_documentedno longer reads surrounding prose as the program
name (a secondary skill used to resolve to CLI`The`).- Version drift now genuinely tolerates a CLI that prints
--versionand
exits non-zero (captured output is carried throughRanNonZero).
v0.13.0
Added
- Recursive subcommand capture:
initwalks nested subcommands (git remote add)
and renders them as indented### Subcommandsbullets;verifyrecursively
drift-checks every documented subcommand path. - Structured logging:
--log-level(off/error/warn/info/debug/trace) and
--log-format(human/json) route spawn calls and introspection traces through
tracing;--debugis now an alias for--log-level debug.
Changed
ProjectProfile.cli_subcommand_helpis replaced by the recursive
cli_subcommand_tree: Vec<SubcommandNode>(breaking for library and
doctor --format jsonconsumers).VerifyInput.debug/InvocationInput.debugremoved; spawn logging now flows
through the structured logger (breaking for library consumers).verify::invocation::extract_documented_subcommandsreturnsVec<Vec<String>>
subcommand paths instead ofVec<String>(breaking for library consumers).
v0.12.1
Fixed
- address review findings across CI, docs, and source
Other
- production-readiness pass from the second review
- remove em dashes from README
- center the Built with Freebuff heading
- rerun benchmark with 3 runs per condition
- rewrite agent-demo for Google Antigravity (agy) + Gemini 3.7 Flash
- switch benchmark to Google Antigravity (agy) + Gemini 3.7 Flash
- drop duplicate skillpack h1 from hero (wordmark is in the logo)
- add Freebuff CTA banner and drop emoji from section headers
No unreleased changes yet.
v0.12.0
Added
- Repeatable OpenCode benchmark harness (
scripts/benchmark/):run.sh
runs an A/B of a plain repo clone vsinit --auto --target alloutput
through OpenCode — same repo, same default agent, same model, same
questions (the old demo's--agentconfound is gone).analyze.py
evidence-scores each question and reports per-condition medians across
--runs N. Uses opencode's configured model by default; pin with
--model. First committed results (fd, glm-5.2, 2 runs/condition):
−32% agent steps, −44% wall clock, −6% tokens, 3.5/4 → 4/4 correct.
Fixed
init --autoREADME hint no longer leaks badge/markup rows (shields.io,
CI status, language links) into the derived description —read_readme_hint
now skips lines that are markup-only, so a repo like fd whose README leads
with a badge banner gets the real tagline (previously the description
became a badge URL and the generated pack failed verify at 93/100).verify'sdescription_action_verbcheck accepts descriptions that open
with a code-formatted name (`fd` is a program to ...) — the leading
backtick pair is stripped before the alpha-word heuristic. Markup/badge
leakage still fails.
Added
init --auto: zero-flag, zero-prompt init. The intent is derived entirely
from the repo — description from the README hint, author from the manifest
orgit config user.name, license from the LICENSE file (or--license),
invocation from the detected CLI.--importis required for libraries
(actionable error otherwise);--triggeris optional (falls back to the
description hint). Implies non-interactive: on a critical verification
failure it refuses to write (exit 2) instead of prompting.- Four new harness targets, bringing the total to ten:
claude-md
(CLAUDE.md— Claude Code / Cline / Roo Code),gemini(GEMINI.md—
Gemini CLI, per the official docs),windsurf(.windsurf/rules/<name>.md
— same frontmatter schema as Cursor rules), andaider(CONVENTIONS.md).
The three plain-markdown targets share the copilot/AGENTS.md structural
check (now a single shared implementation); Windsurf reuses the Cursor
rule check with its own check_id prefix. AGENTS.md coverage is documented
for Freebuff and 60k+ projects' agents.
Added
- Multi-skill packs (the documented future direction, now shipped): a
[[skills]]array inskillpack.tomlrenders one per-skill file per
ecosystem (skills/<name>/SKILL.md,.codex/skills/<name>/SKILL.md,
.cursor/rules/<name>.mdc,.opencode/agents/<name>.md), each under its
own directory name and with its own frontmatter. The[skill]table stays
the PRIMARY skill — pack-level files (plugin.json,marketplace.json,
AGENTS.md, copilot-instructions.md) render from it, and hand-adding a
[[skills]]entry keeps it primary.update/diff/verify --fixare all
multi-skill aware:verifyaccepts any configured skill name in the
name_driftcheck, and--fixsplices the RIGHT skill's frontmatter while
preserving every body. The config normalizes to a[[skills]]array on
firstupdate. Author the array by hand;initstill writes single-skill
packs. Docs:docs/reference.md"Multi-skill packs" section.
Added
init --non-interactivecan now bootstrap the FIRST pack from flags
(--description,--trigger,--author,--invocationor--import)
when noskillpack.tomlexists — previously a chicken-and-egg: CI needed a
committed config, which needed an interactive run. A fresh checkout can now
be scaffolded end-to-end with no TTY:skillpack init --non-interactive --description ... --trigger ... --invocation .... Missing required fields
fail with an actionable message naming the flag; passing both
--invocationand--importis rejected. With a committed config the
flags are ignored (config wins), so re-runs stay deterministic.
Fixed
.gitignorenow excludes.freebuff/— the desktop-app local database was
being swept into the crates.io tarball (cargo packageincludes untracked,
non-ignored files). Private local data would have shipped with the crate.- All 11 rustdoc warnings eliminated (stale
GeneratedFilelinks, links to
private items, an unclosed HTML tag, a redundant link target) —cargo doc
is now warning-free. release.ymlnow runscargo auditbeforecargo publish, so a
vulnerability disclosed after the lastmainCI run blocks publishing.
Added
- Language support expanded to five more ecosystems — Zig
(build.zig/build.zig.zon+zig-out/bin/), Swift (Package.swift.build/{debug,release}/artifacts orswift run), C / C++
(CMakeLists.txt,meson.build,Makefileandbuild//bin/
binaries), Elixir (mix.exs+_build/{dev,prod}/rel/releases or
mix escript), and Deno (deno.json/deno.jsonc+deno run
entrypoints) — bringing the supported language count to thirteen.
Detection, manifest parsing, CLI candidates, Cursor globs, and snapshot
coverage all extended.
Fixed
detect_repo_urlnow preserves the rawgit remote get-url origin
string (what lands inplugin.jsonhomepage/repository) while
urls_equivalentstill compares normalized forms — so a trailing-slash
or.git-suffix difference no longer causes false URL drift, and the
committed plugin.json keeps the exact origin URL.- The Go CLI candidate test compares the binary file stem
case-insensitively (matching the Node test pattern) — fixes a
windows-latest-only failure where PATHEXT resolvesgoto a path ending
ingo.EXE.
Changed
- README rewritten to be user-facing: plain-language quick start, "what you
get" per ecosystem, and a measured-results section up front. The full
check list, every CLI flag, and the platform notes moved to the new
docs/reference.md, which the README links to. - Declared MSRV raised to Rust 1.85 (
rust-versioninCargo.toml), matching
what the lockedclap/teraactually require —cargo installon Rust
1.74–1.84 previously failed with a hard toolchain error. README badge and
toolchain comment updated; CI gains an MSRV job that checks lib + bins at
1.85.0 so the floor can't drift again. - Removed three unused direct dependencies (
thiserror,walkdir,
indexmap) — they had zero references insrc/and only bloated compile
time and the lockfile.
Added
- New
verifydiscovery checks: an unterminated---frontmatter block in a
SKILL.md/ cursor.mdc/ opencode agent file now FAILs (*.frontmatter_unclosed)
instead of being silently parsed as valid frontmatter with the body swallowed;
askills/<name>/SKILL.md(or.codex/skills/<name>/SKILL.md) whose directory
name disagrees with its frontmattername:warns (*.dir_name_mismatch). discovery.plugin.url_driftnow reports BOTHhomepageandrepository
drifts in one warning — the old early return hid a second stale field.- CI gains a
cargo auditjob (RustSec advisory scan of the lockfile). update/diffnow honor the global--verbose/--debugflags (they were
silently ignored).updateno longer rewritesskillpack.tomlwhen its serialized content is
unchanged (no mtime churn); uses the same frontmatter-splice semantics.- The interview accepts semicolons as trigger-phrase separators (was
comma-only). release.ymlreads the crate version from the[package]table only — the
old^versiongrep would break if a workspace-levelversionline ever
appeared.
Fixed
HELP_TIMEOUTraised 15s → 30s: the Windows CIgo run .round trip timed
out again under parallel-test load (the same flake that raised it 8s → 15s
previously). The go round-trip test now also pre-warms the build cache
beforeinit, mirroring the rust-cli / csharp fixtures.