tunacode-cli 0.1.101__tar.gz → 0.2.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.
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/PLAN.md +251 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/INDEX.md +16 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T001.md +41 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T002.md +53 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T003.md +38 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T004.md +76 -0
- tunacode_cli-0.2.0/.artifacts/research/2026-03-31_11-32-31_theme-switch-dim-background-crash.md +139 -0
- tunacode_cli-0.2.0/.artifacts/research/2026-03-31_16-51-07_ui-api.md +381 -0
- tunacode_cli-0.2.0/.artifacts/research/2026-04-01_23-32-20_session-save-tail-and-message-boundary.md +78 -0
- tunacode_cli-0.2.0/.artifacts/research/2026-04-01_tinyagent-boundary.md +62 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/dependency-map.yml +2 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/empty-dir-check.yml +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/lint.yml +4 -4
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/publish-release.yml +2 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/release.yml +2 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/tech-debt.yml +4 -4
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/AGENTS.md +2 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/CHANGELOG.md +7 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/HARNESS.md +15 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/Makefile +6 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/PKG-INFO +1 -1
- tunacode_cli-0.2.0/docs/deployment.md +159 -0
- tunacode_cli-0.2.0/docs/skills/audit-harness/SKILL.md +95 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/pyproject.toml +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/scripts/bump_version.py +5 -8
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/scripts/local_publish.py +6 -11
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/scripts/release.py +41 -31
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/constants.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/main.py +17 -8
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/controller.py +14 -3
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/session/state.py +22 -16
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/app.py +54 -5
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/debug.py +7 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/help.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/request_debug.py +100 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/test_compaction.py +6 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_request_orchestrator_parallel_tools.py +27 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/ui/test_request_debug.py +60 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/uv.lock +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/README.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/debug_history/2026-03-25_tinyagent-1-2-27-gil-hotfix-validation.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/debug_history/REQUEST_CONTEXT_CUTOVER_LESSON.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/debug_history/postmortem-defensive-message-typing-2026-03-17.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/debug_history/postmortem-loading-indicator-submit-regression-2026-03-24.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/debug_history/slop_fixture.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/execute/2026-03-22_19-54-47_tinyagent-message-typing-cleanup.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/execute/2026-03-24_19-20-38_input-latency-threaded-request-execution.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/execute/2026-03-26_16-20-32_models-loading-unification.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/execute/2026-03-28_12-18-53_pr-444-review-fixes.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/issue_analysis_report_2026-03-21.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-22_09-58-20_native-tinyagent-tool-contract.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-22_18-08-41_tinyagent-message-typing-cleanup.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-23_15-35-00_command-autocomplete-positioning.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-24_19-15-16_input-latency-threaded-request-execution.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/PLAN.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/INDEX.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T001.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T002.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T003.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T004.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-27_13-59-15_pr-444-review-fixes/PLAN.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plans/consolidate-main-support-plan.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plans/reduce-src-python-files-to-500-lines-plan.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/query_data_flow.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/release/model-registry-refresh-release-blocker-2026-03-21.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/release/release-v0.1.94-run.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/release/tmux-suite-validation-2026-03-21.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-17_13-01-09_replace_messages-cutover.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-17_14-04-53_mypy-main-py-errors-map.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-21_14-07-44_prompt-versioning-map.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-42-58_tools-implementation.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-43-01_tools-context-synthesis.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-43-03_codebase-locator_tool-system.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-45-29_tools-data-inputs-contracts.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-53-07_tool-result-adapter-runtime.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-53-52_minimax-tinyagent-contract-shape-vs-runtime.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_17-57-53_message-ingress-data-contract-map.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-23_15-30-00_command-autocomplete-positioning.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-24_16-58-32_tui-submit-latency.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-24_18-46-40_input-latency-ui-loop-coupling.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-24_20-07-05_input-latency-regression-probe.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/tunacode_action_audit.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.coderabbit.yaml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/dependabot.yml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/pull_request_template.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.gitignore +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.pre-commit-config.yaml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.test_reports/.gitkeep +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/LICENSE +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/LOG.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/MANIFEST.in +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/README.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/assets/hashline-edit.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/assets/home.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/CODE-STANDARDS.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/README.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.dot +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/architecture/patterns/agent-message-serialization.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/codebase-map/structure/tree-structure.txt +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/docs_audit.html +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/git/practices.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-home-catpu.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-home.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-lsp.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-response.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/tool-calls.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/tunacode.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/configuration/configuration.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/configuration/models-registry.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/core/core.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/index.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/infrastructure/infrastructure.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/skills/skills.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/tools/hashline-subsystem.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/tools/tools-system.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/tools/tools.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/types/types.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/ui/commands.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/ui/ui.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/utils/utils.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/reviews/2026-03-24-input-latency-research-artifact.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/reviews/2026-03-25-provider-stream-stall-artifact.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/reviews/pr-429-coderabbit-review.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/ui/css-architecture.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/plan.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/pytest.ini +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/benchmarks/input_latency.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/benchmarks/input_paint_latency.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/benchmarks/input_tmux_latency.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check-defensive-slop.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check-file-length.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check-naming-conventions.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check-unused-constants.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check_agents_freshness.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check_unused_modules.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/dev-setup.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/download_ripgrep.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/generate-release-notes.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/generate_structure_tree.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/grimp_layers_report.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/install_linux.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/playwright_cache.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/preview_tool_panels.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/run-dead-imports.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/run_gates.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/startup_timer.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/todo_baseline.json +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/todo_scanner.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/ui_import_timer.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/uninstall.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/update_models_registry.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/utils/check_empty_dirs.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/utils/vulture_whitelist.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/SKILL.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/references/common-issues.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/references/workflow-structure.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/defaults.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/ignore_patterns.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/limits.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/models.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/models_registry.json +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/paths.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/pricing.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/settings.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/user_config.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/agent_config.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/agent_helpers.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/agent_session_config.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/helpers.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/sanitize.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/sanitize_debug.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/prompts.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/summarizer.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/types.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/debug/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/debug/usage_trace.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/logging/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/logging/handlers.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/logging/levels.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/logging/manager.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/logging/records.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/session/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/types/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/types/agent_state.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/types/state.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/types/state_structures.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/types/tool_registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/configuration.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/constants.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/file_filter.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/formatting.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/lsp_status.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/messaging.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/shared_types.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/system_paths.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/user_configuration.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/exceptions.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/agents.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/limits_settings.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/models_registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/skills.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/tunacode_context.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/manager.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/metadata.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/strategies.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/file_filter.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/prompts/system_prompt.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/py.typed +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/discovery.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/loader.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/models.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/prompting.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/search.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/selection.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/bash.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/ignore_manager_cache.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/ripgrep_cache.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/discover.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/hashline.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/hashline_edit.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/ignore.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/ignore_manager.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/line_cache.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/client.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/diagnostics.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/servers.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/read_file.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_pipeline.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_terms.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_types.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/file_errors.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/formatting.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/ripgrep.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/web_fetch.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/write_file.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/base.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/callbacks.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/canonical.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/dataclasses.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/models_registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/assets/logo.ansi +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/clipboard.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/command_registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/base.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/cancel.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/clear.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/compact.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/exit.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/model.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/resume.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/skills.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/theme.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/thoughts.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/update.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/context_panel.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/handler.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/types.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/lifecycle.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/logo_assets.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/main.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/model_display.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/agent_response.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/errors.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/panel_widths.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/panels.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/search.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/thinking.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/base.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/bash.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/diagnostics.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/discover.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/hashline_edit.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/read_file.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/syntax_utils.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/web_fetch.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/write_file.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/repl_support.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/request_bridge.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/api_key_entry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/model_picker.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/session_picker.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/setup.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/theme_picker.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/update_confirm.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/shell_runner.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/slopgotchi/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/slopgotchi/panel.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/streaming.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/layout.tcss +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/modals.tcss +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/panels.tcss +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/widgets.tcss +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/styles.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/thinking_state.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/welcome.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/chat.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/command_autocomplete.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/editor.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/file_autocomplete.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/messages.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/resource_bar.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/skills_autocomplete.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/adapter.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/token_counter.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/system/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/system/gitignore.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/architecture/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/architecture/test_import_order.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/architecture/test_imports_in_init.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/architecture/test_init_bloat.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/architecture/test_layer_dependencies.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/conftest.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/integration/core/test_minimax_execution_path.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/integration/core/test_mtime_caches_end_to_end.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/integration/core/test_tinyagent_alchemy_usage_contract_live.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/integration/ui/test_submit_loading_lifecycle.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/system/cli/test_cli_default_command.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/system/cli/test_repl_support.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/system/cli/test_startup.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/system/cli/test_tmux_tools.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/test_dependency_layers.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_default_config_minimax_keys.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_default_config_stream_agent_text.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_ignore_patterns.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_models_registry_loading_behavior.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_models_registry_minimax_contract.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_pricing_registry_loading.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_provider_api_key_env_fallback.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_user_config_loading.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_cache_abort.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_helpers.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_init_debug.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_skills_prompt_injection.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_stream_provider_debug.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_compaction_controller_outcomes.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_compaction_summarizer.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_context_overflow_detection.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_exceptions.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_logging.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_openrouter_usage_metrics.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_provider_error_surfacing.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_session_state_defaults.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_session_state_model_registry_loading.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_session_usage_schema.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_stream_phase_debug.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_thinking_stream_routing.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_tinyagent_openrouter_model_config.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_tool_concurrency_limit.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_usage_trace_debug.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_cache_infrastructure.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_file_filter.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_migrated_lru_cache_replacements.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_typed_cache_accessors.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/skills/test_registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/skills/test_selection.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/test_sanitize_canonicalization.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/tools/test_ignore_manager.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/types/test_adapter.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/types/test_canonical.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/types/test_tool_registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/ui/test_app_loading_indicator.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/ui/test_request_threading.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/ui/test_thinking_state.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/utils/test_gitignore.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/utils/test_shell_command_escape.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/utils/test_token_counter.py +0 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "ui_api passthrough reduction implementation plan"
|
|
3
|
+
link: "ui-api-passthrough-reduction-plan"
|
|
4
|
+
type: implementation_plan
|
|
5
|
+
ontological_relations:
|
|
6
|
+
- relates_to: [[core-ui-api-research]]
|
|
7
|
+
tags: [plan, ui-api, coding]
|
|
8
|
+
uuid: "beacadf7-d151-4cdc-88a5-209eeec2b7e4"
|
|
9
|
+
created_at: "2026-03-31T17:00:48Z"
|
|
10
|
+
parent_research: ".artifacts/research/2026-03-31_16-51-07_ui-api.md"
|
|
11
|
+
git_commit_at_plan: "a65e7bf1"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Goal
|
|
15
|
+
|
|
16
|
+
- Reduce `src/tunacode/core/ui_api/` to only modules that add adapter behavior, by migrating UI callers off pure passthrough facades and deleting the dead facade modules.
|
|
17
|
+
- Keep runtime behavior, model/config workflows, and tool rendering behavior unchanged while simplifying import paths.
|
|
18
|
+
- Out of scope: redesigning the underlying configuration/types/utils APIs, changing request orchestration, or removing the non-trivial adapters (`file_filter.py`, `formatting.py`, `lsp_status.py`).
|
|
19
|
+
|
|
20
|
+
## Scope & Assumptions
|
|
21
|
+
|
|
22
|
+
- IN scope:
|
|
23
|
+
- Replace UI imports of `core.ui_api` passthrough modules with direct imports from `tunacode.constants`, `tunacode.types`, `tunacode.configuration.*`, and `tunacode.utils.messaging`.
|
|
24
|
+
- Delete the pure passthrough modules once no in-repo source file imports them.
|
|
25
|
+
- Update package docs and architecture notes so the surviving `ui_api` surface matches the code.
|
|
26
|
+
- Add one architecture ratchet that locks the reduced `core/ui_api` file set.
|
|
27
|
+
- OUT of scope:
|
|
28
|
+
- Moving logic between lower layers.
|
|
29
|
+
- Reworking `FileFilter`, `LspServerInfo`, or diagnostic formatting behavior.
|
|
30
|
+
- Any changes to tool callbacks, message schemas, or pricing/model registry logic beyond import-path updates.
|
|
31
|
+
- Ops/deploy/release work.
|
|
32
|
+
- Assumptions:
|
|
33
|
+
- Direct UI imports from `configuration`, `types`, `constants`, and `utils` remain valid per `tests/test_dependency_layers.py:11-34` and `docs/modules/utils/utils.md:1-23`.
|
|
34
|
+
- The modules identified as passthrough-only in the research doc stay behaviorally identical to their underlying implementations during this refactor.
|
|
35
|
+
- Untracked planning artifacts present at plan time remain untouched: `.artifacts/research/2026-03-31_11-32-31_theme-switch-dim-background-crash.md`, `.artifacts/research/2026-03-31_16-51-07_ui-api.md`.
|
|
36
|
+
|
|
37
|
+
## Deliverables
|
|
38
|
+
|
|
39
|
+
- UI source files importing lower-layer modules directly instead of the removable `core.ui_api` facades.
|
|
40
|
+
- A narrowed `src/tunacode/core/ui_api/` package containing only `__init__.py`, `file_filter.py`, `formatting.py`, and `lsp_status.py`.
|
|
41
|
+
- One architecture test that ratchets the reduced `ui_api` surface.
|
|
42
|
+
- Updated developer docs and repository map reflecting the reduced package.
|
|
43
|
+
|
|
44
|
+
## Readiness
|
|
45
|
+
|
|
46
|
+
- Preconditions:
|
|
47
|
+
- Research artifact exists at `.artifacts/research/2026-03-31_16-51-07_ui-api.md`.
|
|
48
|
+
- Current git baseline captured at commit `a65e7bf1`.
|
|
49
|
+
- The following checks are available for post-change validation: `tests/test_dependency_layers.py`, `tests/architecture/test_layer_dependencies.py`, `tests/architecture/test_import_order.py`.
|
|
50
|
+
- Before starting execution:
|
|
51
|
+
- Keep the existing import order conventions in touched files.
|
|
52
|
+
- Do not delete the untracked research artifacts listed above.
|
|
53
|
+
- Preserve `src/tunacode/core/ui_api/file_filter.py`, `src/tunacode/core/ui_api/formatting.py`, and `src/tunacode/core/ui_api/lsp_status.py` unless a later approved plan explicitly targets them.
|
|
54
|
+
|
|
55
|
+
## Milestones
|
|
56
|
+
|
|
57
|
+
- M1: Migrate startup/model-selection UI paths off passthrough facades.
|
|
58
|
+
- M2: Migrate runtime/rendering UI paths off passthrough facades.
|
|
59
|
+
- M3: Delete dead `core/ui_api` modules and narrow the package surface.
|
|
60
|
+
- M4: Refresh docs/generated maps and add a ratchet test for the reduced surface.
|
|
61
|
+
|
|
62
|
+
## Ticket Index
|
|
63
|
+
|
|
64
|
+
<!-- TICKET_INDEX:START -->
|
|
65
|
+
|
|
66
|
+
| Task | Title | Ticket |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| T001 | Migrate startup and model-selection flows off passthrough facades | [tickets/T001.md](tickets/T001.md) |
|
|
69
|
+
| T002 | Migrate runtime and rendering flows off passthrough facades | [tickets/T002.md](tickets/T002.md) |
|
|
70
|
+
| T003 | Delete dead facade modules and narrow the `core/ui_api` package surface | [tickets/T003.md](tickets/T003.md) |
|
|
71
|
+
| T004 | Refresh docs and add a ratchet for the reduced `ui_api` surface | [tickets/T004.md](tickets/T004.md) |
|
|
72
|
+
|
|
73
|
+
<!-- TICKET_INDEX:END -->
|
|
74
|
+
|
|
75
|
+
## Work Breakdown (Tasks)
|
|
76
|
+
|
|
77
|
+
### T001: Migrate startup and model-selection flows off passthrough facades
|
|
78
|
+
|
|
79
|
+
**Summary**: Replace `core.ui_api` imports used by CLI startup, lifecycle, setup, model selection, theme switching, session deletion, and update flows with direct imports from the underlying `configuration`, `constants`, and `paths` modules.
|
|
80
|
+
|
|
81
|
+
**Owner**: ui-core
|
|
82
|
+
|
|
83
|
+
**Estimate**: 2.5h
|
|
84
|
+
|
|
85
|
+
**Dependencies**: none
|
|
86
|
+
|
|
87
|
+
**Target milestone**: M1
|
|
88
|
+
|
|
89
|
+
**Acceptance test**: `! rg -n "tunacode\.core\.ui_api\.(configuration|user_configuration|system_paths|constants)" src/tunacode/ui/main.py src/tunacode/ui/lifecycle.py src/tunacode/ui/screens/setup.py src/tunacode/ui/screens/model_picker.py src/tunacode/ui/screens/api_key_entry.py src/tunacode/ui/commands/model.py src/tunacode/ui/commands/theme.py src/tunacode/ui/commands/update.py src/tunacode/ui/commands/resume.py`
|
|
90
|
+
|
|
91
|
+
**Files/modules touched**:
|
|
92
|
+
- src/tunacode/ui/main.py
|
|
93
|
+
- src/tunacode/ui/lifecycle.py
|
|
94
|
+
- src/tunacode/ui/screens/setup.py
|
|
95
|
+
- src/tunacode/ui/screens/model_picker.py
|
|
96
|
+
- src/tunacode/ui/screens/api_key_entry.py
|
|
97
|
+
- src/tunacode/ui/commands/model.py
|
|
98
|
+
- src/tunacode/ui/commands/theme.py
|
|
99
|
+
- src/tunacode/ui/commands/update.py
|
|
100
|
+
- src/tunacode/ui/commands/resume.py
|
|
101
|
+
|
|
102
|
+
**Steps**:
|
|
103
|
+
1. In each listed file, replace `tunacode.core.ui_api.configuration` imports with direct imports from the specific source modules: `tunacode.configuration.defaults`, `tunacode.configuration.models`, `tunacode.configuration.pricing`, and `tunacode.configuration.settings`.
|
|
104
|
+
2. Replace `tunacode.core.ui_api.user_configuration` imports with direct imports from `tunacode.configuration.user_config`.
|
|
105
|
+
3. Replace `tunacode.core.ui_api.system_paths` imports with direct imports from `tunacode.configuration.paths`.
|
|
106
|
+
4. Replace `tunacode.core.ui_api.constants` imports in the listed files with direct imports from `tunacode.constants`.
|
|
107
|
+
5. Preserve current behavior and call ordering; only change import sources and any now-unneeded alias names.
|
|
108
|
+
6. Run the acceptance grep command and confirm the listed files no longer reference the four removable facade modules.
|
|
109
|
+
|
|
110
|
+
### T002: Migrate runtime and rendering flows off passthrough facades
|
|
111
|
+
|
|
112
|
+
**Summary**: Replace `core.ui_api` imports used by the main app runtime, callbacks, compact command, session preview, widgets, styles, welcome message, and tool renderers with direct imports from `tunacode.constants`, `tunacode.types`, and `tunacode.utils.messaging`.
|
|
113
|
+
|
|
114
|
+
**Owner**: ui-core
|
|
115
|
+
|
|
116
|
+
**Estimate**: 3h
|
|
117
|
+
|
|
118
|
+
**Dependencies**: T001
|
|
119
|
+
|
|
120
|
+
**Target milestone**: M2
|
|
121
|
+
|
|
122
|
+
**Acceptance test**: `! rg -n "tunacode\.core\.ui_api\.(constants|shared_types|messaging)" src/tunacode/ui/app.py src/tunacode/ui/repl_support.py src/tunacode/ui/commands/clear.py src/tunacode/ui/commands/compact.py src/tunacode/ui/screens/session_picker.py src/tunacode/ui/widgets/messages.py src/tunacode/ui/widgets/resource_bar.py src/tunacode/ui/styles.py src/tunacode/ui/welcome.py src/tunacode/ui/renderers/agent_response.py src/tunacode/ui/renderers/panel_widths.py src/tunacode/ui/renderers/panels.py src/tunacode/ui/renderers/search.py src/tunacode/ui/renderers/tools/base.py src/tunacode/ui/renderers/tools/bash.py src/tunacode/ui/renderers/tools/diagnostics.py src/tunacode/ui/renderers/tools/discover.py src/tunacode/ui/renderers/tools/hashline_edit.py src/tunacode/ui/renderers/tools/read_file.py src/tunacode/ui/renderers/tools/web_fetch.py src/tunacode/ui/renderers/tools/write_file.py`
|
|
123
|
+
|
|
124
|
+
**Files/modules touched**:
|
|
125
|
+
- src/tunacode/ui/app.py
|
|
126
|
+
- src/tunacode/ui/repl_support.py
|
|
127
|
+
- src/tunacode/ui/commands/clear.py
|
|
128
|
+
- src/tunacode/ui/commands/compact.py
|
|
129
|
+
- src/tunacode/ui/screens/session_picker.py
|
|
130
|
+
- src/tunacode/ui/widgets/messages.py
|
|
131
|
+
- src/tunacode/ui/widgets/resource_bar.py
|
|
132
|
+
- src/tunacode/ui/styles.py
|
|
133
|
+
- src/tunacode/ui/welcome.py
|
|
134
|
+
- src/tunacode/ui/renderers/agent_response.py
|
|
135
|
+
- src/tunacode/ui/renderers/panel_widths.py
|
|
136
|
+
- src/tunacode/ui/renderers/panels.py
|
|
137
|
+
- src/tunacode/ui/renderers/search.py
|
|
138
|
+
- src/tunacode/ui/renderers/tools/base.py
|
|
139
|
+
- src/tunacode/ui/renderers/tools/bash.py
|
|
140
|
+
- src/tunacode/ui/renderers/tools/diagnostics.py
|
|
141
|
+
- src/tunacode/ui/renderers/tools/discover.py
|
|
142
|
+
- src/tunacode/ui/renderers/tools/hashline_edit.py
|
|
143
|
+
- src/tunacode/ui/renderers/tools/read_file.py
|
|
144
|
+
- src/tunacode/ui/renderers/tools/web_fetch.py
|
|
145
|
+
- src/tunacode/ui/renderers/tools/write_file.py
|
|
146
|
+
|
|
147
|
+
**Steps**:
|
|
148
|
+
1. Replace `tunacode.core.ui_api.constants` imports with direct imports from `tunacode.constants` in every listed runtime/rendering file.
|
|
149
|
+
2. Replace `tunacode.core.ui_api.shared_types` imports with direct imports from `tunacode.types` and `tunacode.types.canonical` as needed (`UsageMetrics` can come from `tunacode.types.canonical`; the callback/type aliases can come from `tunacode.types`).
|
|
150
|
+
3. Replace `tunacode.core.ui_api.messaging` imports with direct imports from `tunacode.utils.messaging`.
|
|
151
|
+
4. Keep `tunacode.core.ui_api.formatting` and `tunacode.core.ui_api.lsp_status` imports unchanged in this task because those modules still add adapter behavior.
|
|
152
|
+
5. Clean up any redundant inline imports created solely for the removed facades while preserving lazy-import behavior where the current code relies on it.
|
|
153
|
+
6. Run the acceptance grep command and confirm the listed files no longer reference the three removable runtime facade modules.
|
|
154
|
+
|
|
155
|
+
### T003: Delete dead facade modules and narrow the `core/ui_api` package surface
|
|
156
|
+
|
|
157
|
+
**Summary**: Remove the passthrough modules after all in-repo call sites stop using them, and update the package docstring so `core/ui_api` describes the reduced adapter-only surface.
|
|
158
|
+
|
|
159
|
+
**Owner**: core
|
|
160
|
+
|
|
161
|
+
**Estimate**: 1.5h
|
|
162
|
+
|
|
163
|
+
**Dependencies**: T002
|
|
164
|
+
|
|
165
|
+
**Target milestone**: M3
|
|
166
|
+
|
|
167
|
+
**Acceptance test**: `test "$(find src/tunacode/core/ui_api -maxdepth 1 -type f | xargs -n1 basename | sort | tr '\n' ' ')" = "__init__.py file_filter.py formatting.py lsp_status.py "`
|
|
168
|
+
|
|
169
|
+
**Files/modules touched**:
|
|
170
|
+
- src/tunacode/core/ui_api/__init__.py
|
|
171
|
+
- src/tunacode/core/ui_api/configuration.py
|
|
172
|
+
- src/tunacode/core/ui_api/constants.py
|
|
173
|
+
- src/tunacode/core/ui_api/messaging.py
|
|
174
|
+
- src/tunacode/core/ui_api/shared_types.py
|
|
175
|
+
- src/tunacode/core/ui_api/system_paths.py
|
|
176
|
+
- src/tunacode/core/ui_api/user_configuration.py
|
|
177
|
+
|
|
178
|
+
**Steps**:
|
|
179
|
+
1. Delete `configuration.py`, `constants.py`, `messaging.py`, `shared_types.py`, `system_paths.py`, and `user_configuration.py` from `src/tunacode/core/ui_api/`.
|
|
180
|
+
2. Rewrite `src/tunacode/core/ui_api/__init__.py` so it describes the reduced package as a home only for UI-specific adapters that add behavior, defaults, or translation.
|
|
181
|
+
3. Do not change `file_filter.py`, `formatting.py`, or `lsp_status.py` except for import cleanup if a deleted sibling module was referenced in comments or docstrings.
|
|
182
|
+
4. Re-run a repository-wide grep for `tunacode.core.ui_api.` imports and confirm only `file_filter`, `formatting`, and `lsp_status` remain in tracked source files.
|
|
183
|
+
5. Run the acceptance shell test and confirm the package file set matches the expected reduced surface exactly.
|
|
184
|
+
|
|
185
|
+
### T004: Refresh docs and add a ratchet for the reduced `ui_api` surface
|
|
186
|
+
|
|
187
|
+
**Summary**: Update developer docs and generated structure artifacts to describe the reduced adapter-only package, and add one architecture test that fails if deleted passthrough modules are reintroduced.
|
|
188
|
+
|
|
189
|
+
**Owner**: architecture
|
|
190
|
+
|
|
191
|
+
**Estimate**: 2h
|
|
192
|
+
|
|
193
|
+
**Dependencies**: T003
|
|
194
|
+
|
|
195
|
+
**Target milestone**: M4
|
|
196
|
+
|
|
197
|
+
**Acceptance test**: `uv run pytest tests/architecture/test_ui_api_surface.py tests/test_dependency_layers.py tests/architecture/test_layer_dependencies.py tests/architecture/test_import_order.py -q`
|
|
198
|
+
|
|
199
|
+
**Files/modules touched**:
|
|
200
|
+
- tests/architecture/test_ui_api_surface.py
|
|
201
|
+
- docs/modules/core/core.md
|
|
202
|
+
- docs/modules/ui/ui.md
|
|
203
|
+
- docs/codebase-map/structure/tree-structure.txt
|
|
204
|
+
- AGENTS.md
|
|
205
|
+
|
|
206
|
+
**Steps**:
|
|
207
|
+
1. Add `tests/architecture/test_ui_api_surface.py` that asserts the file set under `src/tunacode/core/ui_api/` matches the intended reduced surface from T003.
|
|
208
|
+
2. Update `docs/modules/core/core.md` so the `ui_api/` entry describes the smaller adapter-only package instead of a broad bridge for configuration/constants/types.
|
|
209
|
+
3. Update `docs/modules/ui/ui.md` anywhere the dependency narrative implies UI must route lower-layer imports through `core/ui_api`; keep the docs consistent with the new direct-import paths.
|
|
210
|
+
4. Regenerate `docs/codebase-map/structure/tree-structure.txt` after the package shrink so the committed tree matches the source layout.
|
|
211
|
+
5. Update `AGENTS.md` `Last Updated` date and any repository-orientation bullets that describe `core/ui_api/` as a broad bridge.
|
|
212
|
+
6. Run the acceptance pytest command and confirm the reduced surface plus layer/import-order rules all pass together.
|
|
213
|
+
|
|
214
|
+
## Risks & Mitigations
|
|
215
|
+
|
|
216
|
+
- Import churn across many UI files can create noisy diffs.
|
|
217
|
+
- Mitigation: keep the refactor import-only, grouped by task, and avoid unrelated formatting changes.
|
|
218
|
+
- Some files currently rely on lazy imports to reduce startup cost or avoid cycles.
|
|
219
|
+
- Mitigation: preserve lazy-import placement unless a direct top-level import is already used safely in a nearby file.
|
|
220
|
+
- Docs may drift if the generated structure tree is not refreshed after deleting modules.
|
|
221
|
+
- Mitigation: regenerate the tree in T004 and include it in the acceptance path.
|
|
222
|
+
- A deleted facade could still be referenced outside `src/tunacode/ui/`.
|
|
223
|
+
- Mitigation: repository-wide grep in T003 before deleting files permanently.
|
|
224
|
+
|
|
225
|
+
## Test Strategy
|
|
226
|
+
|
|
227
|
+
- T001/T002 rely on grep-based proof that targeted files no longer import the removable facades.
|
|
228
|
+
- T003 relies on an exact filesystem assertion for the remaining `core/ui_api` file set.
|
|
229
|
+
- T004 adds one architecture ratchet test and reruns the existing dependency/import-order suite.
|
|
230
|
+
- Do not add more than one new test file; the only new test should be `tests/architecture/test_ui_api_surface.py`.
|
|
231
|
+
|
|
232
|
+
## References
|
|
233
|
+
|
|
234
|
+
- Research doc: `.artifacts/research/2026-03-31_16-51-07_ui-api.md` — sections `Key Files`, `Data Ingress`, `Dependencies`, `Flow Maps`
|
|
235
|
+
- `src/tunacode/core/ui_api/configuration.py:1-101`
|
|
236
|
+
- `src/tunacode/core/ui_api/constants.py:1-47`
|
|
237
|
+
- `src/tunacode/core/ui_api/messaging.py:1-36`
|
|
238
|
+
- `src/tunacode/core/ui_api/shared_types.py:1-17`
|
|
239
|
+
- `src/tunacode/core/ui_api/system_paths.py:1-44`
|
|
240
|
+
- `src/tunacode/core/ui_api/user_configuration.py:1-51`
|
|
241
|
+
- `tests/test_dependency_layers.py:11-34`
|
|
242
|
+
- `docs/modules/utils/utils.md:1-23`
|
|
243
|
+
- `docs/modules/core/core.md:68-70`
|
|
244
|
+
- `src/tunacode/ui/main.py:10-12`
|
|
245
|
+
- `src/tunacode/ui/app.py:28-29,339,522,656,748`
|
|
246
|
+
- `src/tunacode/ui/commands/model.py:7,31,58-59,107-108,135`
|
|
247
|
+
|
|
248
|
+
## Final Gate
|
|
249
|
+
|
|
250
|
+
- **Output summary**: `.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/`, 4 milestones, 4 tickets
|
|
251
|
+
- **Next step**: proceed to execute-phase with `.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/PLAN.md`
|
tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/INDEX.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Ticket Index"
|
|
3
|
+
type: ticket_index
|
|
4
|
+
parent_plan: "../PLAN.md"
|
|
5
|
+
created_at: "2026-03-31T17:05:09Z"
|
|
6
|
+
tags: [ticket, plan]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Ticket Index
|
|
10
|
+
|
|
11
|
+
| Task | Title | Ticket |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| T001 | Migrate startup and model-selection flows off passthrough facades | [T001](./T001.md) |
|
|
14
|
+
| T002 | Migrate runtime and rendering flows off passthrough facades | [T002](./T002.md) |
|
|
15
|
+
| T003 | Delete dead facade modules and narrow the `core/ui_api` package surface | [T003](./T003.md) |
|
|
16
|
+
| T004 | Refresh docs and add a ratchet for the reduced `ui_api` surface | [T004](./T004.md) |
|
tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T001.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "T001: Migrate startup and model-selection flows off passthrough facades"
|
|
3
|
+
type: plan_ticket
|
|
4
|
+
task_id: "T001"
|
|
5
|
+
parent_plan: "../PLAN.md"
|
|
6
|
+
created_at: "2026-03-31T17:05:09Z"
|
|
7
|
+
tags: [ticket, plan]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# T001: Migrate startup and model-selection flows off passthrough facades
|
|
11
|
+
|
|
12
|
+
**Summary**: Replace `core.ui_api` imports used by CLI startup, lifecycle, setup, model selection, theme switching, session deletion, and update flows with direct imports from the underlying `configuration`, `constants`, and `paths` modules.
|
|
13
|
+
|
|
14
|
+
**Owner**: ui-core
|
|
15
|
+
|
|
16
|
+
**Estimate**: 2.5h
|
|
17
|
+
|
|
18
|
+
**Dependencies**: none
|
|
19
|
+
|
|
20
|
+
**Target milestone**: M1
|
|
21
|
+
|
|
22
|
+
**Acceptance test**: `! rg -n "tunacode\.core\.ui_api\.(configuration|user_configuration|system_paths|constants)" src/tunacode/ui/main.py src/tunacode/ui/lifecycle.py src/tunacode/ui/screens/setup.py src/tunacode/ui/screens/model_picker.py src/tunacode/ui/screens/api_key_entry.py src/tunacode/ui/commands/model.py src/tunacode/ui/commands/theme.py src/tunacode/ui/commands/update.py src/tunacode/ui/commands/resume.py`
|
|
23
|
+
|
|
24
|
+
**Files/modules touched**:
|
|
25
|
+
- src/tunacode/ui/main.py
|
|
26
|
+
- src/tunacode/ui/lifecycle.py
|
|
27
|
+
- src/tunacode/ui/screens/setup.py
|
|
28
|
+
- src/tunacode/ui/screens/model_picker.py
|
|
29
|
+
- src/tunacode/ui/screens/api_key_entry.py
|
|
30
|
+
- src/tunacode/ui/commands/model.py
|
|
31
|
+
- src/tunacode/ui/commands/theme.py
|
|
32
|
+
- src/tunacode/ui/commands/update.py
|
|
33
|
+
- src/tunacode/ui/commands/resume.py
|
|
34
|
+
|
|
35
|
+
**Steps**:
|
|
36
|
+
1. In each listed file, replace `tunacode.core.ui_api.configuration` imports with direct imports from the specific source modules: `tunacode.configuration.defaults`, `tunacode.configuration.models`, `tunacode.configuration.pricing`, and `tunacode.configuration.settings`.
|
|
37
|
+
2. Replace `tunacode.core.ui_api.user_configuration` imports with direct imports from `tunacode.configuration.user_config`.
|
|
38
|
+
3. Replace `tunacode.core.ui_api.system_paths` imports with direct imports from `tunacode.configuration.paths`.
|
|
39
|
+
4. Replace `tunacode.core.ui_api.constants` imports in the listed files with direct imports from `tunacode.constants`.
|
|
40
|
+
5. Preserve current behavior and call ordering; only change import sources and any now-unneeded alias names.
|
|
41
|
+
6. Run the acceptance grep command and confirm the listed files no longer reference the four removable facade modules.
|
tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T002.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "T002: Migrate runtime and rendering flows off passthrough facades"
|
|
3
|
+
type: plan_ticket
|
|
4
|
+
task_id: "T002"
|
|
5
|
+
parent_plan: "../PLAN.md"
|
|
6
|
+
created_at: "2026-03-31T17:05:09Z"
|
|
7
|
+
tags: [ticket, plan]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# T002: Migrate runtime and rendering flows off passthrough facades
|
|
11
|
+
|
|
12
|
+
**Summary**: Replace `core.ui_api` imports used by the main app runtime, callbacks, compact command, session preview, widgets, styles, welcome message, and tool renderers with direct imports from `tunacode.constants`, `tunacode.types`, and `tunacode.utils.messaging`.
|
|
13
|
+
|
|
14
|
+
**Owner**: ui-core
|
|
15
|
+
|
|
16
|
+
**Estimate**: 3h
|
|
17
|
+
|
|
18
|
+
**Dependencies**: T001
|
|
19
|
+
|
|
20
|
+
**Target milestone**: M2
|
|
21
|
+
|
|
22
|
+
**Acceptance test**: `! rg -n "tunacode\.core\.ui_api\.(constants|shared_types|messaging)" src/tunacode/ui/app.py src/tunacode/ui/repl_support.py src/tunacode/ui/commands/clear.py src/tunacode/ui/commands/compact.py src/tunacode/ui/screens/session_picker.py src/tunacode/ui/widgets/messages.py src/tunacode/ui/widgets/resource_bar.py src/tunacode/ui/styles.py src/tunacode/ui/welcome.py src/tunacode/ui/renderers/agent_response.py src/tunacode/ui/renderers/panel_widths.py src/tunacode/ui/renderers/panels.py src/tunacode/ui/renderers/search.py src/tunacode/ui/renderers/tools/base.py src/tunacode/ui/renderers/tools/bash.py src/tunacode/ui/renderers/tools/diagnostics.py src/tunacode/ui/renderers/tools/discover.py src/tunacode/ui/renderers/tools/hashline_edit.py src/tunacode/ui/renderers/tools/read_file.py src/tunacode/ui/renderers/tools/web_fetch.py src/tunacode/ui/renderers/tools/write_file.py`
|
|
23
|
+
|
|
24
|
+
**Files/modules touched**:
|
|
25
|
+
- src/tunacode/ui/app.py
|
|
26
|
+
- src/tunacode/ui/repl_support.py
|
|
27
|
+
- src/tunacode/ui/commands/clear.py
|
|
28
|
+
- src/tunacode/ui/commands/compact.py
|
|
29
|
+
- src/tunacode/ui/screens/session_picker.py
|
|
30
|
+
- src/tunacode/ui/widgets/messages.py
|
|
31
|
+
- src/tunacode/ui/widgets/resource_bar.py
|
|
32
|
+
- src/tunacode/ui/styles.py
|
|
33
|
+
- src/tunacode/ui/welcome.py
|
|
34
|
+
- src/tunacode/ui/renderers/agent_response.py
|
|
35
|
+
- src/tunacode/ui/renderers/panel_widths.py
|
|
36
|
+
- src/tunacode/ui/renderers/panels.py
|
|
37
|
+
- src/tunacode/ui/renderers/search.py
|
|
38
|
+
- src/tunacode/ui/renderers/tools/base.py
|
|
39
|
+
- src/tunacode/ui/renderers/tools/bash.py
|
|
40
|
+
- src/tunacode/ui/renderers/tools/diagnostics.py
|
|
41
|
+
- src/tunacode/ui/renderers/tools/discover.py
|
|
42
|
+
- src/tunacode/ui/renderers/tools/hashline_edit.py
|
|
43
|
+
- src/tunacode/ui/renderers/tools/read_file.py
|
|
44
|
+
- src/tunacode/ui/renderers/tools/web_fetch.py
|
|
45
|
+
- src/tunacode/ui/renderers/tools/write_file.py
|
|
46
|
+
|
|
47
|
+
**Steps**:
|
|
48
|
+
1. Replace `tunacode.core.ui_api.constants` imports with direct imports from `tunacode.constants` in every listed runtime/rendering file.
|
|
49
|
+
2. Replace `tunacode.core.ui_api.shared_types` imports with direct imports from `tunacode.types` and `tunacode.types.canonical` as needed (`UsageMetrics` can come from `tunacode.types.canonical`; the callback/type aliases can come from `tunacode.types`).
|
|
50
|
+
3. Replace `tunacode.core.ui_api.messaging` imports with direct imports from `tunacode.utils.messaging`.
|
|
51
|
+
4. Keep `tunacode.core.ui_api.formatting` and `tunacode.core.ui_api.lsp_status` imports unchanged in this task because those modules still add adapter behavior.
|
|
52
|
+
5. Clean up any redundant inline imports created solely for the removed facades while preserving lazy-import behavior where the current code relies on it.
|
|
53
|
+
6. Run the acceptance grep command and confirm the listed files no longer reference the three removable runtime facade modules.
|
tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T003.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "T003: Delete dead facade modules and narrow the `core/ui_api` package surface"
|
|
3
|
+
type: plan_ticket
|
|
4
|
+
task_id: "T003"
|
|
5
|
+
parent_plan: "../PLAN.md"
|
|
6
|
+
created_at: "2026-03-31T17:05:09Z"
|
|
7
|
+
tags: [ticket, plan]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# T003: Delete dead facade modules and narrow the `core/ui_api` package surface
|
|
11
|
+
|
|
12
|
+
**Summary**: Remove the passthrough modules after all in-repo call sites stop using them, and update the package docstring so `core/ui_api` describes the reduced adapter-only surface.
|
|
13
|
+
|
|
14
|
+
**Owner**: core
|
|
15
|
+
|
|
16
|
+
**Estimate**: 1.5h
|
|
17
|
+
|
|
18
|
+
**Dependencies**: T002
|
|
19
|
+
|
|
20
|
+
**Target milestone**: M3
|
|
21
|
+
|
|
22
|
+
**Acceptance test**: `test "$(find src/tunacode/core/ui_api -maxdepth 1 -type f | xargs -n1 basename | sort | tr '\n' ' ')" = "__init__.py file_filter.py formatting.py lsp_status.py "`
|
|
23
|
+
|
|
24
|
+
**Files/modules touched**:
|
|
25
|
+
- src/tunacode/core/ui_api/__init__.py
|
|
26
|
+
- src/tunacode/core/ui_api/configuration.py
|
|
27
|
+
- src/tunacode/core/ui_api/constants.py
|
|
28
|
+
- src/tunacode/core/ui_api/messaging.py
|
|
29
|
+
- src/tunacode/core/ui_api/shared_types.py
|
|
30
|
+
- src/tunacode/core/ui_api/system_paths.py
|
|
31
|
+
- src/tunacode/core/ui_api/user_configuration.py
|
|
32
|
+
|
|
33
|
+
**Steps**:
|
|
34
|
+
1. Delete `configuration.py`, `constants.py`, `messaging.py`, `shared_types.py`, `system_paths.py`, and `user_configuration.py` from `src/tunacode/core/ui_api/`.
|
|
35
|
+
2. Rewrite `src/tunacode/core/ui_api/__init__.py` so it describes the reduced package as a home only for UI-specific adapters that add behavior, defaults, or translation.
|
|
36
|
+
3. Do not change `file_filter.py`, `formatting.py`, or `lsp_status.py` except for import cleanup if a deleted sibling module was referenced in comments or docstrings.
|
|
37
|
+
4. Re-run a repository-wide grep for `tunacode.core.ui_api.` imports and confirm only `file_filter`, `formatting`, and `lsp_status` remain in tracked source files.
|
|
38
|
+
5. Run the acceptance shell test and confirm the package file set matches the expected reduced surface exactly.
|
tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T004.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "T004: Refresh docs and add a ratchet for the reduced `ui_api` surface"
|
|
3
|
+
type: plan_ticket
|
|
4
|
+
task_id: "T004"
|
|
5
|
+
parent_plan: "../PLAN.md"
|
|
6
|
+
created_at: "2026-03-31T17:05:09Z"
|
|
7
|
+
tags: [ticket, plan]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# T004: Refresh docs and add a ratchet for the reduced `ui_api` surface
|
|
11
|
+
|
|
12
|
+
**Summary**: Update developer docs and generated structure artifacts to describe the reduced adapter-only package, and add one architecture test that fails if deleted passthrough modules are reintroduced.
|
|
13
|
+
|
|
14
|
+
**Owner**: architecture
|
|
15
|
+
|
|
16
|
+
**Estimate**: 2h
|
|
17
|
+
|
|
18
|
+
**Dependencies**: T003
|
|
19
|
+
|
|
20
|
+
**Target milestone**: M4
|
|
21
|
+
|
|
22
|
+
**Acceptance test**: `uv run pytest tests/architecture/test_ui_api_surface.py tests/test_dependency_layers.py tests/architecture/test_layer_dependencies.py tests/architecture/test_import_order.py -q`
|
|
23
|
+
|
|
24
|
+
**Files/modules touched**:
|
|
25
|
+
- tests/architecture/test_ui_api_surface.py
|
|
26
|
+
- docs/modules/core/core.md
|
|
27
|
+
- docs/modules/ui/ui.md
|
|
28
|
+
- docs/codebase-map/structure/tree-structure.txt
|
|
29
|
+
- AGENTS.md
|
|
30
|
+
|
|
31
|
+
**Steps**:
|
|
32
|
+
1. Add `tests/architecture/test_ui_api_surface.py` that asserts the file set under `src/tunacode/core/ui_api/` matches the intended reduced surface from T003.
|
|
33
|
+
2. Update `docs/modules/core/core.md` so the `ui_api/` entry describes the smaller adapter-only package instead of a broad bridge for configuration/constants/types.
|
|
34
|
+
3. Update `docs/modules/ui/ui.md` anywhere the dependency narrative implies UI must route lower-layer imports through `core/ui_api`; keep the docs consistent with the new direct-import paths.
|
|
35
|
+
4. Regenerate `docs/codebase-map/structure/tree-structure.txt` after the package shrink so the committed tree matches the source layout.
|
|
36
|
+
5. Update `AGENTS.md` `Last Updated` date and any repository-orientation bullets that describe `core/ui_api/` as a broad bridge.
|
|
37
|
+
6. Run the acceptance pytest command and confirm the reduced surface plus layer/import-order rules all pass together.
|
|
38
|
+
|
|
39
|
+
## Risks & Mitigations
|
|
40
|
+
|
|
41
|
+
- Import churn across many UI files can create noisy diffs.
|
|
42
|
+
- Mitigation: keep the refactor import-only, grouped by task, and avoid unrelated formatting changes.
|
|
43
|
+
- Some files currently rely on lazy imports to reduce startup cost or avoid cycles.
|
|
44
|
+
- Mitigation: preserve lazy-import placement unless a direct top-level import is already used safely in a nearby file.
|
|
45
|
+
- Docs may drift if the generated structure tree is not refreshed after deleting modules.
|
|
46
|
+
- Mitigation: regenerate the tree in T004 and include it in the acceptance path.
|
|
47
|
+
- A deleted facade could still be referenced outside `src/tunacode/ui/`.
|
|
48
|
+
- Mitigation: repository-wide grep in T003 before deleting files permanently.
|
|
49
|
+
|
|
50
|
+
## Test Strategy
|
|
51
|
+
|
|
52
|
+
- T001/T002 rely on grep-based proof that targeted files no longer import the removable facades.
|
|
53
|
+
- T003 relies on an exact filesystem assertion for the remaining `core/ui_api` file set.
|
|
54
|
+
- T004 adds one architecture ratchet test and reruns the existing dependency/import-order suite.
|
|
55
|
+
- Do not add more than one new test file; the only new test should be `tests/architecture/test_ui_api_surface.py`.
|
|
56
|
+
|
|
57
|
+
## References
|
|
58
|
+
|
|
59
|
+
- Research doc: `.artifacts/research/2026-03-31_16-51-07_ui-api.md` — sections `Key Files`, `Data Ingress`, `Dependencies`, `Flow Maps`
|
|
60
|
+
- `src/tunacode/core/ui_api/configuration.py:1-101`
|
|
61
|
+
- `src/tunacode/core/ui_api/constants.py:1-47`
|
|
62
|
+
- `src/tunacode/core/ui_api/messaging.py:1-36`
|
|
63
|
+
- `src/tunacode/core/ui_api/shared_types.py:1-17`
|
|
64
|
+
- `src/tunacode/core/ui_api/system_paths.py:1-44`
|
|
65
|
+
- `src/tunacode/core/ui_api/user_configuration.py:1-51`
|
|
66
|
+
- `tests/test_dependency_layers.py:11-34`
|
|
67
|
+
- `docs/modules/utils/utils.md:1-23`
|
|
68
|
+
- `docs/modules/core/core.md:68-70`
|
|
69
|
+
- `src/tunacode/ui/main.py:10-12`
|
|
70
|
+
- `src/tunacode/ui/app.py:28-29,339,522,656,748`
|
|
71
|
+
- `src/tunacode/ui/commands/model.py:7,31,58-59,107-108,135`
|
|
72
|
+
|
|
73
|
+
## Final Gate
|
|
74
|
+
|
|
75
|
+
- **Output summary**: `.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/`, 4 milestones, 4 tickets
|
|
76
|
+
- **Next step**: proceed to execute-phase with `.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/PLAN.md`
|
tunacode_cli-0.2.0/.artifacts/research/2026-03-31_11-32-31_theme-switch-dim-background-crash.md
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "theme switch dim-background crash research findings"
|
|
3
|
+
link: "theme-switch-dim-background-crash-research"
|
|
4
|
+
type: research
|
|
5
|
+
ontological_relations:
|
|
6
|
+
- relates_to: [[docs/ui/css-architecture]]
|
|
7
|
+
tags: [research, ui, themes, textual]
|
|
8
|
+
uuid: "4b86b09f-08be-49b9-bda8-d4c0713aa48a"
|
|
9
|
+
created_at: "2026-03-31T11:32:31-05:00"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Scope
|
|
13
|
+
|
|
14
|
+
Research target: the theme-switch crash reported from the installed CLI while a user was changing themes.
|
|
15
|
+
|
|
16
|
+
## Input Evidence
|
|
17
|
+
|
|
18
|
+
User-supplied traceback references:
|
|
19
|
+
- `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/filter.py:255`
|
|
20
|
+
- `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/filter.py:142`
|
|
21
|
+
|
|
22
|
+
User-supplied traceback values:
|
|
23
|
+
- `style = Style(color=Color('default', ColorType.DEFAULT), bgcolor=Color('default', ColorType.DEFAULT), dim=True, meta={'offset': (0, 1)})`
|
|
24
|
+
- `background = Color('default', ColorType.DEFAULT)`
|
|
25
|
+
- `bgcolor = Color('#f7f7f7', ColorType.TRUECOLOR, triplet=ColorTriplet(red=247, green=247, blue=247))`
|
|
26
|
+
- `color = Color('#000000', ColorType.TRUECOLOR, triplet=ColorTriplet(red=0, green=0, blue=0))`
|
|
27
|
+
- exception site: `red1, green1, blue1 = background.triplet`
|
|
28
|
+
|
|
29
|
+
## Theme Switching Structure
|
|
30
|
+
|
|
31
|
+
- `src/tunacode/ui/app.py:120-124` registers TunaCode, NeXTSTEP, and wrapped built-in themes, then sets `self.theme = THEME_NAME`.
|
|
32
|
+
- `src/tunacode/constants.py:113-114` defines the custom theme names `tunacode` and `nextstep`.
|
|
33
|
+
- `src/tunacode/constants.py:118-207` defines the built-in palette wrappers, including `catppuccin-latte`, `solarized-light`, `textual-light`, `textual-dark`, and `tokyo-night`.
|
|
34
|
+
- `src/tunacode/constants.py:217-220` defines `SUPPORTED_THEME_NAMES` as `tunacode`, `nextstep`, and all names from `BUILTIN_THEME_PALETTES`.
|
|
35
|
+
- `src/tunacode/ui/app.py:195-199` exposes `supported_themes` by filtering `available_themes` through `SUPPORTED_THEME_NAMES`.
|
|
36
|
+
- `src/tunacode/ui/commands/theme.py:23-32` applies a direct `/theme <name>` change via `app.theme = theme_name` and persists `settings.theme`.
|
|
37
|
+
- `src/tunacode/ui/commands/theme.py:37-49` opens `ThemePickerScreen` when `/theme` is invoked with no argument.
|
|
38
|
+
- `src/tunacode/ui/screens/theme_picker.py:74-80` sets the initial highlight and applies live preview on highlight changes via `self.app.theme = str(event.option.id)`.
|
|
39
|
+
- `src/tunacode/ui/screens/theme_picker.py:87-90` restores the original theme on cancel.
|
|
40
|
+
- `docs/ui/css-architecture.md:95` states that the theme picker has live preview and that ESC reverts to the original.
|
|
41
|
+
|
|
42
|
+
## Theme Object Construction
|
|
43
|
+
|
|
44
|
+
- `src/tunacode/constants.py:87-100` defines the `NEXTSTEP_COLORS` palette with `background="#acacac"`, `surface="#c8c8c8"`, and `text="#000000"`.
|
|
45
|
+
- `src/tunacode/constants.py:293-318` rebuilds built-in Textual themes in `_wrap_builtin_theme` by copying properties from the original theme.
|
|
46
|
+
- `src/tunacode/constants.py:311-314` copies `foreground`, `background`, `surface`, and `panel` with `getattr(theme, ..., None)`.
|
|
47
|
+
- `src/tunacode/constants.py:323-332` wraps any built-in theme present in `available_themes` and returns the wrapped list.
|
|
48
|
+
|
|
49
|
+
## Render Path Carrying `dim=True`
|
|
50
|
+
|
|
51
|
+
- `src/tunacode/ui/renderers/tools/base.py:112-115` builds the hook prefix and appends `HOOK_ARROW_PREFIX` with `style="dim"`.
|
|
52
|
+
- `src/tunacode/ui/renderers/tools/base.py:123` appends the relative path with `style="dim underline"`.
|
|
53
|
+
- Additional renderers in the UI use `dim` styles in rendered Rich content, including:
|
|
54
|
+
- `src/tunacode/ui/renderers/agent_response.py:58,84`
|
|
55
|
+
- `src/tunacode/ui/renderers/search.py:140,147,160,162-165`
|
|
56
|
+
- `src/tunacode/ui/renderers/tools/read_file.py:192,206,263`
|
|
57
|
+
- `src/tunacode/ui/renderers/tools/web_fetch.py:87,96-100,138,178`
|
|
58
|
+
|
|
59
|
+
## Chat Widget / Selection Path
|
|
60
|
+
|
|
61
|
+
- `src/tunacode/ui/widgets/chat.py:29-40` defines `SelectableRichVisual`.
|
|
62
|
+
- `src/tunacode/ui/widgets/chat.py:40-132` re-renders Rich content into segments and injects `meta={"offset": (x, y)}` into segment styles.
|
|
63
|
+
- `src/tunacode/ui/widgets/chat.py:66-69` builds the replacement Rich style by adding only offset metadata to the existing segment style.
|
|
64
|
+
- `src/tunacode/ui/widgets/chat.py:184-202` defines `CopyOnSelectStatic._render()` and replaces `RichVisual` with `SelectableRichVisual`.
|
|
65
|
+
- `src/tunacode/ui/widgets/chat.py:268-283` shows `ChatContainer.write()` creating a `CopyOnSelectStatic` for chat content.
|
|
66
|
+
|
|
67
|
+
## Textual Filter Path Reached by Theme Changes
|
|
68
|
+
|
|
69
|
+
Installed CLI environment paths below match the traceback path prefix `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/`.
|
|
70
|
+
|
|
71
|
+
- `app.py:536-539` defines `ansi_theme_dark = MONOKAI` and `ansi_theme_light = ALABASTER`.
|
|
72
|
+
- `app.py:583-584` installs `ANSIToTruecolor(ansi_theme, enabled=not ansi_color)` into `self._filters`.
|
|
73
|
+
- `app.py:1398-1405` returns `ansi_theme_dark` for dark themes and `ansi_theme_light` for light themes via `App.ansi_theme`.
|
|
74
|
+
- `app.py:1408-1417` replaces the `ANSIToTruecolor` filter when the app theme changes.
|
|
75
|
+
- `_styles_cache.py:125` retrieves `base_background, background = widget._opacity_background_colors`.
|
|
76
|
+
- `_styles_cache.py:250` applies each enabled filter with `strip = strip.apply_filter(filter, background)`.
|
|
77
|
+
- `_styles_cache.py:323-324` sets `inner = Style(background=(base_background + background))` and `outer = Style(background=base_background)` while rendering styled lines.
|
|
78
|
+
- `filter.py:220-255` defines `ANSIToTruecolor.truecolor_style()`.
|
|
79
|
+
- `filter.py:254-255` calls `color = dim_color(background, color)` when `style.dim` is true and `color` is not `None`.
|
|
80
|
+
- `filter.py:129-142` defines `dim_color()` and unpacks `background.triplet` at line 142.
|
|
81
|
+
|
|
82
|
+
## ANSI Theme Values Matching the Traceback
|
|
83
|
+
|
|
84
|
+
- `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/_ansi_theme.py:47-49` defines `ALABASTER = TerminalTheme(rgb(247, 247, 247), rgb(0, 0, 0), ...)`.
|
|
85
|
+
- The user-supplied traceback values `bgcolor=#f7f7f7` and `color=#000000` match `ALABASTER`'s first two RGB values at `_ansi_theme.py:48-49`.
|
|
86
|
+
- `App.ansi_theme` switches to `ansi_theme_light` for any light theme at `app.py:1398-1405`.
|
|
87
|
+
|
|
88
|
+
## Runtime Inspection Findings
|
|
89
|
+
|
|
90
|
+
Executed locally in the repo virtual environment (`uv run python`) and in the installed CLI tool environment.
|
|
91
|
+
|
|
92
|
+
### Installed CLI tool environment
|
|
93
|
+
|
|
94
|
+
Command outcome:
|
|
95
|
+
- `/home/fabian/.local/share/uv/tools/tunacode-cli/bin/python - <<'PY' ... print(textual.__version__) ... PY`
|
|
96
|
+
- reported `textual==4.0.0`
|
|
97
|
+
- executable path reported `/home/fabian/.local/share/uv/tools/tunacode-cli/bin/python`
|
|
98
|
+
|
|
99
|
+
### Repo virtual environment
|
|
100
|
+
|
|
101
|
+
Command outcome:
|
|
102
|
+
- `uv run python - <<'PY' ... print(textual.__version__) ... PY`
|
|
103
|
+
- reported `textual==4.0.0`
|
|
104
|
+
|
|
105
|
+
### Theme object values from `TextualReplApp.supported_themes`
|
|
106
|
+
|
|
107
|
+
Local inspection showed:
|
|
108
|
+
- `nextstep`: `foreground=#000000`, `background=#acacac`, `surface=#c8c8c8`
|
|
109
|
+
- `textual-light`: `foreground=None`, `background=#E0E0E0`, `surface=#D8D8D8`, `panel=#D0D0D0`
|
|
110
|
+
- `textual-dark`: `foreground=#e0e0e0`, `background=None`, `surface=None`, `panel=None`
|
|
111
|
+
- `catppuccin-latte`: `foreground=#4C4F69`, `background=#EFF1F5`, `surface=#E6E9EF`
|
|
112
|
+
- `solarized-light`: `foreground=#586e75`, `background=#fdf6e3`, `surface=#eee8d5`
|
|
113
|
+
|
|
114
|
+
## Reproduction Attempts
|
|
115
|
+
|
|
116
|
+
The following local scripted runs completed without raising the traceback exception:
|
|
117
|
+
|
|
118
|
+
1. `TextualReplApp.run_test()` with a chat message containing `Text()` segments styled as `dim` and repeated `app.theme = ...` assignments through light themes (`nextstep`, `textual-light`, `catppuccin-latte`, `solarized-light`).
|
|
119
|
+
2. `TextualReplApp.run_test()` with `ChatContainer.write()` content mounted as plain chat content, `user-message`, `tool-panel`, `agent-panel`, and `thinking-panel`, followed by repeated theme changes.
|
|
120
|
+
3. `TextualReplApp.run_test()` opening `ThemePickerScreen` and sending repeated `down` keypresses to trigger live preview changes through the picker.
|
|
121
|
+
4. A minimal standalone Textual `App` with a `Static(Text(..., style='dim'))` and repeated theme changes through light themes.
|
|
122
|
+
|
|
123
|
+
Observed result for all four runs: no exception was raised locally.
|
|
124
|
+
|
|
125
|
+
## File Map
|
|
126
|
+
|
|
127
|
+
- `src/tunacode/ui/app.py:118-124` → theme registration during app construction
|
|
128
|
+
- `src/tunacode/constants.py:87-100` → NeXTSTEP palette values
|
|
129
|
+
- `src/tunacode/constants.py:118-220` → built-in theme wrapper palette list and supported names
|
|
130
|
+
- `src/tunacode/constants.py:293-318` → built-in theme re-wrapping logic
|
|
131
|
+
- `src/tunacode/ui/commands/theme.py:23-49` → direct theme changes and picker launch
|
|
132
|
+
- `src/tunacode/ui/screens/theme_picker.py:74-90` → live preview and cancel/revert path
|
|
133
|
+
- `src/tunacode/ui/widgets/chat.py:29-132` → selectable Rich visual and segment metadata injection
|
|
134
|
+
- `src/tunacode/ui/widgets/chat.py:184-202` → `CopyOnSelectStatic` Rich visual substitution
|
|
135
|
+
- `src/tunacode/ui/widgets/chat.py:268-283` → chat widget creation path
|
|
136
|
+
- `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/app.py:536-584,1398-1417` → ANSI theme selection and filter refresh
|
|
137
|
+
- `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/_styles_cache.py:125,250,323-324` → filter application inputs
|
|
138
|
+
- `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/filter.py:129-142,220-255` → failing `dim_color` path
|
|
139
|
+
- `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/_ansi_theme.py:47-49` → ALABASTER light ANSI theme values
|