Skip to content

Releases: RunhuaHuang/EasySkills

EasySkills 4.1.0

Choose a tag to compare

@RunhuaHuang RunhuaHuang released this 08 Aug 06:40

目录重构

  • _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.batren 第二个参数含路径分隔符必失败 → 重构为同父目录 rename + 跨目录 move
  • [Windows] install.ps1Rename-Item.engine → .maintenance-bak 轮换,但 Rename-Item 不跨目录 → 备份落错位置、回滚不可达,改用 Move-Item
  • [Windows] 严重: deploy.ps1webui.ps1watcher-service.ps1install-gateway.ps1watch.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.topgh-proxy.comgithub.moeyy.xyz
  • 支持 EASYSKILLS_MIRROR 环境变量强制指定镜像
  • README 补充国内加速版安装命令

验证

全部 124 项 Python 契约测试 + Go 单元测试通过。


Full Changelog: v4.0.3...v4.1.0

EasySkills 4.0.3

Choose a tag to compare

@RunhuaHuang RunhuaHuang released this 13 Jul 15:19

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 serve command now polls the config file for changes every 2 seconds
    using a SHA-256 content hash and calls the new Router.Reload API on
    change, updating downstream connections and tool registrations without
    restarting the process.

MCP Gateway: Core Improvements

  • Router.Reload API. 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. resolveToolName resolves the clean original
    name first and falls back to a namespaced server__tool form 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 when ListTools pagination fails mid-stream, preventing
    phantom tool routes.
  • Input/output schema validation. validateToolDefinition rejects tools
    whose inputSchema or outputSchema is not a JSON object, preventing
    routing of tools that downstream clients cannot safely introspect.
  • downstream.cfg field. Each active session now stores its originating
    ServerConfig so Reload can detect unchanged servers and skip
    reconnection.
  • Process resource cleanup (Windows). Test-MCPGateway in webui.ps1
    now wraps the helper process in a finally block that calls Dispose(),
    preventing handle leaks.

Windows WebUI (webui.ps1)

  • MCP version integer check. Test-MCPConfig previously accepted
    floating-point version values (e.g. 1.0) as valid. The check now
    requires a strict [int] or [long], matching the JSON schema intent.
  • Historical-target cleanup. Remove-InstructionsFromOne falls 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 in Remove-InstructionsFromOne.
  • 2 new Go unit tests cover resolveToolName collision semantics and
    validateToolDefinition schema rejection.
  • 1 new Go integration test (TestGatewayReload) exercises the full
    Router.Reload lifecycle: config-unchanged fast-path, tool-timeout change,
    server addition, and server removal.

v4.0.2

Choose a tag to compare

@github-actions github-actions released this 13 Jul 12:50
chore: remove default mcp servers to keep servers config empty by def…

v4.0.1

Choose a tag to compare

@github-actions github-actions released this 13 Jul 12:43
chore: replace context7 with prismstudio and visionpower as default M…

v4.0.0

Choose a tag to compare

@github-actions github-actions released this 13 Jul 12:28
fix: conditional posix file permission check on windows for config_test

EasySkills 3.2.1

Choose a tag to compare

@RunhuaHuang RunhuaHuang released this 13 Jul 05:53

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, and cleanup operations 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 / --remove reject 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

Choose a tag to compare

@RunhuaHuang RunhuaHuang released this 12 Jul 14:21

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) and own_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 both bash/sh and
    python backends.

Concurrency (Windows)

  • Recover from an abandoned deploy mutex. deploy.ps1 Acquire-Lock now
    catches AbandonedMutexException. Previously, a single force-killed deploy
    (Task Manager, hard reboot mid-sync) left the named mutex abandoned, and every
    subsequent deploy.ps1 invocation 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-Utf8NoBom in deploy.ps1 now
    writes to a temp file and atomically moves it over the target, mirroring
    deploy.sh's temp+mv pattern. A direct WriteAllText truncated-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-trips custom-targets.txt through 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.txt and webui.py's do_self_update).

Status & Labelling Correctness

  • deploy.sh --status no longer false-reports a running watcher.
    launchctl list prints - 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 with get_watcher_status in webui.py.
  • Trae/Trae-CN AppData paths labelled correctly in fallback mode (Windows).
    In deploy.ps1's prefix-based Get-AgentName fallback, %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.command now captures the
    exit code of deploy.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.bat read OLD_VERSION /
    NEW_VERSION with %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.ps1 now mirrors webui-service.sh: when port 6633 responds but
    no webui.ps1 from 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. apiCall previously 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. escapeHtml now coerces null /
    undefined / non-strings to '' (via String(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/.version and agents.json, so they stay green on release).

EasySkills 2.2.0 — Reparse-Point Safety & Update Atomicity

Choose a tag to compare

@RunhuaHuang RunhuaHuang released this 11 Jul 05:56

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 used Remove-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-Path follows reparse
    points, so a dangling junction (target removed) reported False and was
    skipped — then New-Item failed 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 did rmtree(_maintenance.bak) — which at
    that point held the running version. The recovery now undoes the first
    rename (moves .bak back to current) and restores the pre-existing backup
    snapshot.
  • Rollback pre-cleans .prev and recovers from failure. A stale
    _maintenance.prev left by a prior failed rollback made every subsequent
    rollback fail forever (POSIX rename refuses to overwrite an existing
    directory). Now .prev is 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-SelfUpdate now rejects download URLs whose host is not a trusted
    GitHub delivery host, matching the webui.py
    _is_github_download_url guard that already existed on macOS/Linux.

Robustness

  • Run-DeployCommand no longer deadlocks on large output (Windows).
    Reading both stdout and stderr synchronously via ReadToEnd() deadlocks
    when the child fills the OS pipe buffer (~64 KiB) on one stream while we
    block on the other. Now uses ReadToEndAsync() 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_EXCL path could never replace it, raising RuntimeError in 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

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 .prev pre-clean + recovery, async
    stream reads, corrupt-token reclaim).
  • All 66 tests pass.

⚠️ Windows users: This release fixes two critical data-loss bugs in deploy.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

Choose a tag to compare

@RunhuaHuang RunhuaHuang released this 24 Jun 15:42

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.ps1 now 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.
  • --status link-health snapshot. The status command now reports a read-only
    Link health: N dangling (run sync to prune), M external line, so problems
    can be previewed without running a sync.

WebUI

  • Skills that are external symlinks now show a ⚠ External Link warning 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/status now includes dangling_count and external_link_count
    (both macOS/Linux and Windows backends).
  • GET /api/skills now includes an is_external_link boolean 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 in get_skills(), dangling/external counting
    in get_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

Choose a tag to compare

@RunhuaHuang RunhuaHuang released this 20 Jun 14:45

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-Token for dashboard, skills, agents, and update-check requests.
  • Preserve token-refresh retry behavior when the browser has a stale WebUI token.

Fixes

  • Fix unwatch.sh so non-standard installation paths are handled correctly when waiting for or terminating an in-flight deploy.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_DIR override for predictable multi-install WebUI directory selection.

Agent Support

  • Add QoderWork CN target support:
    • macOS/Linux: ~/.qoderworkcn/skills
    • Windows: %USERPROFILE%\.qoderworkcn\skills
  • Add Qoder CN target support:
    • macOS/Linux: ~/.qoder-cn/skills
    • Windows: %USERPROFILE%\.qoder-cn\skills
  • 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.sh path handling, backup ignore rules, and the new agent paths.