From ff15f515cce625976e3e3e3481cb334257b4b8c5 Mon Sep 17 00:00:00 2001 From: Xi Zhang <106144707+X-iZhang@users.noreply.github.com> Date: Fri, 10 Apr 2026 21:04:05 +0200 Subject: [PATCH] Release/v0.0.7 (#151) * chore(assets): update wechat_group image file * Refactor code structure for improved readability and maintainability * feat(backends): enhance MergedReadOnlyBackend with improved ls, grep, and glob methods * fix(docs): update WeChat QR code image link in README files * feat(skills): enhance skill management to support global and workspace tiers * style: apply ruff format to skills_cmd and commands/implementation/skills Co-Authored-By: Claude Sonnet 4.6 * fix(skills): improve uninstall_skill to prevent removal of built-in skills * fix(docs): update skill installation documentation for clarity on global and user directories * fix(skills): enhance uninstall_skill to validate skill directory before removal * fix(skills): improve error handling in install_skill and uninstall_skill for directory creation and validation --------- Co-authored-by: Claude Sonnet 4.6 --- .github/assets/badge-pypi-dark.svg | 2 +- .github/assets/badge-pypi-light.svg | 2 +- .github/assets/wechat_group.jpeg | Bin 436882 -> 443718 bytes EvoScientist/EvoScientist.py | 4 + EvoScientist/backends.py | 123 ++- EvoScientist/cli/skills_cmd.py | 89 +- .../commands/implementation/skills.py | 99 ++- EvoScientist/paths.py | 14 + EvoScientist/tools/skills_manager.py | 140 ++-- README.md | 2 +- README.zh-CN.md | 2 +- pyproject.toml | 4 +- tests/test_skills_manager.py | 9 +- uv.lock | 790 +++++++++--------- 14 files changed, 725 insertions(+), 555 deletions(-) diff --git a/.github/assets/badge-pypi-dark.svg b/.github/assets/badge-pypi-dark.svg index 80286a6..31154d8 100644 --- a/.github/assets/badge-pypi-dark.svg +++ b/.github/assets/badge-pypi-dark.svg @@ -5,5 +5,5 @@ v0.0.6 + font-size="13" font-weight="700" fill="#ffffff">v0.0.7 \ No newline at end of file diff --git a/.github/assets/badge-pypi-light.svg b/.github/assets/badge-pypi-light.svg index ac26abd..ad30b27 100644 --- a/.github/assets/badge-pypi-light.svg +++ b/.github/assets/badge-pypi-light.svg @@ -5,5 +5,5 @@ v0.0.6 + font-size="13" font-weight="700" fill="#ffffff">v0.0.7 \ No newline at end of file diff --git a/.github/assets/wechat_group.jpeg b/.github/assets/wechat_group.jpeg index 995d8ae06203cacbdfbc14866b1c7b4549f6a463..a5674e37eb7665c88773f47614296671fcf7fd75 100644 GIT binary patch delta 342293 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