Skill System
June 13, 2026 · View on GitHub
Cross-tool skill sync between ductor workspace and CLI skill homes.
Files
workspace/skill_sync.py: discovery, canonical selection, sync, cleanup, watcherworkspace/init.py: startup one-shot sync callsorchestrator/observers.py: starts/stops background skill-sync watcherworkspace/paths.py: skill-related path properties
Sync directories
<agent-home>/workspace/skills/
<-> ~/.claude/skills/
<-> ~/.codex/skills/ (or $CODEX_HOME/skills)
<-> ~/.gemini/skills/
<agent-home>:
- main:
~/.ductor - sub-agent:
~/.ductor/agents/<name>
Bundled skills
Bundled source: ductor_bot/_home_defaults/workspace/skills/.
sync_bundled_skills(paths) mirrors bundled skills into each agent's workspace skill dir.
- normal mode: links/junctions
- Docker mode: managed copies (
.ductor_managed)
Sync algorithm (sync_skills)
- discover skill dirs in all roots
- union names
- pick canonical source by priority (
ductor > claude > codex > gemini) - mirror to other roots
- cleanup broken managed links
Configuration
Cross-tool sync is controlled by the skills config block (see config.md → SkillsConfig):
skills.sync_enabled(defaulttrue): global switch. Whenfalse,sync_skillsreturns early and no cross-tool sync runs.skills.sync.{claude,codex,gemini}(defaulttrue): per-provider toggles. A disabled provider's skill dir is dropped from_cli_skill_dirs(), so it is neither linked into nor used as a sync source.
Toggles are read live from config.json on each sync tick, so changes take effect within one interval without restart. Disabling a provider stops new links from being recreated; existing ductor-created links remain until shutdown cleanup or manual removal.
Docker-mode behavior
When docker_active=True:
- uses managed copies instead of links
- updates only managed copies
- preserves unmanaged user directories
Cleanup on shutdown
cleanup_ductor_links(paths) removes managed links under CLI skill dirs whose targets point to managed roots.
Safety guarantees
- unmanaged real directories are preserved
- broken links are cleaned
- hidden/system dirs are skipped
- cross-platform link handling (incl. Windows junction fallback)