yee88 0.4.0__tar.gz → 0.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. {yee88-0.4.0 → yee88-0.6.0}/PKG-INFO +2 -1
  2. yee88-0.6.0/docs/user-guide-zh.md +481 -0
  3. {yee88-0.4.0 → yee88-0.6.0}/pyproject.toml +3 -1
  4. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/cli/__init__.py +4 -0
  5. yee88-0.6.0/src/yee88/cli/cron.py +214 -0
  6. yee88-0.6.0/src/yee88/cli/reload.py +140 -0
  7. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/cli/run.py +7 -0
  8. yee88-0.6.0/src/yee88/cron/__init__.py +5 -0
  9. yee88-0.6.0/src/yee88/cron/manager.py +140 -0
  10. yee88-0.6.0/src/yee88/cron/models.py +13 -0
  11. yee88-0.6.0/src/yee88/cron/scheduler.py +57 -0
  12. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/markdown.py +2 -0
  13. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/progress.py +3 -0
  14. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/runner.py +1 -0
  15. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/runner_bridge.py +18 -0
  16. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/runners/mock.py +3 -0
  17. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/runtime_loader.py +4 -0
  18. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/settings.py +2 -1
  19. yee88-0.6.0/src/yee88/skills/yee88/SKILL.md +530 -0
  20. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/__init__.py +2 -0
  21. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/executor.py +5 -1
  22. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/model.py +131 -4
  23. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/topics.py +10 -0
  24. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/context.py +6 -0
  25. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/loop.py +63 -2
  26. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/onboarding.py +40 -0
  27. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/transport_runtime.py +21 -0
  28. {yee88-0.4.0 → yee88-0.6.0}/tests/test_exec_render.py +19 -0
  29. {yee88-0.4.0 → yee88-0.6.0}/tests/test_onboarding_interactive.py +3 -3
  30. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_context_helpers.py +26 -0
  31. {yee88-0.4.0 → yee88-0.6.0}/uv.lock +92 -68
  32. {yee88-0.4.0 → yee88-0.6.0}/zensical.toml +1 -0
  33. yee88-0.4.0/.codex/skills/takopi-release/SKILL.md +0 -67
  34. {yee88-0.4.0 → yee88-0.6.0}/.codex/AGENTS.md +0 -0
  35. {yee88-0.4.0 → yee88-0.6.0}/.github/workflows/ci.yml +0 -0
  36. {yee88-0.4.0 → yee88-0.6.0}/.github/workflows/release.yml +0 -0
  37. {yee88-0.4.0 → yee88-0.6.0}/.gitignore +0 -0
  38. {yee88-0.4.0 → yee88-0.6.0}/Justfile +0 -0
  39. {yee88-0.4.0 → yee88-0.6.0}/LICENSE +0 -0
  40. {yee88-0.4.0 → yee88-0.6.0}/README.md +0 -0
  41. {yee88-0.4.0 → yee88-0.6.0}/changelog.md +0 -0
  42. {yee88-0.4.0 → yee88-0.6.0}/docs/assets/favicon.svg +0 -0
  43. {yee88-0.4.0 → yee88-0.6.0}/docs/assets/logo.svg +0 -0
  44. {yee88-0.4.0 → yee88-0.6.0}/docs/assets/og-image.jpg +0 -0
  45. {yee88-0.4.0 → yee88-0.6.0}/docs/assets/takopi.svg +0 -0
  46. {yee88-0.4.0 → yee88-0.6.0}/docs/developing.md +0 -0
  47. {yee88-0.4.0 → yee88-0.6.0}/docs/explanation/architecture.md +0 -0
  48. {yee88-0.4.0 → yee88-0.6.0}/docs/explanation/index.md +0 -0
  49. {yee88-0.4.0 → yee88-0.6.0}/docs/explanation/module-map.md +0 -0
  50. {yee88-0.4.0 → yee88-0.6.0}/docs/explanation/plugin-system.md +0 -0
  51. {yee88-0.4.0 → yee88-0.6.0}/docs/explanation/routing-and-sessions.md +0 -0
  52. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/add-a-runner.md +0 -0
  53. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/chat-sessions.md +0 -0
  54. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/dev-setup.md +0 -0
  55. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/file-transfer.md +0 -0
  56. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/index.md +0 -0
  57. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/projects.md +0 -0
  58. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/route-by-chat.md +0 -0
  59. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/schedule-tasks.md +0 -0
  60. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/switch-engines.md +0 -0
  61. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/topics.md +0 -0
  62. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/troubleshooting.md +0 -0
  63. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/voice-notes.md +0 -0
  64. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/worktrees.md +0 -0
  65. {yee88-0.4.0 → yee88-0.6.0}/docs/how-to/write-a-plugin.md +0 -0
  66. {yee88-0.4.0 → yee88-0.6.0}/docs/index.md +0 -0
  67. {yee88-0.4.0 → yee88-0.6.0}/docs/javascripts/hero-chat.js +0 -0
  68. {yee88-0.4.0 → yee88-0.6.0}/docs/overrides/.icons/takopi/takopi.svg +0 -0
  69. {yee88-0.4.0 → yee88-0.6.0}/docs/overrides/main.html +0 -0
  70. {yee88-0.4.0 → yee88-0.6.0}/docs/plugins.md +0 -0
  71. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/agents/index.md +0 -0
  72. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/agents/invariants.md +0 -0
  73. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/agents/repo-map.md +0 -0
  74. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/commands-and-directives.md +0 -0
  75. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/config.md +0 -0
  76. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/context-resolution.md +0 -0
  77. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/env-vars.md +0 -0
  78. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/index.md +0 -0
  79. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/plugin-api.md +0 -0
  80. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/plugins.md +0 -0
  81. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/claude/runner.md +0 -0
  82. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/claude/stream-json-cheatsheet.md +0 -0
  83. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/claude/takopi-events.md +0 -0
  84. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/codex/exec-json-cheatsheet.md +0 -0
  85. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/codex/takopi-events.md +0 -0
  86. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/index.md +0 -0
  87. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/opencode/runner.md +0 -0
  88. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/opencode/stream-json-cheatsheet.md +0 -0
  89. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/opencode/takopi-events.md +0 -0
  90. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/pi/runner.md +0 -0
  91. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/pi/stream-json-cheatsheet.md +0 -0
  92. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/runners/pi/takopi-events.md +0 -0
  93. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/specification.md +0 -0
  94. {yee88-0.4.0 → yee88-0.6.0}/docs/reference/transports/telegram.md +0 -0
  95. {yee88-0.4.0 → yee88-0.6.0}/docs/stylesheets/admonitions.css +0 -0
  96. {yee88-0.4.0 → yee88-0.6.0}/docs/stylesheets/hero-chat.css +0 -0
  97. {yee88-0.4.0 → yee88-0.6.0}/docs/stylesheets/workflow-preview.css +0 -0
  98. {yee88-0.4.0 → yee88-0.6.0}/docs/tutorials/conversation-modes.md +0 -0
  99. {yee88-0.4.0 → yee88-0.6.0}/docs/tutorials/first-run.md +0 -0
  100. {yee88-0.4.0 → yee88-0.6.0}/docs/tutorials/index.md +0 -0
  101. {yee88-0.4.0 → yee88-0.6.0}/docs/tutorials/install.md +0 -0
  102. {yee88-0.4.0 → yee88-0.6.0}/docs/tutorials/multi-engine.md +0 -0
  103. {yee88-0.4.0 → yee88-0.6.0}/docs/tutorials/projects-and-branches.md +0 -0
  104. {yee88-0.4.0 → yee88-0.6.0}/docs/user-guide.md +0 -0
  105. {yee88-0.4.0 → yee88-0.6.0}/readme.md +0 -0
  106. {yee88-0.4.0 → yee88-0.6.0}/scripts/commit_notify.py +0 -0
  107. {yee88-0.4.0 → yee88-0.6.0}/scripts/docs_build_cf.sh +0 -0
  108. {yee88-0.4.0 → yee88-0.6.0}/scripts/docs_prebuild.py +0 -0
  109. {yee88-0.4.0 → yee88-0.6.0}/scripts/onboarding_preview.py +0 -0
  110. {yee88-0.4.0 → yee88-0.6.0}/scripts/release_notify.py +0 -0
  111. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/__init__.py +0 -0
  112. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/api.py +0 -0
  113. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/backends.py +0 -0
  114. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/backends_helpers.py +0 -0
  115. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/cli/config.py +0 -0
  116. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/cli/doctor.py +0 -0
  117. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/cli/init.py +0 -0
  118. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/cli/onboarding_cmd.py +0 -0
  119. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/cli/plugins.py +0 -0
  120. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/cli/topic.py +0 -0
  121. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/commands.py +0 -0
  122. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/config.py +0 -0
  123. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/config_migrations.py +0 -0
  124. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/config_watch.py +0 -0
  125. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/context.py +0 -0
  126. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/directives.py +0 -0
  127. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/engines.py +0 -0
  128. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/events.py +0 -0
  129. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/ids.py +0 -0
  130. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/lockfile.py +0 -0
  131. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/logging.py +0 -0
  132. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/model.py +0 -0
  133. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/plugins.py +0 -0
  134. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/presenter.py +0 -0
  135. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/router.py +0 -0
  136. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/runners/__init__.py +0 -0
  137. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/runners/claude.py +0 -0
  138. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/runners/codex.py +0 -0
  139. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/runners/opencode.py +0 -0
  140. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/runners/pi.py +0 -0
  141. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/runners/run_options.py +0 -0
  142. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/runners/tool_actions.py +0 -0
  143. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/scheduler.py +0 -0
  144. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/schemas/__init__.py +0 -0
  145. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/schemas/claude.py +0 -0
  146. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/schemas/codex.py +0 -0
  147. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/schemas/opencode.py +0 -0
  148. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/schemas/pi.py +0 -0
  149. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/__init__.py +0 -0
  150. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/api_models.py +0 -0
  151. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/api_schemas.py +0 -0
  152. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/backend.py +0 -0
  153. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/bridge.py +0 -0
  154. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/chat_prefs.py +0 -0
  155. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/chat_sessions.py +0 -0
  156. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/client.py +0 -0
  157. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/client_api.py +0 -0
  158. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/agent.py +0 -0
  159. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/cancel.py +0 -0
  160. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/dispatch.py +0 -0
  161. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/file_transfer.py +0 -0
  162. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/handlers.py +0 -0
  163. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/media.py +0 -0
  164. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/menu.py +0 -0
  165. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/overrides.py +0 -0
  166. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/parse.py +0 -0
  167. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/plan.py +0 -0
  168. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/reasoning.py +0 -0
  169. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/reply.py +0 -0
  170. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/commands/trigger.py +0 -0
  171. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/engine_defaults.py +0 -0
  172. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/engine_overrides.py +0 -0
  173. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/files.py +0 -0
  174. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/outbox.py +0 -0
  175. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/parsing.py +0 -0
  176. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/render.py +0 -0
  177. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/state_store.py +0 -0
  178. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/topic_state.py +0 -0
  179. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/topics.py +0 -0
  180. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/trigger_mode.py +0 -0
  181. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/types.py +0 -0
  182. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/telegram/voice.py +0 -0
  183. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/transport.py +0 -0
  184. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/transports.py +0 -0
  185. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/utils/__init__.py +0 -0
  186. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/utils/git.py +0 -0
  187. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/utils/json_state.py +0 -0
  188. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/utils/paths.py +0 -0
  189. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/utils/streams.py +0 -0
  190. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/utils/subprocess.py +0 -0
  191. {yee88-0.4.0 → yee88-0.6.0}/src/yee88/worktrees.py +0 -0
  192. {yee88-0.4.0 → yee88-0.6.0}/tests/__init__.py +0 -0
  193. {yee88-0.4.0 → yee88-0.6.0}/tests/conftest.py +0 -0
  194. {yee88-0.4.0 → yee88-0.6.0}/tests/factories.py +0 -0
  195. {yee88-0.4.0 → yee88-0.6.0}/tests/fixtures/claude_stream_json_session.jsonl +0 -0
  196. {yee88-0.4.0 → yee88-0.6.0}/tests/fixtures/codex_exec_json_all_formats.jsonl +0 -0
  197. {yee88-0.4.0 → yee88-0.6.0}/tests/fixtures/codex_exec_json_all_formats.txt +0 -0
  198. {yee88-0.4.0 → yee88-0.6.0}/tests/fixtures/opencode_run_json.jsonl +0 -0
  199. {yee88-0.4.0 → yee88-0.6.0}/tests/fixtures/opencode_stream_error.jsonl +0 -0
  200. {yee88-0.4.0 → yee88-0.6.0}/tests/fixtures/opencode_stream_success.jsonl +0 -0
  201. {yee88-0.4.0 → yee88-0.6.0}/tests/fixtures/opencode_stream_success_no_reason.jsonl +0 -0
  202. {yee88-0.4.0 → yee88-0.6.0}/tests/fixtures/pi_print_mode_events.jsonl +0 -0
  203. {yee88-0.4.0 → yee88-0.6.0}/tests/fixtures/pi_stream_error.jsonl +0 -0
  204. {yee88-0.4.0 → yee88-0.6.0}/tests/fixtures/pi_stream_success.jsonl +0 -0
  205. {yee88-0.4.0 → yee88-0.6.0}/tests/plugin_fixtures.py +0 -0
  206. {yee88-0.4.0 → yee88-0.6.0}/tests/telegram_fakes.py +0 -0
  207. {yee88-0.4.0 → yee88-0.6.0}/tests/test_api_exports.py +0 -0
  208. {yee88-0.4.0 → yee88-0.6.0}/tests/test_auto_router.py +0 -0
  209. {yee88-0.4.0 → yee88-0.6.0}/tests/test_claude_runner.py +0 -0
  210. {yee88-0.4.0 → yee88-0.6.0}/tests/test_claude_schema.py +0 -0
  211. {yee88-0.4.0 → yee88-0.6.0}/tests/test_cli_auto_router.py +0 -0
  212. {yee88-0.4.0 → yee88-0.6.0}/tests/test_cli_chat_id.py +0 -0
  213. {yee88-0.4.0 → yee88-0.6.0}/tests/test_cli_commands.py +0 -0
  214. {yee88-0.4.0 → yee88-0.6.0}/tests/test_cli_config.py +0 -0
  215. {yee88-0.4.0 → yee88-0.6.0}/tests/test_cli_doctor.py +0 -0
  216. {yee88-0.4.0 → yee88-0.6.0}/tests/test_cli_helpers.py +0 -0
  217. {yee88-0.4.0 → yee88-0.6.0}/tests/test_codex_runner_helpers.py +0 -0
  218. {yee88-0.4.0 → yee88-0.6.0}/tests/test_codex_schema.py +0 -0
  219. {yee88-0.4.0 → yee88-0.6.0}/tests/test_codex_tool_result_summary.py +0 -0
  220. {yee88-0.4.0 → yee88-0.6.0}/tests/test_command_registry.py +0 -0
  221. {yee88-0.4.0 → yee88-0.6.0}/tests/test_config_store.py +0 -0
  222. {yee88-0.4.0 → yee88-0.6.0}/tests/test_config_watch.py +0 -0
  223. {yee88-0.4.0 → yee88-0.6.0}/tests/test_engine_discovery.py +0 -0
  224. {yee88-0.4.0 → yee88-0.6.0}/tests/test_exec_bridge.py +0 -0
  225. {yee88-0.4.0 → yee88-0.6.0}/tests/test_exec_runner.py +0 -0
  226. {yee88-0.4.0 → yee88-0.6.0}/tests/test_git_utils.py +0 -0
  227. {yee88-0.4.0 → yee88-0.6.0}/tests/test_lockfile.py +0 -0
  228. {yee88-0.4.0 → yee88-0.6.0}/tests/test_onboarding.py +0 -0
  229. {yee88-0.4.0 → yee88-0.6.0}/tests/test_onboarding_helpers.py +0 -0
  230. {yee88-0.4.0 → yee88-0.6.0}/tests/test_opencode_runner.py +0 -0
  231. {yee88-0.4.0 → yee88-0.6.0}/tests/test_opencode_schema.py +0 -0
  232. {yee88-0.4.0 → yee88-0.6.0}/tests/test_paths.py +0 -0
  233. {yee88-0.4.0 → yee88-0.6.0}/tests/test_pi_runner.py +0 -0
  234. {yee88-0.4.0 → yee88-0.6.0}/tests/test_pi_schema.py +0 -0
  235. {yee88-0.4.0 → yee88-0.6.0}/tests/test_plugins.py +0 -0
  236. {yee88-0.4.0 → yee88-0.6.0}/tests/test_projects_config.py +0 -0
  237. {yee88-0.4.0 → yee88-0.6.0}/tests/test_rendering.py +0 -0
  238. {yee88-0.4.0 → yee88-0.6.0}/tests/test_runner_contract.py +0 -0
  239. {yee88-0.4.0 → yee88-0.6.0}/tests/test_runner_run_options.py +0 -0
  240. {yee88-0.4.0 → yee88-0.6.0}/tests/test_runner_utils.py +0 -0
  241. {yee88-0.4.0 → yee88-0.6.0}/tests/test_runtime_loader.py +0 -0
  242. {yee88-0.4.0 → yee88-0.6.0}/tests/test_settings.py +0 -0
  243. {yee88-0.4.0 → yee88-0.6.0}/tests/test_settings_contract.py +0 -0
  244. {yee88-0.4.0 → yee88-0.6.0}/tests/test_subprocess.py +0 -0
  245. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_agent_trigger_commands.py +0 -0
  246. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_backend.py +0 -0
  247. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_bridge.py +0 -0
  248. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_chat_prefs.py +0 -0
  249. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_chat_sessions.py +0 -0
  250. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_client.py +0 -0
  251. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_client_api.py +0 -0
  252. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_engine_defaults.py +0 -0
  253. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_engine_overrides.py +0 -0
  254. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_file_transfer_helpers.py +0 -0
  255. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_files.py +0 -0
  256. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_incoming.py +0 -0
  257. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_media_command.py +0 -0
  258. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_polling.py +0 -0
  259. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_queue.py +0 -0
  260. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_topic_state.py +0 -0
  261. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_topics_command.py +0 -0
  262. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_topics_helpers.py +0 -0
  263. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_trigger_mode.py +0 -0
  264. {yee88-0.4.0 → yee88-0.6.0}/tests/test_telegram_voice.py +0 -0
  265. {yee88-0.4.0 → yee88-0.6.0}/tests/test_tool_actions.py +0 -0
  266. {yee88-0.4.0 → yee88-0.6.0}/tests/test_transport.py +0 -0
  267. {yee88-0.4.0 → yee88-0.6.0}/tests/test_transport_registry.py +0 -0
  268. {yee88-0.4.0 → yee88-0.6.0}/tests/test_transport_runtime.py +0 -0
  269. {yee88-0.4.0 → yee88-0.6.0}/tests/test_worktrees.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yee88
3
- Version: 0.4.0
3
+ Version: 0.6.0
4
4
  Summary: Telegram bridge for Codex, Claude Code, and other agent CLIs.
5
5
  Project-URL: Homepage, https://github.com/banteg/yee88
6
6
  Project-URL: Documentation, https://yee88.dev/
@@ -36,6 +36,7 @@ Classifier: Programming Language :: Python :: 3 :: Only
36
36
  Classifier: Programming Language :: Python :: 3.14
37
37
  Requires-Python: >=3.14
38
38
  Requires-Dist: anyio>=4.12.0
39
+ Requires-Dist: croniter>=2.0.0
39
40
  Requires-Dist: httpx>=0.28.1
40
41
  Requires-Dist: markdown-it-py
41
42
  Requires-Dist: msgspec>=0.20.0
@@ -0,0 +1,481 @@
1
+ # 🐙 yee88 完整使用指南
2
+
3
+ yee88 是一个 Telegram 桥接工具,让你可以通过 Telegram 聊天界面来运行 AI 编程助手(Codex、Claude Code、OpenCode、Pi)。
4
+
5
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
6
+
7
+ ## 📦 一、安装与初始化(💻 电脑侧)
8
+
9
+ ### 1. 安装依赖
10
+
11
+ ```bash
12
+ # 安装 uv(Python 包管理器)
13
+ curl -LsSf https://astral.sh/uv/install.sh | sh
14
+
15
+ # 安装 Python 3.14
16
+ uv python install 3.14
17
+
18
+ # 安装 yee88
19
+ uv tool install -U yee88
20
+ ```
21
+
22
+ ### 2. 安装 AI 引擎(至少一个)
23
+
24
+ ```bash
25
+ # Codex (OpenAI)
26
+ npm install -g @openai/codex
27
+
28
+ # Claude Code (Anthropic)
29
+ npm install -g @anthropic-ai/claude-code
30
+
31
+ # OpenCode
32
+ npm install -g opencode-ai@latest
33
+
34
+ # Pi
35
+ npm install -g @mariozechner/pi-coding-agent
36
+ ```
37
+
38
+ ### 3. 首次运行配置(📱 手机侧配合)
39
+
40
+ ```bash
41
+ yee88
42
+ ```
43
+
44
+ 这会启动交互式向导:
45
+
46
+ 1. **创建 Telegram Bot** → 去 @BotFather 创建机器人,获取 token
47
+ 2. **选择工作流**:
48
+ - `assistant` - 持续对话模式(推荐个人使用)
49
+ - `workspace` - 话题模式(团队多项目)
50
+ - `handoff` - 回复继续模式
51
+ 3. **连接聊天** → 在 Telegram 向机器人发送 `/start`
52
+ 4. **选择默认引擎** → codex / claude / opencode / pi
53
+
54
+ 配置保存在 `~/.yee88/yee88.toml`
55
+
56
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
57
+
58
+ ## 🚀 二、日常使用
59
+
60
+ ### 启动 yee88(💻 电脑侧)
61
+
62
+ ```bash
63
+ # 在项目目录启动
64
+ cd ~/your-project
65
+ yee88
66
+
67
+ # 指定引擎启动
68
+ yee88 claude
69
+ yee88 codex
70
+ ```
71
+
72
+ ### 基本对话(📱 手机侧 Telegram)
73
+
74
+ 直接发送消息给机器人:
75
+
76
+ ```
77
+ 解释这个项目是做什么的
78
+ ```
79
+
80
+ ### 切换引擎(📱 手机侧)
81
+
82
+ 在消息前加引擎前缀:
83
+
84
+ ```
85
+ /codex 修复这个 bug
86
+ /claude 重构这个函数
87
+ /opencode 优化性能
88
+ /pi 添加测试
89
+ ```
90
+
91
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
92
+
93
+ ## 📁 三、项目管理
94
+
95
+ ### 注册项目(💻 电脑侧)
96
+
97
+ ```bash
98
+ cd ~/dev/my-project
99
+ yee88 init myproject
100
+ ```
101
+
102
+ ### 从任意位置定位项目(📱 手机侧)
103
+
104
+ ```
105
+ /myproject 添加新功能
106
+ /myproject @feat/new-ui 创建登录页面
107
+ ```
108
+
109
+ ### 设置默认项目(💻 电脑侧)
110
+
111
+ ```bash
112
+ yee88 config set default_project myproject
113
+ ```
114
+
115
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
116
+
117
+ ## 🌳 四、工作树(Worktrees)
118
+
119
+ ### 在特定分支上运行(📱 手机侧)
120
+
121
+ ```
122
+ /myproject @feat/auth 实现 JWT 认证
123
+ ```
124
+
125
+ yee88 会自动:
126
+
127
+ - 创建 `.worktrees/feat/auth` 工作树
128
+ - 在该分支上下文中运行 AI
129
+
130
+ ### 配置工作树(💻 电脑侧)
131
+
132
+ ```bash
133
+ yee88 config set projects.myproject.worktrees_dir ".worktrees"
134
+ yee88 config set projects.myproject.worktree_base "main"
135
+ ```
136
+
137
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
138
+
139
+ ## 💬 五、Telegram 命令(📱 手机侧)
140
+
141
+ | 命令 | 说明 |
142
+ |------|------|
143
+ | `/cancel` | 回复进度消息以取消当前运行 |
144
+ | `/agent` | 查看/设置当前聊天的默认引擎 |
145
+ | `/agent set claude` | 设置默认引擎为 Claude |
146
+ | `/model` | 查看/设置模型覆盖 |
147
+ | `/reasoning` | 查看/设置推理模式 |
148
+ | `/trigger` | 设置触发模式(mentions-only / all) |
149
+ | `/file put <path>` | 上传文件到仓库 |
150
+ | `/file get <path>` | 获取文件/目录(自动压缩) |
151
+ | `/topic <project> @branch` | 创建/绑定话题(需开启 topics) |
152
+ | `/ctx` | 显示当前上下文绑定 |
153
+ | `/ctx set <project> @branch` | 更新上下文 |
154
+ | `/ctx clear` | 清除上下文绑定 |
155
+ | `/new` | 清除当前会话,开始新对话 |
156
+
157
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
158
+
159
+ ## 📎 六、文件传输
160
+
161
+ ### 启用文件传输(💻 电脑侧)
162
+
163
+ ```bash
164
+ yee88 config set transports.telegram.files.enabled true
165
+ yee88 config set transports.telegram.files.auto_put true
166
+ ```
167
+
168
+ ### 上传文件(📱 手机侧)
169
+
170
+ 发送文档并附带说明:
171
+
172
+ ```
173
+ /file put docs/spec.pdf
174
+ ```
175
+
176
+ 或直接发送文件(自动保存到 `incoming/`)
177
+
178
+ ### 下载文件(📱 手机侧)
179
+
180
+ ```
181
+ /file get src/main.py
182
+ /file get src/ # 目录会自动打包为 zip
183
+ ```
184
+
185
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
186
+
187
+ ## 🎙 七、语音消息
188
+
189
+ ### 启用语音转录(💻 电脑侧)
190
+
191
+ ```bash
192
+ yee88 config set transports.telegram.voice_transcription true
193
+ ```
194
+
195
+ 设置环境变量 `OPENAI_API_KEY`
196
+
197
+ ### 使用(📱 手机侧)
198
+
199
+ 直接发送语音消息,yee88 会自动转录并执行
200
+
201
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
202
+
203
+ ## ⚙️ 八、配置管理(💻 电脑侧)
204
+
205
+ ### 查看配置
206
+
207
+ ```bash
208
+ yee88 config list
209
+ yee88 config get default_engine
210
+ ```
211
+
212
+ ### 修改配置
213
+
214
+ ```bash
215
+ # 设置默认值
216
+ yee88 config set default_engine "claude"
217
+ yee88 config set default_project "myproject"
218
+
219
+ # Telegram 设置
220
+ yee88 config set transports.telegram.session_mode "chat"
221
+ yee88 config set transports.telegram.show_resume_line false
222
+
223
+ # 引擎特定配置
224
+ yee88 config set claude.model "claude-sonnet-4-5-20250929"
225
+ yee88 config set codex.profile "work"
226
+
227
+ # 启用配置热重载
228
+ yee88 config set watch_config true
229
+ ```
230
+
231
+ ### 诊断检查
232
+
233
+ ```bash
234
+ yee88 doctor
235
+ ```
236
+
237
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
238
+
239
+ ## 🗂 九、话题模式(Topics)
240
+
241
+ 适合团队协作,每个话题绑定一个项目/分支:
242
+
243
+ ### 启用(💻 电脑侧)
244
+
245
+ ```bash
246
+ yee88 config set transports.telegram.topics.enabled true
247
+ ```
248
+
249
+ ### 创建话题(📱 手机侧)
250
+
251
+ 在论坛群组中:
252
+
253
+ ```
254
+ /topic myproject @main 设置主分支
255
+ /topic myproject @feat/ui 前端开发
256
+ ```
257
+
258
+ 每个话题会自动记住绑定的项目和分支,无需重复输入。
259
+
260
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
261
+
262
+ ## 🔧 十、完整配置参考
263
+
264
+ ### 配置文件位置
265
+
266
+ - **默认**: `~/.yee88/yee88.toml`
267
+ - **锁文件**: `~/.yee88/yee88.lock`
268
+
269
+ ### 顶层配置
270
+
271
+ | 配置项 | 类型 | 默认值 | 中文说明 |
272
+ |--------|------|--------|----------|
273
+ | `watch_config` | bool | `false` | 热重载配置更改(传输层除外) |
274
+ | `default_engine` | string | `"codex"` | 新线程的默认引擎 ID |
275
+ | `default_project` | string\|null | `null` | 默认项目别名 |
276
+ | `transport` | string | `"telegram"` | 传输后端 ID |
277
+ | `system_prompt` | string | (内置) | 系统提示词 |
278
+
279
+ ### Telegram 传输配置 (`transports.telegram`)
280
+
281
+ #### 基础配置
282
+
283
+ | 配置项 | 类型 | 默认值 | 中文说明 |
284
+ |--------|------|--------|----------|
285
+ | `bot_token` | string | (必需) | Telegram Bot Token(从 @BotFather 获取) |
286
+ | `chat_id` | int | (必需) | 默认聊天 ID |
287
+ | `allowed_user_ids` | int[] | `[]` | 允许的用户 ID 列表(空列表表示不限制) |
288
+ | `message_overflow` | string | `"trim"` | 长消息处理方式:`"trim"`(截断) 或 `"split"`(分割) |
289
+ | `session_mode` | string | `"stateless"` | 会话模式:`"stateless"`(回复继续) 或 `"chat"`(自动恢复) |
290
+ | `show_resume_line` | bool | `true` | 在消息页脚显示恢复行 |
291
+ | `forward_coalesce_s` | float | `1.0` | 转发消息合并的静默窗口(秒),设为 `0` 禁用 |
292
+
293
+ #### 语音转录配置
294
+
295
+ | 配置项 | 类型 | 默认值 | 中文说明 |
296
+ |--------|------|--------|----------|
297
+ | `voice_transcription` | bool | `false` | 启用语音笔记转录 |
298
+ | `voice_max_bytes` | int | `10485760` | 最大语音文件大小(字节,默认 10MB) |
299
+ | `voice_transcription_model` | string | `"gpt-4o-mini-transcribe"` | 转录模型名称 |
300
+ | `voice_transcription_base_url` | string\|null | `null` | 转录 API 基础 URL(可选) |
301
+ | `voice_transcription_api_key` | string\|null | `null` | 转录 API 密钥(可选) |
302
+
303
+ #### 话题配置 (`transports.telegram.topics`)
304
+
305
+ | 配置项 | 类型 | 默认值 | 中文说明 |
306
+ |--------|------|--------|----------|
307
+ | `enabled` | bool | `false` | 启用论坛话题功能 |
308
+ | `scope` | string | `"auto"` | 话题管理范围:`"auto"`、`"main"`、`"projects"`、`"all"` |
309
+
310
+ #### 文件传输配置 (`transports.telegram.files`)
311
+
312
+ | 配置项 | 类型 | 默认值 | 中文说明 |
313
+ |--------|------|--------|----------|
314
+ | `enabled` | bool | `false` | 启用 `/file put` 和 `/file get` 命令 |
315
+ | `auto_put` | bool | `true` | 自动保存上传的文件 |
316
+ | `auto_put_mode` | string | `"upload"` | 上传后行为:`"upload"`(仅保存) 或 `"prompt"`(保存并启动运行) |
317
+ | `uploads_dir` | string | `"incoming"` | 上传目录(相对于仓库/worktree) |
318
+ | `allowed_user_ids` | int[] | `[]` | 允许文件传输的用户 ID(空列表允许私聊,群组需要管理员) |
319
+ | `deny_globs` | string[] | (见下) | 拒绝的文件模式列表 |
320
+
321
+ 默认 `deny_globs`:
322
+ ```toml
323
+ deny_globs = [
324
+ ".git/**",
325
+ ".env",
326
+ ".envrc",
327
+ "**/*.pem",
328
+ "**/.ssh/**"
329
+ ]
330
+ ```
331
+
332
+ **文件大小限制**(不可配置):
333
+ - 上传:20 MiB
334
+ - 下载:50 MiB
335
+
336
+ ### 项目配置 (`projects.<alias>`)
337
+
338
+ | 配置项 | 类型 | 默认值 | 中文说明 |
339
+ |--------|------|--------|----------|
340
+ | `path` | string | (必需) | 仓库根目录路径(支持 `~` 展开) |
341
+ | `worktrees_dir` | string | `".worktrees"` | Worktree 根目录(相对于 `path`) |
342
+ | `default_engine` | string\|null | `null` | 项目默认引擎 |
343
+ | `worktree_base` | string\|null | `null` | 新 worktree 的基础分支 |
344
+ | `chat_id` | int\|null | `null` | 绑定到此项目的 Telegram 聊天 ID |
345
+ | `system_prompt` | string\|null | `null` | 项目特定的系统提示词 |
346
+
347
+ ### 插件配置 (`plugins`)
348
+
349
+ | 配置项 | 类型 | 默认值 | 中文说明 |
350
+ |--------|------|--------|----------|
351
+ | `enabled` | string[] | `[]` | 启用的插件列表(空列表表示加载所有已安装插件) |
352
+
353
+ ### 引擎特定配置
354
+
355
+ #### Codex 配置 (`[codex]`)
356
+
357
+ | 配置项 | 类型 | 默认值 | 中文说明 |
358
+ |--------|------|--------|----------|
359
+ | `extra_args` | string[] | `["-c", "notify=[]"]` | 额外的 CLI 参数(不支持 exec-only 标志) |
360
+ | `profile` | string | (未设置) | 配置文件名称,作为 `--profile` 传递并用于会话标题 |
361
+
362
+ #### Claude 配置 (`[claude]`)
363
+
364
+ | 配置项 | 类型 | 默认值 | 中文说明 |
365
+ |--------|------|--------|----------|
366
+ | `model` | string | (未设置) | 可选的模型覆盖 |
367
+ | `allowed_tools` | string[] | `["Bash", "Read", "Edit", "Write"]` | 自动批准的工具列表 |
368
+ | `dangerously_skip_permissions` | bool | `false` | 跳过 Claude 权限提示(**高风险**) |
369
+ | `use_api_billing` | bool | `false` | 使用 API 计费(默认使用订阅) |
370
+
371
+ #### Pi 配置 (`[pi]`)
372
+
373
+ | 配置项 | 类型 | 默认值 | 中文说明 |
374
+ |--------|------|--------|----------|
375
+ | `model` | string | (未设置) | 传递给 `--model` |
376
+ | `provider` | string | (未设置) | 传递给 `--provider` |
377
+ | `extra_args` | string[] | `[]` | 额外的 CLI 参数 |
378
+
379
+ #### OpenCode 配置 (`[opencode]`)
380
+
381
+ | 配置项 | 类型 | 默认值 | 中文说明 |
382
+ |--------|------|--------|----------|
383
+ | `model` | string | (未设置) | 可选的模型覆盖 |
384
+
385
+
386
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
387
+
388
+ ## 📋 十一、三种工作流的完整配置示例
389
+
390
+ ### Assistant 工作流(持续聊天)
391
+
392
+ ```toml
393
+ default_engine = "codex"
394
+ transport = "telegram"
395
+
396
+ [transports.telegram]
397
+ bot_token = "YOUR_BOT_TOKEN"
398
+ chat_id = 123456789
399
+ session_mode = "chat" # 自动恢复
400
+ show_resume_line = false # 隐藏恢复行
401
+
402
+ [transports.telegram.topics]
403
+ enabled = false
404
+ scope = "auto"
405
+ ```
406
+
407
+ ### Workspace 工作流(话题分支)
408
+
409
+ ```toml
410
+ default_engine = "codex"
411
+ transport = "telegram"
412
+
413
+ [transports.telegram]
414
+ bot_token = "YOUR_BOT_TOKEN"
415
+ chat_id = -1001234567890 # 论坛群组
416
+ session_mode = "chat"
417
+ show_resume_line = false
418
+
419
+ [transports.telegram.topics]
420
+ enabled = true # 启用话题
421
+ scope = "auto"
422
+
423
+ [projects.my-project]
424
+ path = "~/dev/my-project"
425
+ chat_id = -1001234567890
426
+ ```
427
+
428
+ ### Handoff 工作流(回复继续)
429
+
430
+ ```toml
431
+ default_engine = "codex"
432
+ transport = "telegram"
433
+
434
+ [transports.telegram]
435
+ bot_token = "YOUR_BOT_TOKEN"
436
+ chat_id = 123456789
437
+ session_mode = "stateless" # 回复继续
438
+ show_resume_line = true # 始终显示恢复行
439
+ ```
440
+
441
+ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
442
+
443
+ ## 📝 十二、使用技巧
444
+
445
+ ### 1. 快速切换上下文
446
+
447
+ ```
448
+ /ctx set myproject @feat/new-feature
449
+ ```
450
+
451
+ 之后的所有消息都会在这个项目和分支上下文中执行。
452
+
453
+ ### 2. 使用定时消息
454
+
455
+ 在 Telegram 中安排消息,yee88 会在指定时间执行。
456
+
457
+ ### 3. 查看进度
458
+
459
+ 运行过程中会显示实时进度消息,包含:
460
+ - 正在执行的命令
461
+ - 工具调用
462
+ - 文件变更
463
+ - 已用时间
464
+
465
+ ### 4. 恢复会话
466
+
467
+ 每个完成的运行都会在消息底部显示恢复命令:
468
+
469
+ ```
470
+ codex resume <token>
471
+ ```
472
+
473
+ 复制到终端即可继续会话。
474
+
475
+ ### 5. 多引擎协作
476
+
477
+ ```
478
+ /codex 实现基础功能
479
+ /claude 优化代码结构
480
+ /opencode 添加测试
481
+ ```
@@ -1,13 +1,14 @@
1
1
  [project]
2
2
  name = "yee88"
3
3
  authors = [{name = "yee.wang"}]
4
- version = "0.4.0"
4
+ version = "0.6.0"
5
5
  description = "Telegram bridge for Codex, Claude Code, and other agent CLIs."
6
6
  readme = "README.md"
7
7
  license = { file = "LICENSE" }
8
8
  requires-python = ">=3.14"
9
9
  dependencies = [
10
10
  "anyio>=4.12.0",
11
+ "croniter>=2.0.0",
11
12
  "httpx>=0.28.1",
12
13
  "markdown-it-py",
13
14
  "msgspec>=0.20.0",
@@ -54,6 +55,7 @@ build-backend = "hatchling.build"
54
55
 
55
56
  [tool.hatch.build.targets.wheel]
56
57
  packages = ["src/yee88"]
58
+ include = ["src/yee88/skills/**/*.md"]
57
59
 
58
60
  [dependency-groups]
59
61
  dev = [
@@ -91,6 +91,8 @@ from .config import (
91
91
  config_set,
92
92
  config_unset,
93
93
  )
94
+ from .cron import app as cron_app
95
+ from .reload import reload_command
94
96
 
95
97
 
96
98
  def _load_settings_optional() -> tuple[TakopiSettings | None, Path | None]:
@@ -212,6 +214,8 @@ def create_app() -> typer.Typer:
212
214
  app.command(name="onboarding-paths")(onboarding_paths)
213
215
  app.command(name="plugins")(plugins_cmd)
214
216
  app.add_typer(config_app, name="config")
217
+ app.add_typer(cron_app, name="cron")
218
+ app.command(name="reload")(reload_command)
215
219
  app.callback()(app_main)
216
220
  for engine_id in _engine_ids_for_cli():
217
221
  help_text = f"Run with the {engine_id} engine."