Repository navigation
v0.25.1
skillshare v0.25.1 Release Notes
TL;DR
prependandappendmodes put a shared instruction file inside a tool's own file.doctorwarns about OpenCode only when it loads a skill missing from its own folder, and honors OpenCode's switches.- Installing a git submodule path is refused instead of leaving an empty folder.
- 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:
prependandappendwrite 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 listshows the target asmodifieduntil 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 extrasOn 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.
doctornow 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_CODEorOPENCODE_DISABLE_EXTERNAL_SKILLSis set where skillshare runs,doctor,syncand 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,--trackandupdatewarn about each submodule they skip.- Credentials in a submodule URL are never shown.
Config files
- Symlinked
config.yamland plugins.plugin addandplugin updatereplaced aconfig.yamllinked from a dotfiles folder with a regular file, so the shared config never got the change, and they ignoredpreserve_tilde_on_save. A plugin source spelled with~also madeplugin updatefail with "snapshot ownership conflict". - Project config boundary. A cloned project could link
.skillshare/config.yaml, or itssources.mcpfile, 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 --visibleprojects in the dashboard. The dashboard looked only for.skillshare/config.yaml, so a project inskillshare/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,logor a skill'skindas 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.jsonsets"type": "module", the bundled extensions failed withrequire 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.