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.
- yee88-0.1.0/.codex/AGENTS.md +5 -0
- yee88-0.1.0/.codex/skills/takopi-release/SKILL.md +67 -0
- yee88-0.1.0/.github/workflows/ci.yml +92 -0
- yee88-0.1.0/.github/workflows/release.yml +126 -0
- yee88-0.1.0/.gitignore +13 -0
- yee88-0.1.0/Justfile +23 -0
- yee88-0.1.0/LICENSE +21 -0
- yee88-0.1.0/PKG-INFO +116 -0
- yee88-0.1.0/README.md +63 -0
- yee88-0.1.0/changelog.md +410 -0
- yee88-0.1.0/docs/assets/favicon.svg +7 -0
- yee88-0.1.0/docs/assets/logo.svg +7 -0
- yee88-0.1.0/docs/assets/og-image.jpg +0 -0
- yee88-0.1.0/docs/assets/takopi.svg +7 -0
- yee88-0.1.0/docs/developing.md +26 -0
- yee88-0.1.0/docs/explanation/architecture.md +396 -0
- yee88-0.1.0/docs/explanation/index.md +43 -0
- yee88-0.1.0/docs/explanation/module-map.md +81 -0
- yee88-0.1.0/docs/explanation/plugin-system.md +96 -0
- yee88-0.1.0/docs/explanation/routing-and-sessions.md +48 -0
- yee88-0.1.0/docs/how-to/add-a-runner.md +644 -0
- yee88-0.1.0/docs/how-to/chat-sessions.md +68 -0
- yee88-0.1.0/docs/how-to/dev-setup.md +32 -0
- yee88-0.1.0/docs/how-to/file-transfer.md +71 -0
- yee88-0.1.0/docs/how-to/index.md +37 -0
- yee88-0.1.0/docs/how-to/projects.md +91 -0
- yee88-0.1.0/docs/how-to/route-by-chat.md +47 -0
- yee88-0.1.0/docs/how-to/schedule-tasks.md +7 -0
- yee88-0.1.0/docs/how-to/switch-engines.md +42 -0
- yee88-0.1.0/docs/how-to/topics.md +108 -0
- yee88-0.1.0/docs/how-to/troubleshooting.md +17 -0
- yee88-0.1.0/docs/how-to/voice-notes.md +43 -0
- yee88-0.1.0/docs/how-to/worktrees.md +51 -0
- yee88-0.1.0/docs/how-to/write-a-plugin.md +148 -0
- yee88-0.1.0/docs/index.md +85 -0
- yee88-0.1.0/docs/javascripts/hero-chat.js +159 -0
- yee88-0.1.0/docs/overrides/.icons/takopi/takopi.svg +7 -0
- yee88-0.1.0/docs/overrides/main.html +34 -0
- yee88-0.1.0/docs/plugins.md +20 -0
- yee88-0.1.0/docs/reference/agents/index.md +7 -0
- yee88-0.1.0/docs/reference/agents/invariants.md +35 -0
- yee88-0.1.0/docs/reference/agents/repo-map.md +40 -0
- yee88-0.1.0/docs/reference/commands-and-directives.md +80 -0
- yee88-0.1.0/docs/reference/config.md +239 -0
- yee88-0.1.0/docs/reference/context-resolution.md +178 -0
- yee88-0.1.0/docs/reference/env-vars.md +26 -0
- yee88-0.1.0/docs/reference/index.md +65 -0
- yee88-0.1.0/docs/reference/plugin-api.md +285 -0
- yee88-0.1.0/docs/reference/plugins.md +16 -0
- yee88-0.1.0/docs/reference/runners/claude/runner.md +394 -0
- yee88-0.1.0/docs/reference/runners/claude/stream-json-cheatsheet.md +108 -0
- yee88-0.1.0/docs/reference/runners/claude/takopi-events.md +236 -0
- yee88-0.1.0/docs/reference/runners/codex/exec-json-cheatsheet.md +345 -0
- yee88-0.1.0/docs/reference/runners/codex/takopi-events.md +432 -0
- yee88-0.1.0/docs/reference/runners/index.md +9 -0
- yee88-0.1.0/docs/reference/runners/opencode/runner.md +55 -0
- yee88-0.1.0/docs/reference/runners/opencode/stream-json-cheatsheet.md +145 -0
- yee88-0.1.0/docs/reference/runners/opencode/takopi-events.md +82 -0
- yee88-0.1.0/docs/reference/runners/pi/runner.md +146 -0
- yee88-0.1.0/docs/reference/runners/pi/stream-json-cheatsheet.md +73 -0
- yee88-0.1.0/docs/reference/runners/pi/takopi-events.md +164 -0
- yee88-0.1.0/docs/reference/specification.md +550 -0
- yee88-0.1.0/docs/reference/transports/telegram.md +284 -0
- yee88-0.1.0/docs/stylesheets/admonitions.css +42 -0
- yee88-0.1.0/docs/stylesheets/hero-chat.css +227 -0
- yee88-0.1.0/docs/stylesheets/workflow-preview.css +98 -0
- yee88-0.1.0/docs/tutorials/conversation-modes.md +123 -0
- yee88-0.1.0/docs/tutorials/first-run.md +178 -0
- yee88-0.1.0/docs/tutorials/index.md +8 -0
- yee88-0.1.0/docs/tutorials/install.md +401 -0
- yee88-0.1.0/docs/tutorials/multi-engine.md +244 -0
- yee88-0.1.0/docs/tutorials/projects-and-branches.md +227 -0
- yee88-0.1.0/docs/user-guide.md +26 -0
- yee88-0.1.0/pyproject.toml +87 -0
- yee88-0.1.0/readme.md +63 -0
- yee88-0.1.0/scripts/commit_notify.py +81 -0
- yee88-0.1.0/scripts/docs_build_cf.sh +8 -0
- yee88-0.1.0/scripts/docs_prebuild.py +20 -0
- yee88-0.1.0/scripts/onboarding_preview.py +235 -0
- yee88-0.1.0/scripts/release_notify.py +49 -0
- yee88-0.1.0/src/takopi/__init__.py +1 -0
- yee88-0.1.0/src/takopi/api.py +116 -0
- yee88-0.1.0/src/takopi/backends.py +25 -0
- yee88-0.1.0/src/takopi/backends_helpers.py +14 -0
- yee88-0.1.0/src/takopi/cli/__init__.py +228 -0
- yee88-0.1.0/src/takopi/cli/config.py +320 -0
- yee88-0.1.0/src/takopi/cli/doctor.py +173 -0
- yee88-0.1.0/src/takopi/cli/init.py +113 -0
- yee88-0.1.0/src/takopi/cli/onboarding_cmd.py +126 -0
- yee88-0.1.0/src/takopi/cli/plugins.py +196 -0
- yee88-0.1.0/src/takopi/cli/run.py +419 -0
- yee88-0.1.0/src/takopi/cli/topic.py +355 -0
- yee88-0.1.0/src/takopi/commands.py +134 -0
- yee88-0.1.0/src/takopi/config.py +142 -0
- yee88-0.1.0/src/takopi/config_migrations.py +124 -0
- yee88-0.1.0/src/takopi/config_watch.py +146 -0
- yee88-0.1.0/src/takopi/context.py +9 -0
- yee88-0.1.0/src/takopi/directives.py +146 -0
- yee88-0.1.0/src/takopi/engines.py +53 -0
- yee88-0.1.0/src/takopi/events.py +170 -0
- yee88-0.1.0/src/takopi/ids.py +17 -0
- yee88-0.1.0/src/takopi/lockfile.py +158 -0
- yee88-0.1.0/src/takopi/logging.py +283 -0
- yee88-0.1.0/src/takopi/markdown.py +298 -0
- yee88-0.1.0/src/takopi/model.py +77 -0
- yee88-0.1.0/src/takopi/plugins.py +312 -0
- yee88-0.1.0/src/takopi/presenter.py +25 -0
- yee88-0.1.0/src/takopi/progress.py +99 -0
- yee88-0.1.0/src/takopi/router.py +113 -0
- yee88-0.1.0/src/takopi/runner.py +712 -0
- yee88-0.1.0/src/takopi/runner_bridge.py +619 -0
- yee88-0.1.0/src/takopi/runners/__init__.py +1 -0
- yee88-0.1.0/src/takopi/runners/claude.py +483 -0
- yee88-0.1.0/src/takopi/runners/codex.py +656 -0
- yee88-0.1.0/src/takopi/runners/mock.py +221 -0
- yee88-0.1.0/src/takopi/runners/opencode.py +505 -0
- yee88-0.1.0/src/takopi/runners/pi.py +523 -0
- yee88-0.1.0/src/takopi/runners/run_options.py +39 -0
- yee88-0.1.0/src/takopi/runners/tool_actions.py +90 -0
- yee88-0.1.0/src/takopi/runtime_loader.py +207 -0
- yee88-0.1.0/src/takopi/scheduler.py +159 -0
- yee88-0.1.0/src/takopi/schemas/__init__.py +1 -0
- yee88-0.1.0/src/takopi/schemas/claude.py +238 -0
- yee88-0.1.0/src/takopi/schemas/codex.py +169 -0
- yee88-0.1.0/src/takopi/schemas/opencode.py +51 -0
- yee88-0.1.0/src/takopi/schemas/pi.py +117 -0
- yee88-0.1.0/src/takopi/settings.py +360 -0
- yee88-0.1.0/src/takopi/telegram/__init__.py +20 -0
- yee88-0.1.0/src/takopi/telegram/api_models.py +37 -0
- yee88-0.1.0/src/takopi/telegram/api_schemas.py +152 -0
- yee88-0.1.0/src/takopi/telegram/backend.py +163 -0
- yee88-0.1.0/src/takopi/telegram/bridge.py +425 -0
- yee88-0.1.0/src/takopi/telegram/chat_prefs.py +242 -0
- yee88-0.1.0/src/takopi/telegram/chat_sessions.py +112 -0
- yee88-0.1.0/src/takopi/telegram/client.py +409 -0
- yee88-0.1.0/src/takopi/telegram/client_api.py +539 -0
- yee88-0.1.0/src/takopi/telegram/commands/__init__.py +12 -0
- yee88-0.1.0/src/takopi/telegram/commands/agent.py +196 -0
- yee88-0.1.0/src/takopi/telegram/commands/cancel.py +116 -0
- yee88-0.1.0/src/takopi/telegram/commands/dispatch.py +111 -0
- yee88-0.1.0/src/takopi/telegram/commands/executor.py +449 -0
- yee88-0.1.0/src/takopi/telegram/commands/file_transfer.py +586 -0
- yee88-0.1.0/src/takopi/telegram/commands/handlers.py +45 -0
- yee88-0.1.0/src/takopi/telegram/commands/media.py +143 -0
- yee88-0.1.0/src/takopi/telegram/commands/menu.py +139 -0
- yee88-0.1.0/src/takopi/telegram/commands/model.py +215 -0
- yee88-0.1.0/src/takopi/telegram/commands/overrides.py +159 -0
- yee88-0.1.0/src/takopi/telegram/commands/parse.py +30 -0
- yee88-0.1.0/src/takopi/telegram/commands/plan.py +16 -0
- yee88-0.1.0/src/takopi/telegram/commands/reasoning.py +234 -0
- yee88-0.1.0/src/takopi/telegram/commands/reply.py +23 -0
- yee88-0.1.0/src/takopi/telegram/commands/topics.py +332 -0
- yee88-0.1.0/src/takopi/telegram/commands/trigger.py +143 -0
- yee88-0.1.0/src/takopi/telegram/context.py +140 -0
- yee88-0.1.0/src/takopi/telegram/engine_defaults.py +86 -0
- yee88-0.1.0/src/takopi/telegram/engine_overrides.py +105 -0
- yee88-0.1.0/src/takopi/telegram/files.py +178 -0
- yee88-0.1.0/src/takopi/telegram/loop.py +1822 -0
- yee88-0.1.0/src/takopi/telegram/onboarding.py +1088 -0
- yee88-0.1.0/src/takopi/telegram/outbox.py +177 -0
- yee88-0.1.0/src/takopi/telegram/parsing.py +239 -0
- yee88-0.1.0/src/takopi/telegram/render.py +198 -0
- yee88-0.1.0/src/takopi/telegram/state_store.py +88 -0
- yee88-0.1.0/src/takopi/telegram/topic_state.py +334 -0
- yee88-0.1.0/src/takopi/telegram/topics.py +256 -0
- yee88-0.1.0/src/takopi/telegram/trigger_mode.py +68 -0
- yee88-0.1.0/src/takopi/telegram/types.py +63 -0
- yee88-0.1.0/src/takopi/telegram/voice.py +110 -0
- yee88-0.1.0/src/takopi/transport.py +53 -0
- yee88-0.1.0/src/takopi/transport_runtime.py +323 -0
- yee88-0.1.0/src/takopi/transports.py +76 -0
- yee88-0.1.0/src/takopi/utils/__init__.py +1 -0
- yee88-0.1.0/src/takopi/utils/git.py +87 -0
- yee88-0.1.0/src/takopi/utils/json_state.py +21 -0
- yee88-0.1.0/src/takopi/utils/paths.py +47 -0
- yee88-0.1.0/src/takopi/utils/streams.py +44 -0
- yee88-0.1.0/src/takopi/utils/subprocess.py +86 -0
- yee88-0.1.0/src/takopi/worktrees.py +135 -0
- yee88-0.1.0/tests/__init__.py +1 -0
- yee88-0.1.0/tests/conftest.py +27 -0
- yee88-0.1.0/tests/factories.py +64 -0
- yee88-0.1.0/tests/fixtures/claude_stream_json_session.jsonl +9 -0
- yee88-0.1.0/tests/fixtures/codex_exec_json_all_formats.jsonl +23 -0
- yee88-0.1.0/tests/fixtures/codex_exec_json_all_formats.txt +32 -0
- yee88-0.1.0/tests/fixtures/opencode_run_json.jsonl +5 -0
- yee88-0.1.0/tests/fixtures/opencode_stream_error.jsonl +2 -0
- yee88-0.1.0/tests/fixtures/opencode_stream_success.jsonl +6 -0
- yee88-0.1.0/tests/fixtures/opencode_stream_success_no_reason.jsonl +3 -0
- yee88-0.1.0/tests/fixtures/pi_print_mode_events.jsonl +50 -0
- yee88-0.1.0/tests/fixtures/pi_stream_error.jsonl +3 -0
- yee88-0.1.0/tests/fixtures/pi_stream_success.jsonl +8 -0
- yee88-0.1.0/tests/plugin_fixtures.py +48 -0
- yee88-0.1.0/tests/telegram_fakes.py +288 -0
- yee88-0.1.0/tests/test_api_exports.py +7 -0
- yee88-0.1.0/tests/test_auto_router.py +48 -0
- yee88-0.1.0/tests/test_claude_runner.py +425 -0
- yee88-0.1.0/tests/test_claude_schema.py +41 -0
- yee88-0.1.0/tests/test_cli_auto_router.py +178 -0
- yee88-0.1.0/tests/test_cli_chat_id.py +70 -0
- yee88-0.1.0/tests/test_cli_commands.py +240 -0
- yee88-0.1.0/tests/test_cli_config.py +205 -0
- yee88-0.1.0/tests/test_cli_doctor.py +125 -0
- yee88-0.1.0/tests/test_cli_helpers.py +194 -0
- yee88-0.1.0/tests/test_codex_runner_helpers.py +204 -0
- yee88-0.1.0/tests/test_codex_schema.py +44 -0
- yee88-0.1.0/tests/test_codex_tool_result_summary.py +124 -0
- yee88-0.1.0/tests/test_command_registry.py +47 -0
- yee88-0.1.0/tests/test_config_store.py +40 -0
- yee88-0.1.0/tests/test_config_watch.py +116 -0
- yee88-0.1.0/tests/test_engine_discovery.py +68 -0
- yee88-0.1.0/tests/test_exec_bridge.py +441 -0
- yee88-0.1.0/tests/test_exec_render.py +408 -0
- yee88-0.1.0/tests/test_exec_runner.py +432 -0
- yee88-0.1.0/tests/test_git_utils.py +131 -0
- yee88-0.1.0/tests/test_lockfile.py +82 -0
- yee88-0.1.0/tests/test_onboarding.py +77 -0
- yee88-0.1.0/tests/test_onboarding_helpers.py +540 -0
- yee88-0.1.0/tests/test_onboarding_interactive.py +305 -0
- yee88-0.1.0/tests/test_opencode_runner.py +368 -0
- yee88-0.1.0/tests/test_opencode_schema.py +40 -0
- yee88-0.1.0/tests/test_paths.py +51 -0
- yee88-0.1.0/tests/test_pi_runner.py +230 -0
- yee88-0.1.0/tests/test_pi_schema.py +39 -0
- yee88-0.1.0/tests/test_plugins.py +210 -0
- yee88-0.1.0/tests/test_projects_config.py +143 -0
- yee88-0.1.0/tests/test_rendering.py +30 -0
- yee88-0.1.0/tests/test_runner_contract.py +105 -0
- yee88-0.1.0/tests/test_runner_run_options.py +59 -0
- yee88-0.1.0/tests/test_runner_utils.py +415 -0
- yee88-0.1.0/tests/test_runtime_loader.py +52 -0
- yee88-0.1.0/tests/test_settings.py +237 -0
- yee88-0.1.0/tests/test_settings_contract.py +30 -0
- yee88-0.1.0/tests/test_subprocess.py +28 -0
- yee88-0.1.0/tests/test_telegram_agent_trigger_commands.py +284 -0
- yee88-0.1.0/tests/test_telegram_backend.py +185 -0
- yee88-0.1.0/tests/test_telegram_bridge.py +3458 -0
- yee88-0.1.0/tests/test_telegram_chat_prefs.py +27 -0
- yee88-0.1.0/tests/test_telegram_chat_sessions.py +69 -0
- yee88-0.1.0/tests/test_telegram_client.py +232 -0
- yee88-0.1.0/tests/test_telegram_client_api.py +178 -0
- yee88-0.1.0/tests/test_telegram_context_helpers.py +167 -0
- yee88-0.1.0/tests/test_telegram_engine_defaults.py +77 -0
- yee88-0.1.0/tests/test_telegram_engine_overrides.py +97 -0
- yee88-0.1.0/tests/test_telegram_file_transfer_helpers.py +1173 -0
- yee88-0.1.0/tests/test_telegram_files.py +111 -0
- yee88-0.1.0/tests/test_telegram_incoming.py +317 -0
- yee88-0.1.0/tests/test_telegram_media_command.py +212 -0
- yee88-0.1.0/tests/test_telegram_polling.py +51 -0
- yee88-0.1.0/tests/test_telegram_queue.py +450 -0
- yee88-0.1.0/tests/test_telegram_topic_state.py +75 -0
- yee88-0.1.0/tests/test_telegram_topics_command.py +189 -0
- yee88-0.1.0/tests/test_telegram_topics_helpers.py +34 -0
- yee88-0.1.0/tests/test_telegram_trigger_mode.py +138 -0
- yee88-0.1.0/tests/test_telegram_voice.py +352 -0
- yee88-0.1.0/tests/test_tool_actions.py +78 -0
- yee88-0.1.0/tests/test_transport.py +39 -0
- yee88-0.1.0/tests/test_transport_registry.py +67 -0
- yee88-0.1.0/tests/test_transport_runtime.py +163 -0
- yee88-0.1.0/tests/test_worktrees.py +103 -0
- yee88-0.1.0/uv.lock +1197 -0
- 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
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
|
+
|