Skip to content

v0.25.1

Choose a tag to compare

@github-actions github-actions released this 07 Oct 07:26
2cda6ee

skillshare v0.25.1 Release Notes

TL;DR

  1. prepend and append modes put a shared instruction file inside a tool's own file.
  2. doctor warns about OpenCode only when it loads a skill missing from its own folder, and honors OpenCode's switches.
  3. Installing a git submodule path is refused instead of leaving an empty folder.
  4. Plugin changes keep a symlinked config.yaml, and a project's config can no longer be pointed outside the project.

Shared instruction files with prepend and append

Tools without @import, such as Codex, Gemini CLI and Cursor, could only take a shared instruction file as a symlink or copy, which replaced the tool's own file. Single-file extras now have two more modes:

  • prepend and append write the shared file's content into the target file as a managed block at the top or end, and leave the rest of the file alone.
  • When the source changes, the next sync replaces the block in place.
  • A block edited by hand is not overwritten: extras list shows the target as modified until you copy the edit back to the source or reapply the block.
skillshare extras init team-agents --file AGENTS.md --source ~/dotfiles/team \
  --target ~/.codex --mode append
skillshare sync extras

On the dashboard's AGENTS.md tab, the mode picker lists prepend and append with import as the modes that keep the tool's own file. Each target row's path opens the file it writes, with skillshare's blocks tinted; a hand-edited block shows in the warning colour with Collect and Reapply.

OpenCode in doctor

OpenCode also reads ~/.claude/skills and ~/.agents/skills, so doctor warned about every overlap and the warning could not be silenced. OpenCode loads one skill per name, so a skill synced to both folders is fine.

  • doctor now warns only about skills OpenCode loads from another target's folder that are missing from its own, including ones you keep there by hand, and names them.
  • When OPENCODE_DISABLE_CLAUDE_CODE_SKILLS, OPENCODE_DISABLE_CLAUDE_CODE or OPENCODE_DISABLE_EXTERNAL_SKILLS is set where skillshare runs, doctor, sync and the dashboard treat that folder as skipped. skillshare only sees its own environment, so set it there as well as where OpenCode runs.
! opencode loads 1 skill missing from its own folder, from: claude

Git submodules

skillshare does not fetch submodules, so installing one reported success with nothing in it, a path inside one failed with a misleading "does not exist", and whole-repo installs dropped its skills silently.

  • Installing a submodule path, or a path inside one, now fails with an error that names the submodule, its pinned commit and its upstream URL. Install from that upstream repository instead.
  • install, --track and update warn about each submodule they skip.
  • Credentials in a submodule URL are never shown.

Config files

  • Symlinked config.yaml and plugins. plugin add and plugin update replaced a config.yaml linked from a dotfiles folder with a regular file, so the shared config never got the change, and they ignored preserve_tilde_on_save. A plugin source spelled with ~ also made plugin update fail with "snapshot ownership conflict".
  • Project config boundary. A cloned project could link .skillshare/config.yaml, or its sources.mcp file, to any file you can write, and the next save, plugin, hook or MCP change, or the dashboard's config editor, would rewrite it. These writes now refuse a destination outside the project and name the link. A global config still writes through its link.
  • init -p --visible projects in the dashboard. The dashboard looked only for .skillshare/config.yaml, so a project in skillshare/ was reported as having no config and the MCP page missed its override conflict.
  • Schemas. Editors no longer flag plugins, cnb_hosts, gitea_hosts, extras_source, log or a skill's kind as unknown.

Other fixes

  • Uninstalling a tracked repo with uncommitted changes from the dashboard. The dashboard refused such a repo, or one whose git status could not be read, with no way past it. It now says why and asks again, then moves the repo to the trash as it is, like uninstall --force.
  • Executable scripts from content API downloads. When sparse checkout was not available, the GitHub, Gitea and CNB fallbacks wrote every file without the exec bit. A file that starts with #! is now executable.
  • Codex and Gemini agent conversion in ESM projects. In a project whose package.json sets "type": "module", the bundled extensions failed with require is not defined. The Sync page now shows a short cause for a failure, with the full output expandable and copyable.
  • Floating action bar. Wide content on the Pi and Oh My Pi pending-changes bars no longer wraps out of the bar.