yee88 0.1.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 (261) hide show
  1. yee88-0.1.0/.codex/AGENTS.md +5 -0
  2. yee88-0.1.0/.codex/skills/takopi-release/SKILL.md +67 -0
  3. yee88-0.1.0/.github/workflows/ci.yml +92 -0
  4. yee88-0.1.0/.github/workflows/release.yml +126 -0
  5. yee88-0.1.0/.gitignore +13 -0
  6. yee88-0.1.0/Justfile +23 -0
  7. yee88-0.1.0/LICENSE +21 -0
  8. yee88-0.1.0/PKG-INFO +116 -0
  9. yee88-0.1.0/README.md +63 -0
  10. yee88-0.1.0/changelog.md +410 -0
  11. yee88-0.1.0/docs/assets/favicon.svg +7 -0
  12. yee88-0.1.0/docs/assets/logo.svg +7 -0
  13. yee88-0.1.0/docs/assets/og-image.jpg +0 -0
  14. yee88-0.1.0/docs/assets/takopi.svg +7 -0
  15. yee88-0.1.0/docs/developing.md +26 -0
  16. yee88-0.1.0/docs/explanation/architecture.md +396 -0
  17. yee88-0.1.0/docs/explanation/index.md +43 -0
  18. yee88-0.1.0/docs/explanation/module-map.md +81 -0
  19. yee88-0.1.0/docs/explanation/plugin-system.md +96 -0
  20. yee88-0.1.0/docs/explanation/routing-and-sessions.md +48 -0
  21. yee88-0.1.0/docs/how-to/add-a-runner.md +644 -0
  22. yee88-0.1.0/docs/how-to/chat-sessions.md +68 -0
  23. yee88-0.1.0/docs/how-to/dev-setup.md +32 -0
  24. yee88-0.1.0/docs/how-to/file-transfer.md +71 -0
  25. yee88-0.1.0/docs/how-to/index.md +37 -0
  26. yee88-0.1.0/docs/how-to/projects.md +91 -0
  27. yee88-0.1.0/docs/how-to/route-by-chat.md +47 -0
  28. yee88-0.1.0/docs/how-to/schedule-tasks.md +7 -0
  29. yee88-0.1.0/docs/how-to/switch-engines.md +42 -0
  30. yee88-0.1.0/docs/how-to/topics.md +108 -0
  31. yee88-0.1.0/docs/how-to/troubleshooting.md +17 -0
  32. yee88-0.1.0/docs/how-to/voice-notes.md +43 -0
  33. yee88-0.1.0/docs/how-to/worktrees.md +51 -0
  34. yee88-0.1.0/docs/how-to/write-a-plugin.md +148 -0
  35. yee88-0.1.0/docs/index.md +85 -0
  36. yee88-0.1.0/docs/javascripts/hero-chat.js +159 -0
  37. yee88-0.1.0/docs/overrides/.icons/takopi/takopi.svg +7 -0
  38. yee88-0.1.0/docs/overrides/main.html +34 -0
  39. yee88-0.1.0/docs/plugins.md +20 -0
  40. yee88-0.1.0/docs/reference/agents/index.md +7 -0
  41. yee88-0.1.0/docs/reference/agents/invariants.md +35 -0
  42. yee88-0.1.0/docs/reference/agents/repo-map.md +40 -0
  43. yee88-0.1.0/docs/reference/commands-and-directives.md +80 -0
  44. yee88-0.1.0/docs/reference/config.md +239 -0
  45. yee88-0.1.0/docs/reference/context-resolution.md +178 -0
  46. yee88-0.1.0/docs/reference/env-vars.md +26 -0
  47. yee88-0.1.0/docs/reference/index.md +65 -0
  48. yee88-0.1.0/docs/reference/plugin-api.md +285 -0
  49. yee88-0.1.0/docs/reference/plugins.md +16 -0
  50. yee88-0.1.0/docs/reference/runners/claude/runner.md +394 -0
  51. yee88-0.1.0/docs/reference/runners/claude/stream-json-cheatsheet.md +108 -0
  52. yee88-0.1.0/docs/reference/runners/claude/takopi-events.md +236 -0
  53. yee88-0.1.0/docs/reference/runners/codex/exec-json-cheatsheet.md +345 -0
  54. yee88-0.1.0/docs/reference/runners/codex/takopi-events.md +432 -0
  55. yee88-0.1.0/docs/reference/runners/index.md +9 -0
  56. yee88-0.1.0/docs/reference/runners/opencode/runner.md +55 -0
  57. yee88-0.1.0/docs/reference/runners/opencode/stream-json-cheatsheet.md +145 -0
  58. yee88-0.1.0/docs/reference/runners/opencode/takopi-events.md +82 -0
  59. yee88-0.1.0/docs/reference/runners/pi/runner.md +146 -0
  60. yee88-0.1.0/docs/reference/runners/pi/stream-json-cheatsheet.md +73 -0
  61. yee88-0.1.0/docs/reference/runners/pi/takopi-events.md +164 -0
  62. yee88-0.1.0/docs/reference/specification.md +550 -0
  63. yee88-0.1.0/docs/reference/transports/telegram.md +284 -0
  64. yee88-0.1.0/docs/stylesheets/admonitions.css +42 -0
  65. yee88-0.1.0/docs/stylesheets/hero-chat.css +227 -0
  66. yee88-0.1.0/docs/stylesheets/workflow-preview.css +98 -0
  67. yee88-0.1.0/docs/tutorials/conversation-modes.md +123 -0
  68. yee88-0.1.0/docs/tutorials/first-run.md +178 -0
  69. yee88-0.1.0/docs/tutorials/index.md +8 -0
  70. yee88-0.1.0/docs/tutorials/install.md +401 -0
  71. yee88-0.1.0/docs/tutorials/multi-engine.md +244 -0
  72. yee88-0.1.0/docs/tutorials/projects-and-branches.md +227 -0
  73. yee88-0.1.0/docs/user-guide.md +26 -0
  74. yee88-0.1.0/pyproject.toml +87 -0
  75. yee88-0.1.0/readme.md +63 -0
  76. yee88-0.1.0/scripts/commit_notify.py +81 -0
  77. yee88-0.1.0/scripts/docs_build_cf.sh +8 -0
  78. yee88-0.1.0/scripts/docs_prebuild.py +20 -0
  79. yee88-0.1.0/scripts/onboarding_preview.py +235 -0
  80. yee88-0.1.0/scripts/release_notify.py +49 -0
  81. yee88-0.1.0/src/takopi/__init__.py +1 -0
  82. yee88-0.1.0/src/takopi/api.py +116 -0
  83. yee88-0.1.0/src/takopi/backends.py +25 -0
  84. yee88-0.1.0/src/takopi/backends_helpers.py +14 -0
  85. yee88-0.1.0/src/takopi/cli/__init__.py +228 -0
  86. yee88-0.1.0/src/takopi/cli/config.py +320 -0
  87. yee88-0.1.0/src/takopi/cli/doctor.py +173 -0
  88. yee88-0.1.0/src/takopi/cli/init.py +113 -0
  89. yee88-0.1.0/src/takopi/cli/onboarding_cmd.py +126 -0
  90. yee88-0.1.0/src/takopi/cli/plugins.py +196 -0
  91. yee88-0.1.0/src/takopi/cli/run.py +419 -0
  92. yee88-0.1.0/src/takopi/cli/topic.py +355 -0
  93. yee88-0.1.0/src/takopi/commands.py +134 -0
  94. yee88-0.1.0/src/takopi/config.py +142 -0
  95. yee88-0.1.0/src/takopi/config_migrations.py +124 -0
  96. yee88-0.1.0/src/takopi/config_watch.py +146 -0
  97. yee88-0.1.0/src/takopi/context.py +9 -0
  98. yee88-0.1.0/src/takopi/directives.py +146 -0
  99. yee88-0.1.0/src/takopi/engines.py +53 -0
  100. yee88-0.1.0/src/takopi/events.py +170 -0
  101. yee88-0.1.0/src/takopi/ids.py +17 -0
  102. yee88-0.1.0/src/takopi/lockfile.py +158 -0
  103. yee88-0.1.0/src/takopi/logging.py +283 -0
  104. yee88-0.1.0/src/takopi/markdown.py +298 -0
  105. yee88-0.1.0/src/takopi/model.py +77 -0
  106. yee88-0.1.0/src/takopi/plugins.py +312 -0
  107. yee88-0.1.0/src/takopi/presenter.py +25 -0
  108. yee88-0.1.0/src/takopi/progress.py +99 -0
  109. yee88-0.1.0/src/takopi/router.py +113 -0
  110. yee88-0.1.0/src/takopi/runner.py +712 -0
  111. yee88-0.1.0/src/takopi/runner_bridge.py +619 -0
  112. yee88-0.1.0/src/takopi/runners/__init__.py +1 -0
  113. yee88-0.1.0/src/takopi/runners/claude.py +483 -0
  114. yee88-0.1.0/src/takopi/runners/codex.py +656 -0
  115. yee88-0.1.0/src/takopi/runners/mock.py +221 -0
  116. yee88-0.1.0/src/takopi/runners/opencode.py +505 -0
  117. yee88-0.1.0/src/takopi/runners/pi.py +523 -0
  118. yee88-0.1.0/src/takopi/runners/run_options.py +39 -0
  119. yee88-0.1.0/src/takopi/runners/tool_actions.py +90 -0
  120. yee88-0.1.0/src/takopi/runtime_loader.py +207 -0
  121. yee88-0.1.0/src/takopi/scheduler.py +159 -0
  122. yee88-0.1.0/src/takopi/schemas/__init__.py +1 -0
  123. yee88-0.1.0/src/takopi/schemas/claude.py +238 -0
  124. yee88-0.1.0/src/takopi/schemas/codex.py +169 -0
  125. yee88-0.1.0/src/takopi/schemas/opencode.py +51 -0
  126. yee88-0.1.0/src/takopi/schemas/pi.py +117 -0
  127. yee88-0.1.0/src/takopi/settings.py +360 -0
  128. yee88-0.1.0/src/takopi/telegram/__init__.py +20 -0
  129. yee88-0.1.0/src/takopi/telegram/api_models.py +37 -0
  130. yee88-0.1.0/src/takopi/telegram/api_schemas.py +152 -0
  131. yee88-0.1.0/src/takopi/telegram/backend.py +163 -0
  132. yee88-0.1.0/src/takopi/telegram/bridge.py +425 -0
  133. yee88-0.1.0/src/takopi/telegram/chat_prefs.py +242 -0
  134. yee88-0.1.0/src/takopi/telegram/chat_sessions.py +112 -0
  135. yee88-0.1.0/src/takopi/telegram/client.py +409 -0
  136. yee88-0.1.0/src/takopi/telegram/client_api.py +539 -0
  137. yee88-0.1.0/src/takopi/telegram/commands/__init__.py +12 -0
  138. yee88-0.1.0/src/takopi/telegram/commands/agent.py +196 -0
  139. yee88-0.1.0/src/takopi/telegram/commands/cancel.py +116 -0
  140. yee88-0.1.0/src/takopi/telegram/commands/dispatch.py +111 -0
  141. yee88-0.1.0/src/takopi/telegram/commands/executor.py +449 -0
  142. yee88-0.1.0/src/takopi/telegram/commands/file_transfer.py +586 -0
  143. yee88-0.1.0/src/takopi/telegram/commands/handlers.py +45 -0
  144. yee88-0.1.0/src/takopi/telegram/commands/media.py +143 -0
  145. yee88-0.1.0/src/takopi/telegram/commands/menu.py +139 -0
  146. yee88-0.1.0/src/takopi/telegram/commands/model.py +215 -0
  147. yee88-0.1.0/src/takopi/telegram/commands/overrides.py +159 -0
  148. yee88-0.1.0/src/takopi/telegram/commands/parse.py +30 -0
  149. yee88-0.1.0/src/takopi/telegram/commands/plan.py +16 -0
  150. yee88-0.1.0/src/takopi/telegram/commands/reasoning.py +234 -0
  151. yee88-0.1.0/src/takopi/telegram/commands/reply.py +23 -0
  152. yee88-0.1.0/src/takopi/telegram/commands/topics.py +332 -0
  153. yee88-0.1.0/src/takopi/telegram/commands/trigger.py +143 -0
  154. yee88-0.1.0/src/takopi/telegram/context.py +140 -0
  155. yee88-0.1.0/src/takopi/telegram/engine_defaults.py +86 -0
  156. yee88-0.1.0/src/takopi/telegram/engine_overrides.py +105 -0
  157. yee88-0.1.0/src/takopi/telegram/files.py +178 -0
  158. yee88-0.1.0/src/takopi/telegram/loop.py +1822 -0
  159. yee88-0.1.0/src/takopi/telegram/onboarding.py +1088 -0
  160. yee88-0.1.0/src/takopi/telegram/outbox.py +177 -0
  161. yee88-0.1.0/src/takopi/telegram/parsing.py +239 -0
  162. yee88-0.1.0/src/takopi/telegram/render.py +198 -0
  163. yee88-0.1.0/src/takopi/telegram/state_store.py +88 -0
  164. yee88-0.1.0/src/takopi/telegram/topic_state.py +334 -0
  165. yee88-0.1.0/src/takopi/telegram/topics.py +256 -0
  166. yee88-0.1.0/src/takopi/telegram/trigger_mode.py +68 -0
  167. yee88-0.1.0/src/takopi/telegram/types.py +63 -0
  168. yee88-0.1.0/src/takopi/telegram/voice.py +110 -0
  169. yee88-0.1.0/src/takopi/transport.py +53 -0
  170. yee88-0.1.0/src/takopi/transport_runtime.py +323 -0
  171. yee88-0.1.0/src/takopi/transports.py +76 -0
  172. yee88-0.1.0/src/takopi/utils/__init__.py +1 -0
  173. yee88-0.1.0/src/takopi/utils/git.py +87 -0
  174. yee88-0.1.0/src/takopi/utils/json_state.py +21 -0
  175. yee88-0.1.0/src/takopi/utils/paths.py +47 -0
  176. yee88-0.1.0/src/takopi/utils/streams.py +44 -0
  177. yee88-0.1.0/src/takopi/utils/subprocess.py +86 -0
  178. yee88-0.1.0/src/takopi/worktrees.py +135 -0
  179. yee88-0.1.0/tests/__init__.py +1 -0
  180. yee88-0.1.0/tests/conftest.py +27 -0
  181. yee88-0.1.0/tests/factories.py +64 -0
  182. yee88-0.1.0/tests/fixtures/claude_stream_json_session.jsonl +9 -0
  183. yee88-0.1.0/tests/fixtures/codex_exec_json_all_formats.jsonl +23 -0
  184. yee88-0.1.0/tests/fixtures/codex_exec_json_all_formats.txt +32 -0
  185. yee88-0.1.0/tests/fixtures/opencode_run_json.jsonl +5 -0
  186. yee88-0.1.0/tests/fixtures/opencode_stream_error.jsonl +2 -0
  187. yee88-0.1.0/tests/fixtures/opencode_stream_success.jsonl +6 -0
  188. yee88-0.1.0/tests/fixtures/opencode_stream_success_no_reason.jsonl +3 -0
  189. yee88-0.1.0/tests/fixtures/pi_print_mode_events.jsonl +50 -0
  190. yee88-0.1.0/tests/fixtures/pi_stream_error.jsonl +3 -0
  191. yee88-0.1.0/tests/fixtures/pi_stream_success.jsonl +8 -0
  192. yee88-0.1.0/tests/plugin_fixtures.py +48 -0
  193. yee88-0.1.0/tests/telegram_fakes.py +288 -0
  194. yee88-0.1.0/tests/test_api_exports.py +7 -0
  195. yee88-0.1.0/tests/test_auto_router.py +48 -0
  196. yee88-0.1.0/tests/test_claude_runner.py +425 -0
  197. yee88-0.1.0/tests/test_claude_schema.py +41 -0
  198. yee88-0.1.0/tests/test_cli_auto_router.py +178 -0
  199. yee88-0.1.0/tests/test_cli_chat_id.py +70 -0
  200. yee88-0.1.0/tests/test_cli_commands.py +240 -0
  201. yee88-0.1.0/tests/test_cli_config.py +205 -0
  202. yee88-0.1.0/tests/test_cli_doctor.py +125 -0
  203. yee88-0.1.0/tests/test_cli_helpers.py +194 -0
  204. yee88-0.1.0/tests/test_codex_runner_helpers.py +204 -0
  205. yee88-0.1.0/tests/test_codex_schema.py +44 -0
  206. yee88-0.1.0/tests/test_codex_tool_result_summary.py +124 -0
  207. yee88-0.1.0/tests/test_command_registry.py +47 -0
  208. yee88-0.1.0/tests/test_config_store.py +40 -0
  209. yee88-0.1.0/tests/test_config_watch.py +116 -0
  210. yee88-0.1.0/tests/test_engine_discovery.py +68 -0
  211. yee88-0.1.0/tests/test_exec_bridge.py +441 -0
  212. yee88-0.1.0/tests/test_exec_render.py +408 -0
  213. yee88-0.1.0/tests/test_exec_runner.py +432 -0
  214. yee88-0.1.0/tests/test_git_utils.py +131 -0
  215. yee88-0.1.0/tests/test_lockfile.py +82 -0
  216. yee88-0.1.0/tests/test_onboarding.py +77 -0
  217. yee88-0.1.0/tests/test_onboarding_helpers.py +540 -0
  218. yee88-0.1.0/tests/test_onboarding_interactive.py +305 -0
  219. yee88-0.1.0/tests/test_opencode_runner.py +368 -0
  220. yee88-0.1.0/tests/test_opencode_schema.py +40 -0
  221. yee88-0.1.0/tests/test_paths.py +51 -0
  222. yee88-0.1.0/tests/test_pi_runner.py +230 -0
  223. yee88-0.1.0/tests/test_pi_schema.py +39 -0
  224. yee88-0.1.0/tests/test_plugins.py +210 -0
  225. yee88-0.1.0/tests/test_projects_config.py +143 -0
  226. yee88-0.1.0/tests/test_rendering.py +30 -0
  227. yee88-0.1.0/tests/test_runner_contract.py +105 -0
  228. yee88-0.1.0/tests/test_runner_run_options.py +59 -0
  229. yee88-0.1.0/tests/test_runner_utils.py +415 -0
  230. yee88-0.1.0/tests/test_runtime_loader.py +52 -0
  231. yee88-0.1.0/tests/test_settings.py +237 -0
  232. yee88-0.1.0/tests/test_settings_contract.py +30 -0
  233. yee88-0.1.0/tests/test_subprocess.py +28 -0
  234. yee88-0.1.0/tests/test_telegram_agent_trigger_commands.py +284 -0
  235. yee88-0.1.0/tests/test_telegram_backend.py +185 -0
  236. yee88-0.1.0/tests/test_telegram_bridge.py +3458 -0
  237. yee88-0.1.0/tests/test_telegram_chat_prefs.py +27 -0
  238. yee88-0.1.0/tests/test_telegram_chat_sessions.py +69 -0
  239. yee88-0.1.0/tests/test_telegram_client.py +232 -0
  240. yee88-0.1.0/tests/test_telegram_client_api.py +178 -0
  241. yee88-0.1.0/tests/test_telegram_context_helpers.py +167 -0
  242. yee88-0.1.0/tests/test_telegram_engine_defaults.py +77 -0
  243. yee88-0.1.0/tests/test_telegram_engine_overrides.py +97 -0
  244. yee88-0.1.0/tests/test_telegram_file_transfer_helpers.py +1173 -0
  245. yee88-0.1.0/tests/test_telegram_files.py +111 -0
  246. yee88-0.1.0/tests/test_telegram_incoming.py +317 -0
  247. yee88-0.1.0/tests/test_telegram_media_command.py +212 -0
  248. yee88-0.1.0/tests/test_telegram_polling.py +51 -0
  249. yee88-0.1.0/tests/test_telegram_queue.py +450 -0
  250. yee88-0.1.0/tests/test_telegram_topic_state.py +75 -0
  251. yee88-0.1.0/tests/test_telegram_topics_command.py +189 -0
  252. yee88-0.1.0/tests/test_telegram_topics_helpers.py +34 -0
  253. yee88-0.1.0/tests/test_telegram_trigger_mode.py +138 -0
  254. yee88-0.1.0/tests/test_telegram_voice.py +352 -0
  255. yee88-0.1.0/tests/test_tool_actions.py +78 -0
  256. yee88-0.1.0/tests/test_transport.py +39 -0
  257. yee88-0.1.0/tests/test_transport_registry.py +67 -0
  258. yee88-0.1.0/tests/test_transport_runtime.py +163 -0
  259. yee88-0.1.0/tests/test_worktrees.py +103 -0
  260. yee88-0.1.0/uv.lock +1197 -0
  261. yee88-0.1.0/zensical.toml +177 -0
@@ -0,0 +1,5 @@
1
+ after you finish work, commit with a conventional message. only commit the files you edited.
2
+ always run `just check` before code commits.
3
+ if you fix anything from `just check`, rerun it and confirm it passes before committing.
4
+ when using gh to edit or create PR descriptions, prefer `--body-file` to preserve newlines.
5
+ always include a "Manual testing" checklist section in PRs.
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: takopi-release
3
+ description: Prepare and ship a Takopi release. Use when asked to cut a release, bump release versions, update changelog/spec/readme, tag v<major.minor.patch>, or trigger the GitHub release workflow.
4
+ ---
5
+
6
+ # Takopi Release
7
+
8
+ ## Overview
9
+
10
+ Prepare a tagged release that matches the GitHub Actions release workflow. The workflow requires the tag version to match both `pyproject.toml` and `src/takopi/__init__.py`.
11
+
12
+ ## Workflow
13
+
14
+ ### 1) Choose version + date
15
+
16
+ Pick the release version (major.minor.patch) and the release date (YYYY-MM-DD) for changelog/spec headers.
17
+ If the current version has a `.dev` suffix, assume the target release version is the same version without the suffix, as long as that tag does not already exist.
18
+
19
+ ### 2) Update changelog
20
+
21
+ Update `changelog.md` by adding a new top section. Before writing it, study the diff between the previous tag and the new release to rank changes; put user-facing changes first.
22
+
23
+ - `## v<major.minor.patch> (YYYY-MM-DD)`
24
+ - Include subsections like `changes`, `fixes`, `breaking`, `docs` as needed.
25
+ - Keep entries short and include PR links when available (match existing style).
26
+
27
+ ### 3) Bump versions
28
+
29
+ Update version strings to match the release tag:
30
+
31
+ - `pyproject.toml`: `project.version = "<major.minor.patch>"`
32
+ - `src/takopi/__init__.py`: `__version__ = "<major.minor.patch>"`
33
+ - `uv.lock`: refresh so the root package version matches (run `uv lock` or `uv sync`).
34
+
35
+ ### 4) Update spec + docs
36
+
37
+ Update `docs/specification.md` to match the release:
38
+
39
+ - Header: `# Takopi Specification v<major.minor.patch> [YYYY-MM-DD]`
40
+ - Replace `Takopi v<old>` and `Out of scope for v<old>` lines with the new version.
41
+ - Add a changelog entry like `- No normative changes; align spec version with the v<major.minor.patch> release.` unless the spec itself changed.
42
+
43
+ If the release highlights new features, update `readme.md` accordingly (see v0.9.0 release).
44
+
45
+ ### 5) Run checks
46
+
47
+ Run the standard checks before committing:
48
+
49
+ - `just check` (ruff/ty/pytest)
50
+
51
+ ### 6) Commit + tag
52
+
53
+ Commit the release using conventional commits:
54
+
55
+ - Commit message: `chore(release): v<major.minor.patch>`
56
+ - Tag: `git tag v<major.minor.patch>`
57
+
58
+ Push the tag to trigger `.github/workflows/release.yml` (build, PyPI publish, GitHub release).
59
+
60
+ ### 7) Optional post-release bump
61
+
62
+ If you keep a dev version between releases, bump the minor version (reset patch to 0) and commit (`chore: bump version to ...`).
63
+
64
+ ## Notes
65
+
66
+ - The release workflow checks that the tag matches `pyproject.toml` and `src/takopi/__init__.py`.
67
+ - Keep dates consistent across `changelog.md` and `docs/specification.md`.
@@ -0,0 +1,92 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - "master"
7
+ pull_request:
8
+
9
+ concurrency:
10
+ group: ${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ checks:
15
+ name: ${{ matrix.task }}
16
+ runs-on: ubuntu-latest
17
+ strategy:
18
+ fail-fast: false
19
+ matrix:
20
+ include:
21
+ - task: format
22
+ do_sync: true
23
+ command: uv run --no-sync ruff format --check --diff src tests
24
+ sync_args: --no-install-project
25
+ - task: ruff
26
+ do_sync: true
27
+ command: uv run --no-sync ruff check src tests --output-format=github
28
+ sync_args: --no-install-project
29
+ - task: ty
30
+ do_sync: true
31
+ command: uv run --no-sync ty check src tests
32
+ sync_args: --no-install-project
33
+ - task: pytest
34
+ do_sync: true
35
+ command: uv run --no-sync pytest
36
+ sync_args: ""
37
+ - task: build
38
+ do_sync: false
39
+ command: uv build
40
+ sync_args: ""
41
+ - task: docs
42
+ do_sync: true
43
+ command: uv run --no-sync python scripts/docs_prebuild.py && uv run --no-sync zensical build --clean
44
+ sync_args: --no-install-project --group docs
45
+
46
+ steps:
47
+ - name: Checkout
48
+ uses: actions/checkout@v5
49
+
50
+ - name: Install uv
51
+ uses: astral-sh/setup-uv@v7
52
+ with:
53
+ python-version: "3.14"
54
+ enable-cache: true
55
+
56
+ - name: Install dependencies
57
+ if: matrix.do_sync
58
+ run: uv sync --frozen ${{ matrix.sync_args }}
59
+
60
+ - name: Run check
61
+ run: ${{ matrix.command }}
62
+
63
+ - name: Add coverage to summary
64
+ if: ${{ always() && matrix.task == 'pytest' }}
65
+ run: |
66
+ {
67
+ echo "## Coverage"
68
+ echo ""
69
+ uv run --no-sync python -m coverage report || true
70
+ } >> "$GITHUB_STEP_SUMMARY"
71
+
72
+ notify-commit:
73
+ name: notify-commit
74
+ runs-on: ubuntu-latest
75
+ needs: checks
76
+ if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && needs.checks.result == 'success' }}
77
+ steps:
78
+ - name: Checkout
79
+ uses: actions/checkout@v5
80
+
81
+ - name: Install uv
82
+ uses: astral-sh/setup-uv@v7
83
+ with:
84
+ python-version: "3.14"
85
+ enable-cache: true
86
+
87
+ - name: Send Telegram notification
88
+ run: uv run scripts/commit_notify.py
89
+ env:
90
+ REPO: ${{ github.repository }}
91
+ TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
92
+ TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
@@ -0,0 +1,126 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ build:
10
+ name: Build distributions
11
+ runs-on: ubuntu-latest
12
+ permissions:
13
+ contents: read
14
+ steps:
15
+ - name: Checkout
16
+ uses: actions/checkout@v5
17
+
18
+ - name: Install uv
19
+ uses: astral-sh/setup-uv@v7
20
+ with:
21
+ python-version: "3.14"
22
+ enable-cache: true
23
+
24
+ - name: Check tag matches project version
25
+ run: |
26
+ uv run --no-project python - <<'PY'
27
+ import os
28
+ import re
29
+ import tomllib
30
+ from pathlib import Path
31
+
32
+ tag = os.environ.get('GITHUB_REF_NAME', '')
33
+ tag_version = tag[1:] if tag.startswith('v') else tag
34
+
35
+ pyproject = tomllib.loads(Path('pyproject.toml').read_text(encoding='utf-8'))
36
+ project_version = pyproject['project']['version']
37
+
38
+ init_version = None
39
+ init_path = Path('src') / 'takopi' / '__init__.py'
40
+ if init_path.is_file():
41
+ m = re.search(r'__version__\s*=\s*"([^"]+)"', init_path.read_text(encoding='utf-8'))
42
+ if m:
43
+ init_version = m.group(1)
44
+
45
+ if project_version != tag_version:
46
+ raise SystemExit(f"Tag {tag!r} does not match pyproject version {project_version!r}")
47
+ if init_version and init_version != project_version:
48
+ raise SystemExit(
49
+ f"src/takopi/__init__.py __version__ {init_version!r} does not match pyproject version {project_version!r}"
50
+ )
51
+
52
+ print(f"OK: tag {tag!r} matches version {project_version!r}")
53
+ PY
54
+
55
+ - name: Run tests
56
+ run: uv run pytest
57
+
58
+ - name: Build (wheel + sdist)
59
+ run: uv build
60
+
61
+ - name: Upload dist artifacts
62
+ uses: actions/upload-artifact@v4
63
+ with:
64
+ name: dist
65
+ path: dist/
66
+ if-no-files-found: error
67
+
68
+ publish:
69
+ name: Publish to PyPI (trusted publishing)
70
+ needs: build
71
+ runs-on: ubuntu-latest
72
+ environment:
73
+ name: pypi
74
+ url: https://pypi.org/p/takopi
75
+ permissions:
76
+ contents: read
77
+ id-token: write
78
+ steps:
79
+ - name: Download dist artifacts
80
+ uses: actions/download-artifact@v4
81
+ with:
82
+ name: dist
83
+ path: dist/
84
+
85
+ - name: Publish package distributions to PyPI
86
+ uses: pypa/gh-action-pypi-publish@release/v1
87
+ with:
88
+ packages-dir: dist/
89
+ skip-existing: true
90
+
91
+ github-release:
92
+ name: Create GitHub Release
93
+ needs: publish
94
+ runs-on: ubuntu-latest
95
+ permissions:
96
+ contents: write
97
+ steps:
98
+ - name: Checkout
99
+ uses: actions/checkout@v5
100
+
101
+ - name: Install uv
102
+ uses: astral-sh/setup-uv@v7
103
+ with:
104
+ python-version: "3.14"
105
+ enable-cache: true
106
+
107
+ - name: Download dist artifacts
108
+ uses: actions/download-artifact@v4
109
+ with:
110
+ name: dist
111
+ path: dist/
112
+
113
+ - name: Create GitHub release and upload artifacts
114
+ uses: softprops/action-gh-release@v2
115
+ with:
116
+ generate_release_notes: true
117
+ files: |
118
+ dist/*
119
+
120
+ - name: Notify release
121
+ run: uv run scripts/release_notify.py
122
+ env:
123
+ REPO: ${{ github.repository }}
124
+ TAG_NAME: ${{ github.ref_name }}
125
+ TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
126
+ TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
yee88-0.1.0/.gitignore ADDED
@@ -0,0 +1,13 @@
1
+ dist/
2
+ .venv/
3
+ *.egg-info/
4
+ __pycache__/
5
+ .pytest_cache/
6
+ .ruff_cache/
7
+ .coverage
8
+ .mutmut-cache/
9
+ mutants/
10
+ .worktrees/
11
+ research/
12
+ _site/
13
+ docs/reference/changelog.md
yee88-0.1.0/Justfile ADDED
@@ -0,0 +1,23 @@
1
+ check:
2
+ uv run ruff format --check src tests
3
+ uv run ruff check src tests
4
+ uv run ty check src tests
5
+ uv run pytest
6
+
7
+ mutate:
8
+ uv run mutmut run
9
+
10
+ docs-serve:
11
+ uv run --no-sync python scripts/docs_prebuild.py
12
+ uv run --group docs zensical serve
13
+
14
+ docs-build:
15
+ uv run --no-sync python scripts/docs_prebuild.py
16
+ uv run --group docs zensical build
17
+
18
+ bundle:
19
+ #!/usr/bin/env bash
20
+ set -euo pipefail
21
+ bundle="takopi.git.bundle"
22
+ git bundle create "$bundle" --all
23
+ open -R "$bundle"
yee88-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 banteg
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
yee88-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,116 @@
1
+ Metadata-Version: 2.4
2
+ Name: yee88
3
+ Version: 0.1.0
4
+ Summary: Telegram bridge for Codex, Claude Code, and other agent CLIs.
5
+ Project-URL: Homepage, https://github.com/banteg/takopi
6
+ Project-URL: Documentation, https://takopi.dev/
7
+ Project-URL: Repository, https://github.com/banteg/takopi
8
+ Project-URL: Issues, https://github.com/banteg/takopi/issues
9
+ Author: yee.wang
10
+ License: MIT License
11
+
12
+ Copyright (c) 2025 banteg
13
+
14
+ Permission is hereby granted, free of charge, to any person obtaining a copy
15
+ of this software and associated documentation files (the "Software"), to deal
16
+ in the Software without restriction, including without limitation the rights
17
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18
+ copies of the Software, and to permit persons to whom the Software is
19
+ furnished to do so, subject to the following conditions:
20
+
21
+ The above copyright notice and this permission notice shall be included in all
22
+ copies or substantial portions of the Software.
23
+
24
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30
+ SOFTWARE.
31
+ License-File: LICENSE
32
+ Classifier: License :: OSI Approved :: MIT License
33
+ Classifier: Operating System :: OS Independent
34
+ Classifier: Programming Language :: Python :: 3
35
+ Classifier: Programming Language :: Python :: 3 :: Only
36
+ Classifier: Programming Language :: Python :: 3.14
37
+ Requires-Python: >=3.14
38
+ Requires-Dist: anyio>=4.12.0
39
+ Requires-Dist: httpx>=0.28.1
40
+ Requires-Dist: markdown-it-py
41
+ Requires-Dist: msgspec>=0.20.0
42
+ Requires-Dist: openai>=2.15.0
43
+ Requires-Dist: pydantic-settings>=2.12.0
44
+ Requires-Dist: pydantic>=2.12.5
45
+ Requires-Dist: questionary>=2.1.1
46
+ Requires-Dist: rich>=14.2.0
47
+ Requires-Dist: structlog>=25.5.0
48
+ Requires-Dist: sulguk>=0.11.1
49
+ Requires-Dist: tomli-w>=1.2.0
50
+ Requires-Dist: typer>=0.21.0
51
+ Requires-Dist: watchfiles>=0.21.0
52
+ Description-Content-Type: text/markdown
53
+
54
+ # yee88
55
+
56
+ telegram bridge for codex, claude code, opencode, pi.
57
+
58
+ ## quickstart
59
+
60
+ ```sh
61
+ # install
62
+ uv tool install -U yee88
63
+
64
+ # first run - follow the setup wizard
65
+ yee88
66
+
67
+ # in any git repo - create a topic and start
68
+ cd ~/your-project
69
+ yee88 topic init
70
+ yee88
71
+ ```
72
+
73
+ ## features
74
+
75
+ - projects and worktrees: work on multiple repos/branches simultaneously, branches are git worktrees
76
+ - stateless resume: continue in chat or copy the resume line to pick up in terminal
77
+ - progress streaming: commands, tools, file changes, elapsed time
78
+ - parallel runs across agent sessions, per-agent-session queue
79
+ - works with telegram features like voice notes and scheduled messages
80
+ - file transfer: send files to the repo or fetch files/dirs back
81
+ - group chats and topics: map group topics to repo/branch contexts
82
+ - works with existing anthropic and openai subscriptions
83
+
84
+ ## requirements
85
+
86
+ `uv` for installation (`curl -LsSf https://astral.sh/uv/install.sh | sh`)
87
+
88
+ python 3.14+ (`uv python install 3.14`)
89
+
90
+ at least one engine on PATH: `codex`, `claude`, `opencode`, or `pi`
91
+
92
+ ## usage
93
+
94
+ ```sh
95
+ cd ~/dev/happy-gadgets
96
+ yee88
97
+ ```
98
+
99
+ send a message to your bot. prefix with `/codex`, `/claude`, `/opencode`, or `/pi` to pick an engine. reply to continue a thread.
100
+
101
+ register a project with `yee88 init happy-gadgets`, then target it from anywhere with `/happy-gadgets hard reset the timeline`.
102
+
103
+ mention a branch to run an agent in a dedicated worktree `/happy-gadgets @feat/memory-box freeze artifacts forever`.
104
+
105
+ inspect or update settings with `yee88 config list`, `yee88 config get`, and `yee88 config set`.
106
+
107
+ ## plugins
108
+
109
+ takopi supports entrypoint-based plugins for engines, transports, and commands.
110
+
111
+ see [`docs/how-to/write-a-plugin.md`](docs/how-to/write-a-plugin.md) and [`docs/reference/plugin-api.md`](docs/reference/plugin-api.md).
112
+
113
+ ## development
114
+
115
+ see [`docs/reference/specification.md`](docs/reference/specification.md) and [`docs/developing.md`](docs/developing.md).
116
+
yee88-0.1.0/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # yee88
2
+
3
+ telegram bridge for codex, claude code, opencode, pi.
4
+
5
+ ## quickstart
6
+
7
+ ```sh
8
+ # install
9
+ uv tool install -U yee88
10
+
11
+ # first run - follow the setup wizard
12
+ yee88
13
+
14
+ # in any git repo - create a topic and start
15
+ cd ~/your-project
16
+ yee88 topic init
17
+ yee88
18
+ ```
19
+
20
+ ## features
21
+
22
+ - projects and worktrees: work on multiple repos/branches simultaneously, branches are git worktrees
23
+ - stateless resume: continue in chat or copy the resume line to pick up in terminal
24
+ - progress streaming: commands, tools, file changes, elapsed time
25
+ - parallel runs across agent sessions, per-agent-session queue
26
+ - works with telegram features like voice notes and scheduled messages
27
+ - file transfer: send files to the repo or fetch files/dirs back
28
+ - group chats and topics: map group topics to repo/branch contexts
29
+ - works with existing anthropic and openai subscriptions
30
+
31
+ ## requirements
32
+
33
+ `uv` for installation (`curl -LsSf https://astral.sh/uv/install.sh | sh`)
34
+
35
+ python 3.14+ (`uv python install 3.14`)
36
+
37
+ at least one engine on PATH: `codex`, `claude`, `opencode`, or `pi`
38
+
39
+ ## usage
40
+
41
+ ```sh
42
+ cd ~/dev/happy-gadgets
43
+ yee88
44
+ ```
45
+
46
+ send a message to your bot. prefix with `/codex`, `/claude`, `/opencode`, or `/pi` to pick an engine. reply to continue a thread.
47
+
48
+ register a project with `yee88 init happy-gadgets`, then target it from anywhere with `/happy-gadgets hard reset the timeline`.
49
+
50
+ mention a branch to run an agent in a dedicated worktree `/happy-gadgets @feat/memory-box freeze artifacts forever`.
51
+
52
+ inspect or update settings with `yee88 config list`, `yee88 config get`, and `yee88 config set`.
53
+
54
+ ## plugins
55
+
56
+ takopi supports entrypoint-based plugins for engines, transports, and commands.
57
+
58
+ see [`docs/how-to/write-a-plugin.md`](docs/how-to/write-a-plugin.md) and [`docs/reference/plugin-api.md`](docs/reference/plugin-api.md).
59
+
60
+ ## development
61
+
62
+ see [`docs/reference/specification.md`](docs/reference/specification.md) and [`docs/developing.md`](docs/developing.md).
63
+