Skip to content

Commit b358b55

Browse files
authored
feat(skills): implement M10 advanced skills (#96)
* feat(skills): implement M10 advanced skills (#74) Add embedding-based skill matcher with cosine similarity for dynamic per-query skill selection, replacing static inject-all behavior. Implement filesystem watcher for hot-reload of SKILL.md files with 500ms debounce. Add skill priority system where earlier config paths take precedence. Track skill usage in SQLite with /skills command. Include three new bundled skills: git, docker, api-request. Closes #75, closes #76, closes #77 * chore: bump version to 0.5.0 (#96) Release M10 Advanced Skills as v0.5.0. Update CHANGELOG, README with embedding-based skill matching, hot-reload, usage tracking.
1 parent ff01fa6 commit b358b55

File tree

23 files changed

+947
-67
lines changed

23 files changed

+947
-67
lines changed

CHANGELOG.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,31 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
66

77
## [Unreleased]
88

9+
## [0.5.0] - 2026-02-08
10+
11+
### Added
12+
- Embedding-based skill matcher: `SkillMatcher` with cosine similarity selects top-K relevant skills per query instead of injecting all skills into the system prompt (Issue #75)
13+
- `max_active_skills` config field (default: 5) with `ZEPH_SKILLS_MAX_ACTIVE` env var override
14+
- Skill hot-reload: filesystem watcher via `notify-debouncer-mini` detects SKILL.md changes and re-embeds without restart (Issue #76)
15+
- Skill priority: earlier paths in `skills.paths` take precedence when skills share the same name (Issue #76)
16+
- `SkillRegistry::reload()` and `SkillRegistry::into_skills()` methods
17+
- SQLite `skill_usage` table tracking per-skill invocation counts and last-used timestamps (Issue #77)
18+
- `/skills` command displaying available skills with usage statistics
19+
- Three new bundled skills: `git`, `docker`, `api-request` (Issue #77)
20+
- 17 new unit tests for matcher, registry priority, reload, and usage tracking
21+
22+
### Changed
23+
- `Agent::new()` signature: accepts `Vec<Skill>`, `Option<SkillMatcher>`, `max_active_skills` instead of pre-formatted skills prompt string
24+
- `format_skills_prompt` now generic over `Borrow<Skill>` to accept both `&[Skill]` and `&[&Skill]`
25+
- `Skill` struct derives `Clone`
26+
- `Agent` generic constraint: `P: LlmProvider + Clone + 'static` (required for embed_fn closures)
27+
- System prompt rebuilt dynamically per user query with only matched skills
28+
29+
### Dependencies
30+
- Added `notify` 8.0, `notify-debouncer-mini` 0.6
31+
- `zeph-core` now depends on `zeph-skills`
32+
- `zeph-skills` now depends on `tokio` (sync, rt) and `notify`
33+
934
## [0.4.3] - 2026-02-08
1035

1136
### Fixed

Cargo.lock

Lines changed: 117 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ resolver = "3"
55
[workspace.package]
66
edition = "2024"
77
rust-version = "1.88"
8-
version = "0.4.3"
8+
version = "0.5.0"
99
authors = ["bug-ops"]
1010
license = "MIT"
1111
repository = "https://github.com/bug-ops/zeph"
@@ -15,6 +15,8 @@ anyhow = "1.0"
1515
criterion = "0.8"
1616
eventsource-stream = "0.2"
1717
futures-core = "0.3"
18+
notify = "8"
19+
notify-debouncer-mini = "0.7"
1820
ollama-rs = { version = "0.3", default-features = false, features = ["rustls", "stream"] }
1921
pulldown-cmark = "0.13"
2022
qdrant-client = { version = "1.16", default-features = false }
@@ -33,12 +35,12 @@ toml = "0.9"
3335
tracing = "0.1"
3436
tracing-subscriber = "0.3"
3537
uuid = "1.20"
36-
zeph-channels = { path = "crates/zeph-channels", version = "0.4.3" }
37-
zeph-core = { path = "crates/zeph-core", version = "0.4.3" }
38-
zeph-llm = { path = "crates/zeph-llm", version = "0.4.3" }
39-
zeph-memory = { path = "crates/zeph-memory", version = "0.4.3" }
40-
zeph-skills = { path = "crates/zeph-skills", version = "0.4.3" }
41-
zeph-tools = { path = "crates/zeph-tools", version = "0.4.3" }
38+
zeph-channels = { path = "crates/zeph-channels", version = "0.5.0" }
39+
zeph-core = { path = "crates/zeph-core", version = "0.5.0" }
40+
zeph-llm = { path = "crates/zeph-llm", version = "0.5.0" }
41+
zeph-memory = { path = "crates/zeph-memory", version = "0.5.0" }
42+
zeph-skills = { path = "crates/zeph-skills", version = "0.5.0" }
43+
zeph-tools = { path = "crates/zeph-tools", version = "0.5.0" }
4244

4345
[workspace.lints.clippy]
4446
all = "warn"

0 commit comments

Comments
 (0)