Repository navigation
Releases: runkids/skillshare
Release list
v0.26.0
skillshare v0.26.0 Release Notes
TL;DR
- Keep per-Agent MCP settings in one source, and edit them in the dashboard.
- Serve skills to Executor from the same HTTP server as your MCP tools.
- Store hook code and scripts in files next to the config instead of inside YAML.
- OMP plugins install the OMP build, even when a repository also ships a Claude build with the same name.
Per-Agent MCP settings
A server's options map holds native fields that do not have a portable equivalent. Sync writes each block only to its Agent, including that Agent's account targets:
mcp:
servers:
docs:
url: https://example.com/mcp
targets: [codex, claude]
options:
codex:
default_tools_approval_mode: approve
claude:
timeout: 600000The dashboard's Other Agent settings editor accepts one JSON object per Agent. Pi keeps its existing piOptions block.
Fields already managed by portable settings are refused. Credentials must be whole-value environment references in syntax the receiving Agent supports; plaintext credentials are refused. Options for an Agent the server does not reach stay in the source without being written. Dropping an option removes the field on the next sync unless it has changed in the Agent's file, in which case sync reports a conflict.
Serve skills to Executor
mcp serve --http now publishes an Executor-compatible skill index at /.well-known/agent-skills/index.json and serves the files listed in it:
skillshare mcp serve --http 127.0.0.1:8765
skillshare mcp serve --checkExecutor apps can load it with wellKnownSkills. File changes update the index versions, so Executor picks up edits on its next check without a commit or push. --check reports the skills, files and bytes served and explains why a skill was left out.
The index leaves out skills Executor cannot load, including binary files and files over 2 MB. The index uses the MCP server's bearer token when configured. That token also grants access to the MCP tools, including editing when enabled; use a separate mcp serve without mcp.serve.edit for a read-only connection.
Non-loopback serving requires a token and TLS. Executor refuses private and loopback addresses by default: Cloud needs a public address, and self-hosted operators must explicitly enable private fetches. The Executor host must be able to reach the server and trust its certificate; redirects are refused.
Hook code and scripts in files
Use codeFile instead of inline extension code, or {from: path} for a script in files:
hooks:
entries:
lint:
bindings:
pi:
codeFile: hooks/lint.pi.ts
cursor:
events:
afterFileEdit:
- command: .cursor/hooks/skillshare/lint/lint.sh
files:
lint.sh: { from: hooks/lint.sh }Paths resolve against the folder of the config that owns the entry: .skillshare/ in a project, or the global config's folder for hooks.projects. Even with hooks add|edit --file, they are relative to the selected config, not the entry file. Paths must stay inside that folder without passing through symlinks.
Edit the files and run hooks sync. A missing file stops config loading; a file changed after a preview makes the apply stale. Saving an entry preserves references; editing code or scripts in the dashboard stores the edit inline.
YAML entry files also keep the final newline of a trailing code: | block. Extensions written from those files no longer lose the newline expected by formatters; JSON entry files were unaffected.
OMP marketplace builds
When a repository ships same-named OMP and Claude plugins, adding the plugin to OMP now selects its .omp-plugin/marketplace.json build. This includes extension-only package.json manifests using omp.extensions or the compatible pi.extensions field.
Claude catalog fallback applies only when there is no OMP catalog. A broken catalog or missing native entry no longer silently installs the Claude build. An explicit catalog version reaches the native install, and discovery and dashboard previews show the selected build's path, version and components instead of combining unrelated metadata.
Thanks to @salmonumbrella for reporting the wrong-build installation (#587).
Dashboard shortcuts
- Keep all local and Keep all remote select a whole-file resolution for every pull conflict. You can still override files individually before Apply choices and pull. Selecting a side alone writes nothing.
- Update to latest on memory guidance opens the existing connection review with all outdated tools selected and their read/write modes preserved. You review and apply the changes; modified guidance blocks stay untouched.
v0.25.13
skillshare v0.25.13 Release Notes
TL;DR
mcp servecan edit the skills you list. An Agent previews the full diff and audit result, then saves exactly that preview. Editing stays off until you list skills.list_skillsandread_skillare marked read-only, so clients that ask before tools that change data stop asking for them.
Edit skills over mcp serve
An Agent that reaches your skills only through mcp serve could read them but had to hand every change back to you. Skills you list in mcp.serve.edit.skills can now be changed one existing file at a time:
mcp:
serve:
edit:
skills: [pdf, _team__*] # flat names, matched like a target's include
preview_ttl: 30m # how long a preview can be applied; default 30mThe server then offers two more tools:
preview_skill_edittakes a file, the revision the Agent read, and the complete new content. It writes nothing and returns the full diff, the audit findings and a preview id.apply_skill_edittakes only that preview id and saves exactly what was previewed, once. It is markeddestructiveHint, so a client that asks before such tools asks you.
An edit is refused, and nothing is written, when:
- the skill is not listed, sits in a tracked repo, or was installed from upstream, since
updatewould overwrite the change; - the file changed after it was read or previewed;
- the skill would fail validation, or the file is not UTF-8 text;
- the audit finds something at or above
audit.block_threshold. As withinstall, a finding you accepted withinstall --forcedoes not block, and each finding is marked new or existing so you can see what the edit adds; - the preview is older than
preview_ttl, was already applied, or the server restarted.
An edit cannot create, delete or rename files. Each save goes to the operations log and each audit to skillshare log --audit. Targets get the change on the next sync. skillshare mcp serve --check reports how many served skills are editable.
Thanks to @salmonumbrella for proposing safe skill editing over MCP (#540).
Read-only skill tools
Clients and gateways that gate tools by annotation treat a tool without readOnlyHint as one that changes data, so every list_skills or read_skill call could stop for approval. Both tools are now marked read-only and are called without asking.
Contributors
v0.25.12
skillshare v0.25.12 Release Notes
TL;DR
- Git tokens no longer show up in
ps. A token fromGITHUB_TOKENor another token variable now reaches git through a credential helper, never through process arguments. update --allleaves unchanged skills alone. Skills already at the upstream commit are counted as up to date instead of being reinstalled on every run.updatereports a repository it cannot fetch, and updates skills whose symlinked files changed upstream.- An open dashboard keeps working after
upgrade.
Fixed: git tokens visible in ps
A token from GITHUB_TOKEN, GITLAB_TOKEN, BITBUCKET_TOKEN, AZURE_DEVOPS_TOKEN, GITEA_TOKEN, CNB_TOKEN or SKILLSHARE_GIT_TOKEN was written into the clone URL that git hands to its HTTPS helper. Any user on the machine could read it with ps while a clone or fetch ran.
- git now gets the token from a credential helper scoped to the host. The token stays in the git process's environment and never appears in an argument list.
- While a token applies to a host, git no longer asks your own credential helper or keychain for that host, and stores nothing there.
Thanks to @masonc15 for reporting it (#565).
Fixed: update --all reinstalls every skill
Grouped updates reinstalled every skill on every run and reported each one as updated. The up-to-date check read per-skill metadata files that the move to .metadata.json had removed, so it never matched.
skillshare update --all # unchanged skills are counted as up to date
skillshare update --all --force # reinstall every skill- A skill already at the upstream commit, or whose folder did not change, is skipped and counted as up to date: in the summary, as
up_to_datein--json, and in the operations log. - This applies to
--all,--group, and several skills named with-p. A single skill, and skills named in global mode, are still always reinstalled. --forcereinstalls every skill anyway.
Thanks to @masonc15 for reporting and fixing it (#564, #569).
Fixed: a repository that cannot be fetched goes unreported
When update --all or --group could not clone a repository, its skills were counted as skipped with no explanation, which hid a repository that failed on every run. update now prints a warning that names the repository and the git error. Credentials in the URL, including query tokens, are removed from both. Thanks to @masonc15 (#570).
Fixed: skills with symlinks miss updates
A skill folder can hold a symlink to a file elsewhere in its repository. Install copies the target's content, but the folder's git tree hash ignores it, so after the target changed update skipped the skill and check reported it up to date.
A skill whose folder contains a symlink is now compared by commit: update reinstalls it whenever the upstream commit moves, and check reports an update (#572).
Fixed: the open dashboard breaks after upgrade
upgrade pre-downloads the new version's UI assets and removed every other cached version, including the one a running skillshare ui server still loads pages from, so navigating the open dashboard broke. The pre-upgrade version's assets are now kept as well. Restart the UI server between upgrades: a second upgrade without a restart can still remove the oldest server's assets.
Contributors
v0.25.11
skillshare v0.25.11 Release Notes
TL;DR
- Unpinned MCP servers are flagged.
mcp checkwarns when a local server starts a package or image without an exact version, so a compromised release cannot reach your machine on the next Agent launch unnoticed. - Changed MCP tools are flagged.
mcp check --liverecords each server's tool definitions and warns when a description or input schema changes, or a new tool appears, until you accept it. - Backup cleanup frees space an interrupted backup left behind.
skillshare listshows every Agent a skill or agent is synced to, in any sync mode or naming.
New: warn about unpinned MCP servers
A server launched with npx, uvx or pipx run downloads its code at every start. Without an exact version, every Agent launch can run a release you have never seen. mcp check now names these servers:
skillshare mcp checknpx,uvxandpipx runwarn when a package has no exact version: none,latest, a dist-tag such asnext, a range such as^1.2, or a==1.*wildcard. Every npx--packageand uvx--withpackage is checked.docker runandpodman runwarn on an image with no tag orlatest. An image pinned by tag but not by@sha256:digest is a note, since a tag can move.- It reads only
commandandargs; nothing is downloaded or started. - The warning also shows in
doctorand on the dashboard's MCP page. It is a warning only: sync and the Agents keep working, and the exit code does not change. To clear it, write the exact version, such as@playwright/mcp@0.0.83.
New: detect MCP tool definitions that change
An Agent reads a tool's description as instructions, and a server can change it after you trusted it (a "rug pull"). mcp check --live now records a hash of each tool's name, description and input schema the first time a server answers, and compares every later probe with it:
skillshare mcp check --live # pins tools on the first run
skillshare mcp check docs --live --accept-tools -g # accept docs' current tools- A changed description or schema, or a new tool, is a warning that repeats until you run
--accept-tools. A removed tool is a note. - Only hashes are stored, in
mcp/tool-pins.jsonof the state directory. A check without--livenever reads or writes them. - Each
--accept-toolsis written to the operations log (skillshare log) with the servers it accepted. - It works for local and remote servers, so it also covers remote servers that have no version to pin.
Fixed: backup cleanup misses interrupted backups
A backup interrupted mid-copy left a hidden .snapshot-* directory that backup --cleanup never found, so it kept using disk space. Cleanup now removes these, even when there are no completed snapshots, and --cleanup --dry-run lists them. A backup still being written is skipped and reported as busy. Thanks to @aleps001 for reporting it (#556).
skillshare backup --cleanup --dry-runFixed: the list detail panel misses Agents
The Targets row in the skillshare list detail panel showed only Agents linked in merge mode with flat names. It now also lists Agents that receive the skill in copy or symlink mode or under standard or prefixed naming, and an agent's detail panel shows its Agents for the first time. A target with skills turned off, or a skill you disable with t, no longer lists a target.
v0.25.10
skillshare v0.25.10 Release Notes
TL;DR
- Open an Agent's MCP config folder from the dashboard. Each detected Agent on the MCP page has Open folder next to Open in editor and Copy path, so any program can open the file without setting
$EDITOR. - A project's MCP files on its MCP tab. Projects → project → MCP now lists that project's Agent files with the same buttons.
New: Open folder on the MCP page
0.25.9 added Open in editor, which picks $VISUAL or $EDITOR, then an installed GUI editor, then the system default. To use an editor of your own choice, such as Notepad++ when VS Code is also installed, you had to set $EDITOR.
Open folder skips that. It opens the folder that holds the Agent's MCP config file, such as opencode.json or .cursor/mcp.json, in the file manager: Finder on macOS, File Explorer on Windows, the default handler on Linux. Open the file from there in any program.
- Before the Agent has written its file, it opens the closest folder that exists, so the button also shows for an Agent detected only by its settings folder.
- Like Open in editor, it starts on the machine running the dashboard, so it shows only when the browser runs there too: at
localhostor through SSH port forwarding, not through a LAN address or a reverse proxy. SKILLSHARE_HEADLESS=1refuses it, as it refuses the editor.
New: a project's MCP files on its MCP tab
On the Projects page, each project's MCP tab now has an Agents list on the right. It shows:
- the project's Agents,
- the Agents its own servers go to, even before the first sync writes their files,
- any other Agent whose file is already in the project.
Each row shows the file name and Copy path. On the dashboard's machine it also has Open folder and, once the file exists, Open in editor. A viewer elsewhere still sees the list and can copy paths.
v0.25.9
skillshare v0.25.9 Release Notes
TL;DR
- Open an Agent's MCP file from the dashboard. The MCP page has an Open in editor button for each detected Agent's config file.
- Commands keep YAML anchors, aliases and merge keys in
config.yaml. Askillshare targetedit no longer expands&shared/*sharedor<<: *base. sync -pno longer rewrites the project config when nothing moved. A stale record could pull every remote install in a shared source into the project'sskills:list.- Pi extension rules that depend on the Pi version show as unknown, and Open in editor accepts a quoted editor path in
$EDITOR.
New: open an Agent's MCP file from the MCP page
Each detected Agent on the dashboard's MCP page now has Open in editor next to Copy path. It opens that Agent's MCP config file, such as opencode.json or .cursor/mcp.json, with the same editor a skill's Open in editor uses: $VISUAL or $EDITOR, then an installed GUI editor, then the system default.
- The button shows only for files that exist.
- The editor starts on the machine running the dashboard, so the button shows only when the browser runs there too: at
localhostor through SSH port forwarding, not through a LAN address or a reverse proxy.
Fix: anchors, aliases and merge keys survive config writes
0.25.5 made commands keep the comments in config.yaml. Anchors were still expanded. After this, with the config below, b got its own copy of the list and stopped following a:
skillshare target a --add-exclude 'old-*'targets:
a:
skills:
path: /tmp/a
include: &shared
- demo
b:
skills:
path: /tmp/b
include: *sharedAnchors and aliases under targets and projects are now kept, and so are merge keys:
targets:
claude:
skills: ©
path: ~/.claude/skills
mode: copy
cursor:
skills:
<<: *copy
path: ~/.cursor/skills- Editing the anchored value still reaches every alias and every mapping that merges it, including a key added to or removed from it.
- A command that changes only an aliased or merged copy gives that copy its own value and leaves the anchor alone.
- Comments on aliases and merge-list items are kept.
- Still written out in full: a merge source written inline without an anchor (
<<: {a: 1}) and anchors defined inside one.
Fix: sync -p leaves the project config alone when nothing moved
Since 0.25.5, sync looks for skills you moved by hand. In project mode, a .metadata.json record whose folder you deleted started that search, and the search then added every remote install in the source folder to the project's skills: list, .gitignore and skills.lock.json. This hit projects whose skillshare/skills folder is also the global source.
Sync now writes entries only for skills it actually found moved. When none moved, the three files are not touched.
Fix: Pi extension rules that depend on the Pi version
Pi 1.2.0 rewrites some resource-filter patterns before matching, while older Pi compares them as written:
Skillshare cannot tell which Pi reads the rules, so the dashboard's Pi extensions list now marks an extension decided by such a pattern as unknown and names the pattern, instead of guessing whether it loads. Exact rules also follow Pi's normalization now: a leading .\ is dropped, and \ becomes / on Windows.
Fix: quoted editor path in $EDITOR
Open in editor now accepts a quoted path with spaces in $VISUAL or $EDITOR, so an editor that is not on PATH works on Windows:
$env:EDITOR = '"C:\Program Files\Notepad++\notepad++.exe"'v0.25.8
skillshare v0.25.8 Release Notes
TL;DR
- Oh My Pi plugins install from GitHub and other Git sources on macOS. 0.25.7 accepted newer OMP versions, but on macOS every Git-source install to OMP was still refused.
Bug fix: OMP installs from Git sources on macOS
On macOS, adding a plugin from a Git source to Oh My Pi failed with:
The reviewed OMP runtime destination must be verified empty. Nothing was installed or replaced.
The runtime destination was not the problem. Skillshare clones the source into the system temp folder, which on macOS sits under /var, a link to /private/var. The OMP install check refuses any linked folder on the path, and it refused Skillshare's own temp clone. A local plugin folder under a linked parent folder was refused the same way.
Sources are now read through their real path, so this works again:
skillshare plugin add https://github.com/ayghri/i-have-adhd --target omp -g- Links inside a plugin source are handled as before.
- The source recorded in your config does not change.
- Linux was not affected, because
/tmpis not a link there.
v0.25.7
skillshare v0.25.7 Release Notes
TL;DR
- Oh My Pi plugins install, remove and select extensions on any OMP 18.6.1 or later, not only on exactly 18.6.1.
- The plugin update dialog keeps long plugin names readable when a plugin goes to several Agents.
Bug fix: OMP releases after 18.6.1 were refused
Skillshare pinned Oh My Pi to exactly 18.6.1. On any newer release, such as 18.8.7, adding a plugin to OMP failed with:
Installation requires OMP 18.6.1, a reviewed source and a verified cache root. Nothing was changed.
Removing an OMP plugin and editing standalone extension selection were blocked the same way.
The version check is now a minimum: any OMP 18.6.1 or later is accepted.
skillshare plugin add ./my-plugin --target omp -g
skillshare plugin remove my-plugin --target omp -g- The OMP sources these features rely on (plugin cache, registry,
omp pluginoutput, project anchor, extension loading and the native file lock) are unchanged from 18.6.1 through 18.10.2. Install and removal were also run against a real OMP 18.8.7. - Older, prerelease and unrecognized versions stay blocked, and nothing native is changed.
- Native OMP upgrade stays blocked, as before, because it can replace cache files other projects still use.
Dashboard
- Readable plugin update rows. In the Update N dialog, a plugin installed to several Agents squeezed its name next to the Agent labels and versions. The name now has its own line, Agent labels and
old → newversions wrap, and the row status no longer pushes them aside.
v0.25.6
skillshare v0.25.6 Release Notes
TL;DR
- Updating many plugins from the dashboard runs as one server-side batch, faster and safe to close the page on.
- Shared memory shows on the dashboard, and Memory tools give your agent prompts to try, review and dream over it.
- Turning off a global MCP server in one project works in OpenCode 2, and plugins sync to OpenCode 2.
- An imported Claude plugin updates without a version mismatch error.
- Prefixed naming no longer skips skills whose
name:differs from their folder.
Batch plugin updates
The Update N dialog on the Plugins page used to preview and apply each plugin with its own round trips, clone each source again, and reload the config after every plugin. It now sends the picks to the server in one run:
- Each plugin is previewed once and that plan is applied. Plugins from the same source share one read of it, and the config reloads once at the end.
- Stop after this one lets the plugin under way finish and starts no other. Closing the page does not cut an install short.
- Rows show
old → newper Agent. A row an interrupted run never finished is marked failed. When everything is current, the dialog lists each plugin with its Agent and version. - An Agent whose source moved since the check, or that the check did not show, installs nothing. An npm package in Pi is the exception, since Pi installs whatever npm names latest; it is no longer flagged as moved on every update.
Shared memory
Once memory is created in Extras → Memory, the Dashboard → Memory section shows up to four recently updated notes, and clicking one opens it. Update times come from the note file, so edits made outside Skillshare count too; untouched starter notes are shown apart. The Memory tab shows the note count and latest update, and the browser remembers Expand/Collapse across notes and reloads.
Use with agents → Memory tools, also opened from the dashboard Memory section, copies prompts for your own agent to run:
- Try across sessions writes a test line to
INDEX.md, checks from a fresh conversation that the note is read, then removes the line. - Review this session proposes reusable lessons from corrections and repeated mistakes in the current conversation, after checking existing project docs and checks, ranked by impact.
- Dream compares saved notes across sessions for recurring patterns and for duplicate, stale, contradictory or broken-link notes.
Every change is proposed with paths and before/after text and waits for your approval. Writes go through version-checked Skillshare CLI commands with backups, and the tools stay disabled until the memory source is confirmed. With the updated built-in skill, you can ask your agent to review the session or dream directly. Skillshare never runs, launches or schedules an agent, and never reads private conversation history.
OpenCode 2
OpenCode 2 replaces a global MCP server with the project entry of the same name, and drops an entry without its type and command or url. The {"enabled": false} that Skillshare wrote for a disabled server under mcp.projects was therefore ignored, and the server stayed on.
mcp:
projects:
~/work/app:
servers:
company-docs:
disabled: true
targets: [opencode]- When the global config defines the server, the project entry now also carries its
typeand executable name, or its URL's scheme and host. OpenCode 1 and 2 both read it as off. Args, env, headers and the rest of the URL stay out of the project file, which may be committed. - In project mode, or when the global config does not define the server, only the switch can be written, and
syncsays OpenCode 2 ignores it. - To turn the server back on, remove the
disabledentry and sync. Re-enabling it inside OpenCode starts it with only what the project file holds. - Importing an OpenCode 2 config reads each server in
mcp.serversand skips themcp.timeoutdefaults, instead of listingserversas one broken server.
Plugins sync to OpenCode 2 too. It prints opencode v2.0.27 for --version, which Skillshare did not recognize, so plugin sync to OpenCode 2 was blocked and imported OpenCode plugins were never updated.
Fixes
- Imported Claude plugin updates. Updating a plugin imported from Claude failed with
native update returned version 1.7.1; expected 1.7.0, because the check expected the version recorded at import. The marketplace decides that version, so the update now records what was installed. A plugin added from a reviewed source is still checked against the reviewed version. - Prefixed naming.
target_naming: prefixedrewritesname:in every copy, yet sync skipped a skill whosename:did not match its folder, so a tracked repo that is itself a skill could never sync. Onlystandardnaming requires the match now. The dashboard's skipped-skills hint says whether skills were skipped for their name or for a folder collision. - Sync Now after an update. The Updates tab offers Sync Now only when there are pending changes to sync; existing symlinks already read the updated source. A failed check shows the error with Retry instead of saying everything is up to date.
v0.25.5
skillshare v0.25.5 Release Notes
TL;DR
skillshare movemoves installed skills, or whole folders, to another folder and keeps their install records, so nothing is re-downloaded anduninstall,updateandauditstill know them.- The dashboard can move skills and folders too, with a preview, a clear reason when something is blocked, and a Sync now button at the end.
- The install dialog lets you pick an existing folder or build a new one, and shows the link name you will get.
syncnow adopts a skill you moved withmv, so the old habit keeps working: the record, audit acceptances and lock pin follow on the next sync.- Plugins update in one batch from the dashboard: the page checks on open, and one dialog updates everything that is behind, per Agent, with retry.
Move installed skills and folders
Until now, organizing installed skills into folders meant mv, which left the .metadata.json record at the old path: the next install or Install missing started over, and uninstall could not find the skill. skillshare move renames the folder and carries the record, the accepted audit findings, the project lockfile pin and config.yaml group, the project .gitignore line and a literal .skillignore line along with it.
skillshare move react-best-practices frontend # one skill into frontend/
skillshare move pdf docx office # several skills
skillshare move frontend archive # a whole folder -> archive/frontend/
skillshare move archive/old-skill . # back to the source root
skillshare move react-best-practices frontend -n # preview
skillshare sync # rename the links in your targets- A move never syncs; it tells you to run
skillshare sync.--jsonreports each name with a stableerror_code, and-pworks in project mode. - Everything is checked before anything is renamed, and a folder moves whole or not at all. A skill or folder inside a tracked repo or below a followed source link is refused, as is a destination inside a skill or a tracked repo. A short name that matches several skills asks for the full path.
- A target name collision needs
--force. A targetinclude/excluderule that decides differently for the new flat name is warned about, in either direction;config.yamlis not changed. install --intonow refuses a folder inside a skill or a tracked checkout, with the same codes.
sync adopts a hand-moved skill
If you still reach for mv, the next sync finds the moved copy (same name, files unchanged since install, exactly one such copy) and moves its install record, accepted audit findings and project lock pin to the new path. Before, only install or Install missing did that, so update and uninstall lost the skill after mv + sync. sync never removes a record, and sync --dry-run adopts nothing. A .skillignore line still does not follow; use skillshare move for that.
Bug fix: config.yaml keeps its comments
Every command that wrote the config (target, config set, installing a tracked repo, and the matching dashboard actions) re-encoded the file and dropped its comments. Comments now stay on every key that is still present, so marker blocks such as # BEGIN … / # END … survive a skillshare target universal --mode copy. A comment on a key the command removed moves in front of the next key, so nothing is lost; key order and blank lines are still normalized (#525). registry.yaml keeps its comments the same way.
Dashboard
- Move to folder. Select skills and choose Move to folder…, or open a folder's menu and choose Move whole folder…; the skill page has the same entry. The dialog previews the new paths and link names, blocks a folder move when any item is refused and says why, offers Move anyway only for a name collision, and ends with Sync now.
- Pick an existing folder when installing. The Into folder field lists the source root and every existing folder with its skill count. New folder… opens a step that builds the path and shows the resulting link name before you confirm.
- Update plugins in one batch. The Plugins page checks for updates when it opens and shows
old → newon each row. Update N opens one dialog with every plugin that is behind, ticked by default, per Agent. One button updates the picks in turn with a status per row, Stop after this one, and Retry for the Agents that failed. Imported installs Skillshare cannot update, and sources that no longer provide a compatible plugin, are listed apart. Results update the page, so there is no second check.
