Releases: RunhuaHuang/EasySkills
Release list
EasySkills 4.1.0
目录重构
_maintenance/→EasySkills维护工具/.engine/(双层布局),可见入口EasySkills维护工具/{macOS,Windows}/链回隐藏的.engine/launchers/- 备份/运行时目录改名:
_maintenance.bak→.maintenance-bak,_runtime→.runtime
安装/升级硬化(Bug 修复)
- [安全]
.gitignore规则现匹配真实.engine路径,WebUI 认证 token 不再可能被误提交 - [Windows] 三个
.bat(安装/卸载/启动器卸载)通配符".EasySkills*"(带前导点)永不匹配真实目录名 → 安装与卸载静默失效,已修复通配符与双层.engine解析 - [Windows]
install_windows.bat的ren第二个参数含路径分隔符必失败 → 重构为同父目录 rename + 跨目录move - [Windows]
install.ps1用Rename-Item做.engine → .maintenance-bak轮换,但Rename-Item不跨目录 → 备份落错位置、回滚不可达,改用Move-Item - [Windows] 严重:
deploy.ps1、webui.ps1、watcher-service.ps1、install-gateway.ps1、watch.ps1计算 CentralDir 时只上溯一层(=EasySkills维护工具/),但 skill 文件夹在两层之上 → Windows 上 skill 同步扫不到任何东西、FileSystemWatcher 监视错目录、Gateway 二进制路径错位。五个脚本全部改为上溯两层,与deploy.sh的$SCRIPT_DIR/../..对齐 - [macOS]
install_mac.command引用废弃的A-程序控制/(实际是launchers/)且缺失可见入口文件夹创建,已修复
国内镜像加速
install.sh/install.ps1/install-gateway.sh/install-gateway.ps1全部加入多源回退:先试 GitHub 原生,失败/超时自动切ghfast.top→gh-proxy.com→github.moeyy.xyz- 支持
EASYSKILLS_MIRROR环境变量强制指定镜像 - README 补充国内加速版安装命令
验证
全部 124 项 Python 契约测试 + Go 单元测试通过。
Full Changelog: v4.0.3...v4.1.0
EasySkills 4.0.3
EasySkills 4.0.3
A polish release hardening the MCP Gateway, the Windows WebUI backend, and
the contract test suite. All changes are backward-compatible. All 120 Python
security/contract tests and all Go unit and end-to-end routing tests pass.
MCP Gateway: Config Hot-Reload
- The
servecommand now polls the config file for changes every 2 seconds
using a SHA-256 content hash and calls the newRouter.ReloadAPI on
change, updating downstream connections and tool registrations without
restarting the process.
MCP Gateway: Core Improvements
Router.ReloadAPI. Adds, removes, and reconfigures downstream servers
in-place while the gateway is running. Servers whose config has not changed
are reused unchanged; removed servers are cleanly shut down.- Tool-name deduplication.
resolveToolNameresolves the clean original
name first and falls back to a namespacedserver__toolform only on
collision, then appends a counter for further collisions. Previously all
names were namespaced unconditionally. - Rollback on discover error. Partially registered tools are removed from
the routing table whenListToolspagination fails mid-stream, preventing
phantom tool routes. - Input/output schema validation.
validateToolDefinitionrejects tools
whoseinputSchemaoroutputSchemais not a JSON object, preventing
routing of tools that downstream clients cannot safely introspect. downstream.cfgfield. Each active session now stores its originating
ServerConfigsoReloadcan detect unchanged servers and skip
reconnection.- Process resource cleanup (Windows).
Test-MCPGatewayinwebui.ps1
now wraps the helper process in afinallyblock that callsDispose(),
preventing handle leaks.
Windows WebUI (webui.ps1)
- MCP version integer check.
Test-MCPConfigpreviously accepted
floating-pointversionvalues (e.g.1.0) as valid. The check now
requires a strict[int]or[long], matching the JSON schema intent. - Historical-target cleanup.
Remove-InstructionsFromOnefalls back to
the instruction state file for custom Agent paths that were removed from the
current configuration after EasySkills wrote instructions to them, ensuring
bulk cleanup reaches all previously managed targets.
Validation
- 2 new Python contract tests cover the PowerShell MCP version integer check
and the historical-target cleanup path inRemove-InstructionsFromOne. - 2 new Go unit tests cover
resolveToolNamecollision semantics and
validateToolDefinitionschema rejection. - 1 new Go integration test (
TestGatewayReload) exercises the full
Router.Reloadlifecycle: config-unchanged fast-path, tool-timeout change,
server addition, and server removal.
v4.0.2
chore: remove default mcp servers to keep servers config empty by def…
v4.0.1
chore: replace context7 with prismstudio and visionpower as default M…
v4.0.0
fix: conditional posix file permission check on windows for config_test
EasySkills 3.2.1
A patch release completing the post-3.2.0 audit with additional data-safety,
concurrency, update, and failure-path hardening across macOS, Linux, and
Windows. All changes are backward-compatible. All 115 contract tests pass.
Link and User-Data Safety
- Agent links that point to a central skill which is itself an external
symlink/junction are now consistently recognized as EasySkills-owned by
status, unmap, cleanup, and delete operations. - Mapping preserves same-name foreign links instead of silently replacing
user-managed symlinks or junctions. - Windows central external-link skills are deleted non-recursively, preventing
PowerShell 5.1 from traversing into and deleting the real external target. - Every bundled uninstaller now uses Trash/Recycle Bin and refuses to remove
the installation when link cleanup fails.
Concurrency and Failure Reporting
- Explicit
add,remove, andcleanupoperations wait for an in-flight
deploy lock and fail safely on timeout; only duplicate background syncs may
be skipped as success. - Cleanup failures now propagate through shell/PowerShell exit codes so
uninstallers cannot mistake an incomplete cleanup for success. deploy.sh --add/--removereject missing path arguments instead of
entering a non-advancing argument loop.- Disabled-target updates and WebUI token creation are atomic; token creation
also uses a cross-process lock and enforces owner-only permissions.
WebUI and Update Robustness
- Successful self-update/rollback now restarts the backend after delivering
the API response, ensuring the newly installed Python/PowerShell code is
actually loaded. Failed replacement launches keep the old backend alive and
remain retryable. - Release downloads validate both initial and final redirect hosts, enforce
timeouts and compressed/extracted size limits, reject unsafe archive paths,
and guard against archive bombs. - Complete network failure in both the GitHub API and redirect fallback now
returns a structured failure instead of HTTP 500. - Oversized HTTP requests return 413 immediately and close the connection,
preventing unread body bytes from contaminating a subsequent request. - Linux watcher status now checks the persistent systemd path/timer units
instead of the normally-inactive oneshot service. - Empty optional rule libraries no longer produce contradictory failure and
success messages during an otherwise successful skill sync.
Validation
- 115 contract tests pass.
- Ruff static analysis, Python compilation, shell syntax checks, frontend
JavaScript syntax validation, HTTP restart/oversize smoke tests, isolated
sync-cleanup tests, and permission/lock failure injection tests all pass.
EasySkills 3.2.0
EasySkills 3.2.0
A hardening release focused on robustness, data safety, and correctness across
the deploy engine, installers, background supervisors, and the WebUI — the
result of a full multi-round audit. No behaviour or API changes; all fixes are
drop-in. All 98 contract tests pass.
Process Termination Safety (macOS / Linux)
Three sites matched a backend process purely by a webui.py path appearing on
its command line, then force-killed the match. That also matched editors,
greps, and language servers that had the file open — and kill -9 would
destroy unsaved work.
own_webui_pid/stop_own_webui(deploy.sh) andown_webui_pid
(webui-service.sh) now require the matched process to be a Python
interpreter (ps -o comm=basename check) before killing. The uninstaller
(uninstall_mac.command) gained the same guard for bothbash/shand
pythonbackends.
Concurrency (Windows)
- Recover from an abandoned deploy mutex.
deploy.ps1Acquire-Locknow
catchesAbandonedMutexException. Previously, a single force-killed deploy
(Task Manager, hard reboot mid-sync) left the named mutex abandoned, and every
subsequentdeploy.ps1invocation threw the unhandled exception, re-abandoned
the mutex, and bricked all future deploys until a reboot. macOS/Linux already
self-healed via PID-lock recovery; Windows now matches that behaviour.
Data Safety
- Atomic config writes (Windows).
Write-Utf8NoBomindeploy.ps1now
writes to a temp file and atomically moves it over the target, mirroring
deploy.sh's temp+mvpattern. A directWriteAllTexttruncated-then-wrote
custom-targets.txt/disabled-targets.txt, so an interruption could leave
them truncated and silently drop every persisted custom agent path. - Verbatim custom-targets preservation (
install.sh). The installer no
longer round-tripscustom-targets.txtthrough a shell variable
($(cat …)+echo "$VAR"), which mangled paths containing backslashes,
glob characters, or a leading-. It now copies the file verbatim (matching
disabled-targets.txtandwebui.py'sdo_self_update).
Status & Labelling Correctness
deploy.sh --statusno longer false-reports a running watcher.
launchctl listprints-in the PID column for a job that is loaded but not
running; that was reported as✅ Running (PID -). Now treated as not-running,
consistent withget_watcher_statusinwebui.py.- Trae/Trae-CN AppData paths labelled correctly in fallback mode (Windows).
Indeploy.ps1's prefix-basedGet-AgentNamefallback,%APPDATA%\Trae\skills
was shadowed by the broader$Home\prefix and mislabelled "Custom Agent". The
more specific$env:APPDATA\prefix is now tested first, with explicit
Trae\*/Trae-CN\*branches.
Uninstaller Safety (macOS)
- Warn when symlink cleanup fails.
uninstall_mac.commandnow captures the
exit code ofdeploy.sh --cleanup. On failure it prints a clear warning with
a manual-cleanup command before trashing~/EasySkills, so a partial cleanup
no longer leaves dangling symlinks scattered across every agent's skills
directory with no indication.
Installer Reporting (Windows)
- Fix empty version reporting.
install_windows.batreadOLD_VERSION/
NEW_VERSIONwith%VAR%inside the parenthesised install block, where CMD
expands once at parse time — so every install printed an empty version and
upgrades were undetectable. The version report is now emitted after the
block, where the variables hold their real values.
WebUI Supervisor (Windows)
- Don't restart-storm when the port is held by a foreign process.
webui-service.ps1now mirrorswebui-service.sh: when port 6633 responds but
nowebui.ps1from this install owns it, it waits instead of relaunching —
preventing the supervisor from burning through its restart throttle with no
chance of recovery.
WebUI Frontend
- Surface backend failures on read polls.
apiCallpreviously swallowed
network/parse errors for GET routes (/api/status,/api/skills, …) with no
toast, so a dead backend left the dashboard looking alive. GET failures now
show a localised error toast, rate-limited to once per 15 s (with re-announce
after recovery) so the 5 s poller can't spam. - Localise the agent-path-edit error.
saveCustomModalEdit's catch no
longer shows the raw browser error string; it shows a consistent localised
message. - Harden the central XSS boundary.
escapeHtmlnow coercesnull/
undefined/ non-strings to''(viaString(text)), so a future optional
backend field rendered without a|| ''guard can't throw and break the
entire render loop.
Validation
- All 98 contract tests pass (version/agent-count assertions derive from
_maintenance/.versionandagents.json, so they stay green on release).
EasySkills 2.2.0 — Reparse-Point Safety & Update Atomicity
EasySkills 2.2.0
Data Safety (Windows)
Two critical issues in deploy.ps1 that could cause permanent loss of the
central skill library on Windows PowerShell 5.1 have been fixed.
- Never delete link-target contents. All four junction-removal sites
previously usedRemove-Item -Recurse -Force, which on a directory junction
can traverse into and delete the real contents of the link target. Now
every reparse point is removed with[System.IO.Directory]::Delete(path, $false)— the link itself only, never its target. - Detect and replace dangling junctions.
Test-Pathfollows reparse
points, so a dangling junction (target removed) reportedFalseand was
skipped — thenNew-Itemfailed because the dead link still occupied the
name, silently leaving that skill unmapped for that agent. Now uses
Get-Item -Force(attributes), which sees the entry regardless of whether
its target exists. This closes a cross-platform parity gap:deploy.sh
already handled this correctly with[ -e ] || [ -L ].
Update & Rollback Atomicity (macOS + Windows)
The self-update and rollback rename rotations could, in a narrow failure
window, destroy the currently-running version or brick every subsequent
rollback. Both backends are now hardened.
- Self-update rollback no longer destroys the current version. When the
second rename (new → current) failed after the first (current → .bak)
succeeded, the old recovery code didrmtree(_maintenance.bak)— which at
that point held the running version. The recovery now undoes the first
rename (moves.bakback to current) and restores the pre-existing backup
snapshot. - Rollback pre-cleans
.prevand recovers from failure. A stale
_maintenance.prevleft by a prior failed rollback made every subsequent
rollback fail forever (POSIXrenamerefuses to overwrite an existing
directory). Now.previs pre-cleaned, and if the second rename fails the
current version is restored from.prev. - Self-update validates the download host (Windows).
webui.ps1
Run-SelfUpdatenow rejects download URLs whose host is not a trusted
GitHub delivery host, matching thewebui.py
_is_github_download_urlguard that already existed on macOS/Linux.
Robustness
Run-DeployCommandno longer deadlocks on large output (Windows).
Reading both stdout and stderr synchronously viaReadToEnd()deadlocks
when the child fills the OS pipe buffer (~64 KiB) on one stream while we
block on the other. Now usesReadToEndAsync()so the 30 s timeout is
effective and both buffers drain concurrently.- Token loader recovers from a corrupt token file (macOS/Linux). A prior
interrupted write could leave the token file existing-but-empty; the
O_CREAT | O_EXCLpath could never replace it, raisingRuntimeErrorin a
loop across restarts and bricking startup. A persistently-invalid file is
now reclaimed (unlinked and recreated).
Agent Support
- Add MiniMax Code as the 43rd supported agent target:
- macOS/Linux:
~/.mavis/skills - Windows:
%USERPROFILE%\.mavis\skills
- macOS/Linux:
Validation
- Agent-path and version assertions now derive from
agents.json/
_maintenance/.version(single sources of truth) so they never go stale on
release — the root-cause fix for the stale-version-assertion bug seen in
2.1.0. - 8 new contract tests guard each fix above (reparse-point non-recursive
delete, attribute-based dangling detection, download-host allowlist,
self-update rollback undo, rollback.prevpre-clean + recovery, async
stream reads, corrupt-token reclaim). - All 66 tests pass.
⚠️ Windows users: This release fixes two critical data-loss bugs indeploy.ps1. If you have been running 2.1.0 on Windows, update as soon as possible. The PowerShell-side fixes are validated via contract tests and code review against PS 5.1 semantics, but a full smoke test on a real Windows machine is recommended.
EasySkills 2.1.0 - Link-Health Diagnostics
EasySkills 2.1.0
Link-Health Diagnostics (new)
A broken (dangling) symlink in the central skill library — its target removed
by the user — used to be invisible to EasySkills and, worse, could be forwarded
into every agent's skills directory. Some agents (e.g. older Run builds) abort
their entire skill scan the moment they stat a dead link, silently dropping
every skill sorted after it. This release makes that whole failure mode visible
and self-healing.
- Auto-prune dangling links on sync.
deploy.sh/deploy.ps1now scan the
central directory before mapping and automatically remove any symlink whose
target no longer exists, with a clear log line per pruned link and a summary
count. Dangling links are dead data (their target is gone), so pruning is
loss-free and stops the broken link from ever reaching an agent. - Flag external-link skills as fragile. A skill that is itself a valid
external symlink is still forwarded (backward compatible) but is now flagged
with a warning and surfaced in the sync summary, nudging you to convert it to
a real directory so a single target deletion can't cascade across agents. --statuslink-health snapshot. The status command now reports a read-only
Link health: N dangling (run sync to prune), M externalline, so problems
can be previewed without running a sync.
WebUI
- Skills that are external symlinks now show a
⚠ External Linkwarning badge
(amber accent) on the Skills tab, with the card border and icon recoloured. - The dashboard shows a link-health advisory banner whenever the central library
has dangling or external-link skills, with a one-line summary and a pointer to
the Skills tab.
API
GET /api/statusnow includesdangling_countandexternal_link_count
(both macOS/Linux and Windows backends).GET /api/skillsnow includes anis_external_linkboolean per skill
(both backends). The frontend degrades gracefully if an older backend omits it.
Validation
- Add 5 new regression tests covering link-health semantics: external-link
detection and dangling exclusion inget_skills(), dangling/external counting
inget_central_dir_warnings(), missing-central-dir handling, cross-backend
field-name contracts, and that the sync logic prunes dangling symlinks.
EasySkills 2.0.1 - Authenticated WebUI APIs and Qoder CN Support
EasySkills 2.0.1
Security
- Protect all local WebUI
GET /api/*endpoints with the same token gate used by write APIs, including macOS/Linux and Windows backends. - Keep frontend reads compatible with the stricter API by sending
X-EasySkills-Tokenfor dashboard, skills, agents, and update-check requests. - Preserve token-refresh retry behavior when the browser has a stale WebUI token.
Fixes
- Fix
unwatch.shso non-standard installation paths are handled correctly when waiting for or terminating an in-flightdeploy.sh. - Ignore runtime
_maintenance.bak/self-update backup directories in git. - Avoid a full agent-link rebuild when deleting a single skill from the WebUI; only that skill's symlinks are removed.
- Add an explicit
EASYSKILLS_CENTRAL_DIRoverride for predictable multi-install WebUI directory selection.
Agent Support
- Add QoderWork CN target support:
- macOS/Linux:
~/.qoderworkcn/skills - Windows:
%USERPROFILE%\.qoderworkcn\skills
- macOS/Linux:
- Add Qoder CN target support:
- macOS/Linux:
~/.qoder-cn/skills - Windows:
%USERPROFILE%\.qoder-cn\skills
- macOS/Linux:
- Update the GitHub README and system reference to show all 42 built-in targets.
Validation
- Expand the security contract suite to cover authenticated GET APIs, frontend token headers, dynamic
unwatch.shpath handling, backup ignore rules, and the new agent paths.