v0.17.0
ductor v0.17.0
Release with Docker port publishing, Gemini CLI aliases, Telegram routing fixes, background task environment improvements, and cleaner Codex/workspace error handling.
TL;DR
- Docker port publishing — new
docker.published_portsconfig maps host/container ports through Docker, useful for local web UIs and services started inside the sandbox. - Gemini aliases in
/model—auto,pro,flash, andflash-litenow appear before discovered Gemini models. - Cleaner Telegram group behavior — unaddressed group messages are dropped before queue indicators, including media prompts.
- Forum topic delivery fixes — inter-agent and webhook wake replies preserve Telegram forum topics.
- Background task environment fix — cron, webhook, and named background task subprocesses receive the correct
DUCTOR_HOME. - Codex error cleanup — protocol-only Codex JSONL events are no longer shown to users as raw output.
- Skill sync cleanup — invalid synced skills without required
SKILL.mdfrontmatter are skipped/cleaned without touching user-owned skill folders.
Merged PRs
- #120 by @ryuhaneul — preserve Telegram forum topic routing for inter-agent and webhook delivery.
- #121 by @kdramapulse — pass
DUCTOR_HOMEinto task CLI subprocesses. - #123 by @attid — drop unaddressed Telegram group messages before showing queue indicators.
- #124 by @attid — expose Gemini CLI aliases in the model selector.
- #125 by @ryuhaneul — handle
PermissionErrorduring rule-file sync. - #126 by @ryuhaneul — preserve response session IDs on error/abort paths.
- #129 by @brianmarr — add Docker
published_portsconfig.
Fixes
Codex raw JSONL output (#128)
Codex background/interrupted error paths no longer leak protocol-only JSONL events into user-visible output. If Codex provides a structured error, stderr, or partial assistant text, ductor still shows the best available message.
Skill frontmatter warnings (#119)
Skill sync now validates required YAML frontmatter before sharing skills across CLI homes. Invalid Ductor-managed links/copies are cleaned up, while user-owned real directories are preserved.
Session preservation polish
Error/abort paths can keep a newly returned session ID for resume, but failed turns no longer overwrite a known good session ID or count as successful messages.
Verification
pytest— 3697 passedruff format --check .ruff check .mypy ductor_botpython -m ductor_bot --version→ductor 0.17.0python -m build→ builtductor-0.17.0.tar.gzandductor-0.17.0-py3-none-any.whl
Full changelog: v0.16.3...v0.17.0