tunacode-cli 0.1.100__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/execute/2026-03-26_16-20-32_models-loading-unification.md +101 -0
- tunacode_cli-0.2.0/.artifacts/execute/2026-03-28_12-18-53_pr-444-review-fixes.md +57 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/PLAN.md +271 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/INDEX.md +16 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T001.md +37 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T002.md +46 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T003.md +35 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T004.md +70 -0
- tunacode_cli-0.2.0/.artifacts/plan/2026-03-27_13-59-15_pr-444-review-fixes/PLAN.md +202 -0
- 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-26_15-29-02_models-loading-conflict-map.md +212 -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.100 → tunacode_cli-0.2.0}/.github/workflows/dependency-map.yml +2 -2
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/workflows/empty-dir-check.yml +1 -1
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/workflows/lint.yml +4 -4
- tunacode_cli-0.2.0/.github/workflows/publish-release.yml +69 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/workflows/release.yml +2 -2
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/workflows/tech-debt.yml +4 -4
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/AGENTS.md +3 -2
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/CHANGELOG.md +23 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/HARNESS.md +15 -2
- tunacode_cli-0.2.0/LOG.md +73 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/Makefile +6 -2
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/PKG-INFO +7 -3
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/README.md +6 -1
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/codebase-map/structure/tree-structure.txt +7 -6
- tunacode_cli-0.2.0/docs/deployment.md +159 -0
- tunacode_cli-0.2.0/docs/modules/configuration/configuration.md +59 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/infrastructure/infrastructure.md +1 -1
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/tools/tools.md +6 -4
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/types/types.md +10 -3
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/ui/commands.md +8 -4
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/ui/ui.md +24 -4
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/utils/utils.md +9 -3
- tunacode_cli-0.2.0/docs/skills/audit-harness/SKILL.md +95 -0
- tunacode_cli-0.2.0/plan.md +275 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/pyproject.toml +1 -2
- tunacode_cli-0.2.0/skills/pypi-release/SKILL.md +319 -0
- tunacode_cli-0.2.0/skills/pypi-release/references/common-issues.md +156 -0
- tunacode_cli-0.2.0/skills/pypi-release/references/workflow-structure.md +205 -0
- tunacode_cli-0.2.0/skills/pypi-release/scripts/bump_version.py +145 -0
- tunacode_cli-0.2.0/skills/pypi-release/scripts/local_publish.py +155 -0
- tunacode_cli-0.2.0/skills/pypi-release/scripts/release.py +229 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/defaults.py +4 -1
- tunacode_cli-0.2.0/src/tunacode/configuration/ignore_patterns.py +113 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/limits.py +6 -37
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/models.py +63 -34
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/pricing.py +14 -10
- tunacode_cli-0.2.0/src/tunacode/configuration/user_config.py +294 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/constants.py +1 -2
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/agent_config.py +3 -9
- tunacode_cli-0.2.0/src/tunacode/core/agents/agent_components/agent_session_config.py +97 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/main.py +17 -8
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/controller.py +19 -16
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/session/state.py +26 -21
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/types/state.py +3 -1
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/configuration.py +3 -3
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/user_configuration.py +3 -3
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/limits_settings.py +6 -6
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/models_registry.py +6 -4
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/file_filter.py +14 -6
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/hashline_edit.py +7 -36
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/ignore_manager.py +7 -22
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/diagnostics.py +7 -12
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/read_file.py +6 -34
- tunacode_cli-0.2.0/src/tunacode/tools/utils/file_errors.py +52 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/write_file.py +6 -35
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/types/__init__.py +16 -2
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/types/base.py +37 -2
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/types/dataclasses.py +0 -10
- tunacode_cli-0.2.0/src/tunacode/types/models_registry.py +95 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/app.py +55 -19
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/debug.py +7 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/help.py +1 -1
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/model.py +7 -16
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/theme.py +2 -2
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/lifecycle.py +1 -1
- tunacode_cli-0.2.0/src/tunacode/ui/main.py +161 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/request_debug.py +100 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/api_key_entry.py +1 -6
- tunacode_cli-0.2.0/src/tunacode/utils/system/gitignore.py +79 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/conftest.py +5 -1
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/integration/ui/test_submit_loading_lifecycle.py +0 -1
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/system/cli/test_cli_default_command.py +1 -2
- tunacode_cli-0.2.0/tests/system/cli/test_startup.py +46 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/system/cli/test_tmux_tools.py +7 -25
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/test_compaction.py +6 -0
- tunacode_cli-0.2.0/tests/unit/configuration/test_ignore_patterns.py +40 -0
- tunacode_cli-0.2.0/tests/unit/configuration/test_models_registry_loading_behavior.py +34 -0
- tunacode_cli-0.2.0/tests/unit/configuration/test_pricing_registry_loading.py +18 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/configuration/test_provider_api_key_env_fallback.py +11 -4
- tunacode_cli-0.2.0/tests/unit/configuration/test_user_config_loading.py +53 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_request_orchestrator_parallel_tools.py +27 -0
- tunacode_cli-0.2.0/tests/unit/core/test_session_state_model_registry_loading.py +22 -0
- tunacode_cli-0.2.0/tests/unit/infrastructure/test_file_filter.py +59 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_migrated_lru_cache_replacements.py +7 -2
- tunacode_cli-0.2.0/tests/unit/tools/test_ignore_manager.py +16 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/ui/test_request_debug.py +60 -1
- tunacode_cli-0.2.0/tests/unit/utils/test_gitignore.py +66 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/uv.lock +1 -22
- tunacode_cli-0.1.100/.github/workflows/publish-release.yml +0 -73
- tunacode_cli-0.1.100/agents-typed.md +0 -180
- tunacode_cli-0.1.100/autoresearch.checks.sh +0 -9
- tunacode_cli-0.1.100/autoresearch.ideas.md +0 -1
- tunacode_cli-0.1.100/autoresearch.jsonl +0 -60
- tunacode_cli-0.1.100/autoresearch.md +0 -56
- tunacode_cli-0.1.100/autoresearch.sh +0 -12
- tunacode_cli-0.1.100/docs/modules/configuration/configuration.md +0 -47
- tunacode_cli-0.1.100/src/tunacode/configuration/feature_flags.py +0 -48
- tunacode_cli-0.1.100/src/tunacode/configuration/ignore_patterns.py +0 -135
- tunacode_cli-0.1.100/src/tunacode/configuration/user_config.py +0 -152
- tunacode_cli-0.1.100/src/tunacode/core/agents/agent_components/agent_session_config.py +0 -152
- tunacode_cli-0.1.100/src/tunacode/ui/headless/__init__.py +0 -3
- tunacode_cli-0.1.100/src/tunacode/ui/headless/output.py +0 -74
- tunacode_cli-0.1.100/src/tunacode/ui/main.py +0 -263
- tunacode_cli-0.1.100/src/tunacode/utils/system/gitignore.py +0 -81
- tunacode_cli-0.1.100/tests/system/cli/test_startup.py +0 -278
- tunacode_cli-0.1.100/typed.md +0 -150
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/README.md +0 -0
- {tunacode_cli-0.1.100 → 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.100 → tunacode_cli-0.2.0}/.artifacts/debug_history/REQUEST_CONTEXT_CUTOVER_LESSON.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/debug_history/postmortem-defensive-message-typing-2026-03-17.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/debug_history/postmortem-loading-indicator-submit-regression-2026-03-24.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/debug_history/slop_fixture.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/execute/2026-03-22_19-54-47_tinyagent-message-typing-cleanup.md +0 -0
- {tunacode_cli-0.1.100 → 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.100 → tunacode_cli-0.2.0}/.artifacts/issue_analysis_report_2026-03-21.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-22_09-58-20_native-tinyagent-tool-contract.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-22_18-08-41_tinyagent-message-typing-cleanup.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-23_15-35-00_command-autocomplete-positioning.md +0 -0
- {tunacode_cli-0.1.100 → 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.100 → tunacode_cli-0.2.0}/.artifacts/plans/consolidate-main-support-plan.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/plans/reduce-src-python-files-to-500-lines-plan.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/query_data_flow.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/release/model-registry-refresh-release-blocker-2026-03-21.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/release/release-v0.1.94-run.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/release/tmux-suite-validation-2026-03-21.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-17_13-01-09_replace_messages-cutover.md +0 -0
- {tunacode_cli-0.1.100 → 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.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-21_14-07-44_prompt-versioning-map.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-42-58_tools-implementation.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-43-01_tools-context-synthesis.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-43-03_codebase-locator_tool-system.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-45-29_tools-data-inputs-contracts.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-53-07_tool-result-adapter-runtime.md +0 -0
- {tunacode_cli-0.1.100 → 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.100 → 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.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-23_15-30-00_command-autocomplete-positioning.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-24_16-58-32_tui-submit-latency.md +0 -0
- {tunacode_cli-0.1.100 → 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.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-24_20-07-05_input-latency-regression-probe.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/tunacode_action_audit.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.coderabbit.yaml +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/dependabot.yml +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/pull_request_template.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.gitignore +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.pre-commit-config.yaml +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.test_reports/.gitkeep +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/LICENSE +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/MANIFEST.in +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/assets/hashline-edit.png +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/assets/home.png +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/CODE-STANDARDS.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/README.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.dot +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.png +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/architecture/patterns/agent-message-serialization.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/docs_audit.html +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/git/practices.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-home-catpu.png +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-home.png +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-lsp.png +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-response.png +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/tool-calls.png +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/tunacode.png +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/configuration/models-registry.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/core/core.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/index.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/skills/skills.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/tools/hashline-subsystem.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/tools/tools-system.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/reviews/2026-03-24-input-latency-research-artifact.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/reviews/2026-03-25-provider-stream-stall-artifact.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/reviews/pr-429-coderabbit-review.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/ui/css-architecture.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/pytest.ini +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/benchmarks/input_latency.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/benchmarks/input_paint_latency.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/benchmarks/input_tmux_latency.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check-defensive-slop.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check-file-length.sh +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check-naming-conventions.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check-unused-constants.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check_agents_freshness.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check_unused_modules.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/dev-setup.sh +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/download_ripgrep.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/generate-release-notes.sh +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/generate_structure_tree.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/grimp_layers_report.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/install_linux.sh +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/playwright_cache.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/preview_tool_panels.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/run-dead-imports.sh +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/run_gates.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/startup_timer.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/todo_baseline.json +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/todo_scanner.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/ui_import_timer.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/uninstall.sh +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/update_models_registry.sh +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/utils/check_empty_dirs.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/utils/vulture_whitelist.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/models_registry.json +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/paths.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/settings.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/agent_helpers.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/helpers.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/sanitize.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/sanitize_debug.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/prompts.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/summarizer.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/types.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/debug/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/debug/usage_trace.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/logging/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/logging/handlers.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/logging/levels.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/logging/manager.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/logging/records.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/session/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/types/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/types/agent_state.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/types/state_structures.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/types/tool_registry.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/constants.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/file_filter.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/formatting.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/lsp_status.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/messaging.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/shared_types.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/system_paths.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/exceptions.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/agents.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/skills.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/tunacode_context.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/manager.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/metadata.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/strategies.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/prompts/system_prompt.md +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/py.typed +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/discovery.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/loader.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/models.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/prompting.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/registry.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/search.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/selection.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/bash.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/ignore_manager_cache.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/ripgrep_cache.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/discover.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/hashline.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/ignore.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/line_cache.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/client.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/servers.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_pipeline.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_terms.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_types.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/formatting.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/ripgrep.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/web_fetch.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/types/callbacks.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/types/canonical.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/assets/logo.ansi +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/clipboard.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/command_registry.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/base.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/cancel.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/clear.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/compact.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/exit.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/resume.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/skills.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/thoughts.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/update.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/context_panel.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/handler.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/types.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/logo_assets.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/model_display.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/agent_response.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/errors.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/panel_widths.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/panels.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/search.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/thinking.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/base.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/bash.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/diagnostics.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/discover.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/hashline_edit.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/read_file.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/syntax_utils.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/web_fetch.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/write_file.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/repl_support.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/request_bridge.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/model_picker.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/session_picker.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/setup.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/theme_picker.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/update_confirm.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/shell_runner.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/slopgotchi/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/slopgotchi/panel.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/streaming.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/layout.tcss +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/modals.tcss +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/panels.tcss +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/widgets.tcss +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/styles.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/thinking_state.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/welcome.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/chat.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/command_autocomplete.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/editor.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/file_autocomplete.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/messages.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/resource_bar.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/skills_autocomplete.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/utils/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/adapter.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/token_counter.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/utils/system/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/architecture/__init__.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/architecture/test_import_order.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/architecture/test_imports_in_init.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/architecture/test_init_bloat.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/architecture/test_layer_dependencies.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/integration/core/test_minimax_execution_path.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/integration/core/test_mtime_caches_end_to_end.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/integration/core/test_tinyagent_alchemy_usage_contract_live.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/system/cli/test_repl_support.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/test_dependency_layers.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/configuration/test_default_config_minimax_keys.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/configuration/test_default_config_stream_agent_text.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/configuration/test_models_registry_minimax_contract.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_cache_abort.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_helpers.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_init_debug.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_skills_prompt_injection.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_stream_provider_debug.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_compaction_controller_outcomes.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_compaction_summarizer.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_context_overflow_detection.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_exceptions.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_logging.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_openrouter_usage_metrics.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_provider_error_surfacing.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_session_state_defaults.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_session_usage_schema.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_stream_phase_debug.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_thinking_stream_routing.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_tinyagent_openrouter_model_config.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_tool_concurrency_limit.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_usage_trace_debug.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_cache_infrastructure.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_typed_cache_accessors.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/skills/test_registry.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/skills/test_selection.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/test_sanitize_canonicalization.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/types/test_adapter.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/types/test_canonical.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/types/test_tool_registry.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/ui/test_app_loading_indicator.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/ui/test_request_threading.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/ui/test_thinking_state.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/utils/test_shell_command_escape.py +0 -0
- {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/utils/test_token_counter.py +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "models-loading-unification execution log"
|
|
3
|
+
link: "models-loading-unification-execute"
|
|
4
|
+
type: debug_history
|
|
5
|
+
ontological_relations:
|
|
6
|
+
- relates_to: [[models-loading-unification-plan]]
|
|
7
|
+
tags: [execute, models-loading-unification]
|
|
8
|
+
uuid: "7128467b-456e-4511-ae33-ed0d0149f041"
|
|
9
|
+
created_at: "2026-03-26T16:20:32-05:00"
|
|
10
|
+
owner: "fabian"
|
|
11
|
+
plan_path: ".artifacts/plan/2026-03-26_15-34-01_models-loading-unification/PLAN.md"
|
|
12
|
+
start_commit: "3dc47ef3"
|
|
13
|
+
end_commit: "7773201e"
|
|
14
|
+
env: {target: "local", notes: "Gate remediation completed via user-directed make check; all hooks now pass."}
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Pre-Flight Checks
|
|
18
|
+
- Branch: qa
|
|
19
|
+
- Rollback commit: c9345dda
|
|
20
|
+
- DoR satisfied: yes
|
|
21
|
+
- Access/secrets: present
|
|
22
|
+
- Fixtures/data: ready
|
|
23
|
+
|
|
24
|
+
## Task Execution
|
|
25
|
+
|
|
26
|
+
### T001 – Add a single internal registry accessor for read paths
|
|
27
|
+
- Status: completed
|
|
28
|
+
- Commit: 0bccb8dd
|
|
29
|
+
- Files: (no additional file delta; validated rollback baseline implementation)
|
|
30
|
+
- Commands: `uv run pytest tests/unit/infrastructure/test_migrated_lru_cache_replacements.py::test_models_registry_cache_clears_via_clear_all -q` → pass
|
|
31
|
+
- Tests: pass
|
|
32
|
+
- Coverage delta: n/a
|
|
33
|
+
- Notes: Typed registry schema/cache signatures and cache-clear semantics were already present in baseline commit c9345dda.
|
|
34
|
+
|
|
35
|
+
### T002 – Refactor registry-dependent metadata and pricing lookups to the unified loader
|
|
36
|
+
- Status: completed
|
|
37
|
+
- Commit: be89474e
|
|
38
|
+
- Files:
|
|
39
|
+
- src/tunacode/configuration/models.py
|
|
40
|
+
- src/tunacode/configuration/pricing.py
|
|
41
|
+
- tests/unit/configuration/test_models_registry_loading_behavior.py
|
|
42
|
+
- Commands: `uv run pytest tests/unit/configuration/test_models_registry_minimax_contract.py tests/unit/configuration/test_models_registry_loading_behavior.py -q` → pass
|
|
43
|
+
- Tests: pass
|
|
44
|
+
- Coverage delta: n/a
|
|
45
|
+
- Notes: Normal metadata/pricing reads now load via `_get_registry_for_read()` on cold cache while preserving explicit fallback behavior.
|
|
46
|
+
|
|
47
|
+
### T003 – Remove redundant preload coupling from runtime call sites
|
|
48
|
+
- Status: completed
|
|
49
|
+
- Commit: 8176c005
|
|
50
|
+
- Files:
|
|
51
|
+
- src/tunacode/core/agents/agent_components/agent_config.py
|
|
52
|
+
- src/tunacode/core/compaction/controller.py
|
|
53
|
+
- src/tunacode/ui/commands/model.py
|
|
54
|
+
- Commands: `uv run pytest tests/unit/core/test_tinyagent_openrouter_model_config.py -q` → pass
|
|
55
|
+
- Tests: pass
|
|
56
|
+
- Coverage delta: n/a
|
|
57
|
+
- Notes: Removed explicit `load_models_registry()` correctness preloads from listed call sites and retained warmup in `get_or_create_agent()`.
|
|
58
|
+
|
|
59
|
+
### T004 – Add targeted cold-cache regression coverage for session and pricing paths
|
|
60
|
+
- Status: completed
|
|
61
|
+
- Commit: 7773201e
|
|
62
|
+
- Files:
|
|
63
|
+
- tests/unit/core/test_session_state_model_registry_loading.py
|
|
64
|
+
- tests/unit/configuration/test_pricing_registry_loading.py
|
|
65
|
+
- Commands: `uv run pytest tests/unit/core/test_session_state_model_registry_loading.py tests/unit/configuration/test_pricing_registry_loading.py -q` → pass
|
|
66
|
+
- Tests: pass
|
|
67
|
+
- Coverage delta: n/a
|
|
68
|
+
- Notes: Added HOME-isolated StateManager cold-cache test and cold-cache pricing regression test with explicit cache clearing before/after.
|
|
69
|
+
|
|
70
|
+
## Gate Results
|
|
71
|
+
- Tests: `uv run pytest` → pass (305 passed, 3 skipped)
|
|
72
|
+
- Coverage: not run (repository gate path is `make check`; no standalone coverage command in that gate)
|
|
73
|
+
- Type checks: `uv run mypy src/` (from earlier Gate C run) and `make check` pre-push mypy hook → pass
|
|
74
|
+
- Security: `make check` (`bandit`, security audit) → pass
|
|
75
|
+
- Linters: `make check` (`ruff`, `ruff format`, naming/length/defensive checks) → pass
|
|
76
|
+
- Freshness: `uv run python scripts/check_agents_freshness.py` → pass
|
|
77
|
+
|
|
78
|
+
## Deployment (if applicable)
|
|
79
|
+
- Staging: n/a
|
|
80
|
+
- Prod: n/a
|
|
81
|
+
- Timestamps: n/a
|
|
82
|
+
|
|
83
|
+
## Issues & Resolutions
|
|
84
|
+
- Initial Gate C command (`uv run black --check src/`) failed because `black` is not available in this repo environment.
|
|
85
|
+
- User directed fallback to repository canonical gate: `make check`.
|
|
86
|
+
- `make check` initially failed on:
|
|
87
|
+
- `tests/unit/configuration/test_ignore_patterns.py:17` E501 (line too long)
|
|
88
|
+
- `src/tunacode/constants.py` unused constant `MAX_FILES_IN_DIR`
|
|
89
|
+
- Resolved by:
|
|
90
|
+
- wrapping the long line in `tests/unit/configuration/test_ignore_patterns.py`
|
|
91
|
+
- removing `MAX_FILES_IN_DIR` from `src/tunacode/constants.py`
|
|
92
|
+
- rerunning `make check` to green
|
|
93
|
+
|
|
94
|
+
## Success Criteria
|
|
95
|
+
- [x] All planned gates passed
|
|
96
|
+
- [x] Rollout completed or rolled back
|
|
97
|
+
- [ ] KPIs/SLOs within thresholds
|
|
98
|
+
- [x] Execution log saved
|
|
99
|
+
|
|
100
|
+
## Next Steps
|
|
101
|
+
- Proceed to QA-from-execute using this execution log.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "pr-444 review fixes execution log"
|
|
3
|
+
link: "pr-444-review-fixes-execute"
|
|
4
|
+
type: debug_history
|
|
5
|
+
ontological_relations:
|
|
6
|
+
- relates_to: [[pr-444-review-fixes-plan]]
|
|
7
|
+
tags: [execute, pr-444, review-fixes]
|
|
8
|
+
uuid: "ee9ac1f4-0a60-4f82-9f9e-303986d60222"
|
|
9
|
+
created_at: "2026-03-28T12:18:53-05:00"
|
|
10
|
+
owner: "fabian"
|
|
11
|
+
plan_path: ".artifacts/plan/2026-03-27_13-59-15_pr-444-review-fixes/PLAN.md"
|
|
12
|
+
start_commit: "bf6ee510"
|
|
13
|
+
env: {target: "local", notes: "Executing compatibility-only review fixes for PR #444 on branch qa."}
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Pre-Flight Checks
|
|
17
|
+
- Branch: qa
|
|
18
|
+
- Rollback commit: pending
|
|
19
|
+
- DoR satisfied: yes
|
|
20
|
+
- Access/secrets: present
|
|
21
|
+
- Fixtures/data: ready
|
|
22
|
+
|
|
23
|
+
## Task Execution
|
|
24
|
+
|
|
25
|
+
### T001 – Restore shared ignore-file fallback behavior
|
|
26
|
+
- Status: pending
|
|
27
|
+
|
|
28
|
+
### T002 – Add ignore fault-tolerance regression tests
|
|
29
|
+
- Status: pending
|
|
30
|
+
|
|
31
|
+
### T003 – Restore `tunacode.types` compatibility exports
|
|
32
|
+
- Status: pending
|
|
33
|
+
|
|
34
|
+
### T004 – Add compatibility regression coverage and targeted validation
|
|
35
|
+
- Status: pending
|
|
36
|
+
|
|
37
|
+
## Gate Results
|
|
38
|
+
- Tests: pending
|
|
39
|
+
- Coverage: not run
|
|
40
|
+
- Type checks: not run
|
|
41
|
+
- Security: not run
|
|
42
|
+
- Linters: not run
|
|
43
|
+
- Freshness: pending
|
|
44
|
+
|
|
45
|
+
## Deployment (if applicable)
|
|
46
|
+
- Staging: n/a
|
|
47
|
+
- Prod: n/a
|
|
48
|
+
- Timestamps: n/a
|
|
49
|
+
|
|
50
|
+
## Issues & Resolutions
|
|
51
|
+
- None yet.
|
|
52
|
+
|
|
53
|
+
## Success Criteria
|
|
54
|
+
- [ ] All planned gates passed
|
|
55
|
+
- [ ] Rollout completed or rolled back
|
|
56
|
+
- [ ] KPIs/SLOs within thresholds
|
|
57
|
+
- [x] Execution log saved
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "models-loading-unification implementation plan"
|
|
3
|
+
link: "models-loading-unification-plan"
|
|
4
|
+
type: implementation_plan
|
|
5
|
+
ontological_relations:
|
|
6
|
+
- relates_to: [[models-loading-conflict-map-research]]
|
|
7
|
+
tags: [plan, models-loading-unification, coding]
|
|
8
|
+
uuid: "b6aa9eea-3a21-4a1f-a083-2c14e0c1ccdc"
|
|
9
|
+
created_at: "2026-03-26T20:34:05.921350+00:00"
|
|
10
|
+
parent_research: ".artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md"
|
|
11
|
+
git_commit_at_plan: "3dc47ef3"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Goal
|
|
15
|
+
|
|
16
|
+
Unify model-registry loading so all metadata lookups (env var, base URL, alchemy API, pricing, context window) behave consistently on cold cache without requiring call-site preloads.
|
|
17
|
+
|
|
18
|
+
Out of scope: deployment workflow changes, provider contract redesign, broad refactors outside model-registry access paths, or multi-provider feature additions.
|
|
19
|
+
|
|
20
|
+
## Scope & Assumptions
|
|
21
|
+
|
|
22
|
+
- IN scope:
|
|
23
|
+
- Add a single internal loading mechanism for registry-backed reads.
|
|
24
|
+
- Define a typed schema for the bundled `models_registry.json` document and use it for registry loader/cache signatures.
|
|
25
|
+
- Refactor cache-only accessors to use the unified mechanism.
|
|
26
|
+
- Remove redundant explicit `load_models_registry()` preloads where no longer needed.
|
|
27
|
+
- Add focused regression tests for cold-cache behavior.
|
|
28
|
+
- OUT of scope:
|
|
29
|
+
- Changing bundled registry source generation logic in `scripts/update_models_registry.sh`.
|
|
30
|
+
- UI redesign or command UX changes.
|
|
31
|
+
- Performance benchmarking beyond existing unit-level assertions.
|
|
32
|
+
- Assumptions:
|
|
33
|
+
- `models_registry.json` remains bundled and valid JSON dict.
|
|
34
|
+
- Existing cache manager semantics (`clear_all`) remain authoritative.
|
|
35
|
+
- Normal metadata reads should lazy-load registry data on demand.
|
|
36
|
+
- `get_cached_models_registry()` remains cache-only and must not trigger a load.
|
|
37
|
+
- `DEFAULT_CONTEXT_WINDOW` remains the fallback only for invalid model strings/missing model metadata.
|
|
38
|
+
|
|
39
|
+
## Deliverables
|
|
40
|
+
|
|
41
|
+
- Typed registry schema in the `types` layer for `models_registry.json`.
|
|
42
|
+
- Unified registry-read path in configuration modules.
|
|
43
|
+
- Updated runtime call sites aligned with unified loading semantics.
|
|
44
|
+
- Regression tests proving cold-cache consistency.
|
|
45
|
+
- Minimal developer-facing notes inline in code comments/docstrings where behavior changes.
|
|
46
|
+
|
|
47
|
+
## Implementation Contract
|
|
48
|
+
|
|
49
|
+
- Registry shape must be typed:
|
|
50
|
+
- add a dedicated registry schema type for the bundled JSON document
|
|
51
|
+
- use typed registry return values for loader/cache/facade functions instead of `dict[str, Any]`
|
|
52
|
+
- do not add new ad-hoc `Any`-based wrappers around registry payloads
|
|
53
|
+
- Normal read paths must auto-load:
|
|
54
|
+
- `get_provider_env_var`
|
|
55
|
+
- `get_provider_base_url`
|
|
56
|
+
- `get_provider_alchemy_api`
|
|
57
|
+
- `get_model_context_window`
|
|
58
|
+
- `get_model_pricing`
|
|
59
|
+
- Cache inspection stays cache-only:
|
|
60
|
+
- `get_cached_models_registry()` must not load the registry.
|
|
61
|
+
- Preserve fallback behavior:
|
|
62
|
+
- unknown provider env var -> derive `PROVIDER_API_KEY` from provider id
|
|
63
|
+
- missing provider base URL -> `None`
|
|
64
|
+
- missing provider alchemy API -> `None`
|
|
65
|
+
- invalid model string or missing context limit -> `DEFAULT_CONTEXT_WINDOW`
|
|
66
|
+
- missing pricing data -> `None`
|
|
67
|
+
- Explicit preload cleanup decision:
|
|
68
|
+
- remove correctness preloads from `agent_config._resolve_base_url`
|
|
69
|
+
- remove correctness preloads from `CompactionController._resolve_base_url`
|
|
70
|
+
- remove correctness preloads from `CompactionController._resolve_api_key`
|
|
71
|
+
- remove correctness preloads from `ModelCommand._handle_direct_model_selection`
|
|
72
|
+
- keep `load_models_registry()` in `agent_config.get_or_create_agent()` for now; it remains an intentional init warmup/logging hook and is not part of this cleanup
|
|
73
|
+
|
|
74
|
+
## Readiness
|
|
75
|
+
|
|
76
|
+
- Preconditions:
|
|
77
|
+
- Research artifact exists: `.artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md`.
|
|
78
|
+
- Bundled registry file exists: `src/tunacode/configuration/models_registry.json`.
|
|
79
|
+
- Unit test suite runnable via `uv run pytest`.
|
|
80
|
+
- Must exist before start:
|
|
81
|
+
- Current cache API in `src/tunacode/infrastructure/cache/caches/models_registry.py`.
|
|
82
|
+
- Current accessors in `src/tunacode/configuration/models.py` and `src/tunacode/configuration/pricing.py`.
|
|
83
|
+
|
|
84
|
+
## Milestones
|
|
85
|
+
|
|
86
|
+
- M1: Keep a single unified registry access helper for normal read paths, add typed registry schema, and preserve cache semantics.
|
|
87
|
+
- M2: Migrate metadata/pricing/context accessors to unified helper.
|
|
88
|
+
- M3: Align runtime call sites and remove redundant preload coupling.
|
|
89
|
+
- M4: Add regression tests for cold-cache correctness and integration touchpoints.
|
|
90
|
+
|
|
91
|
+
## Ticket Index
|
|
92
|
+
|
|
93
|
+
<!-- TICKET_INDEX:START -->
|
|
94
|
+
|
|
95
|
+
| Task | Title | Ticket |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| T001 | Add a single internal registry accessor for read paths | [tickets/T001.md](tickets/T001.md) |
|
|
98
|
+
| T002 | Refactor registry-dependent metadata and pricing lookups to the unified loader | [tickets/T002.md](tickets/T002.md) |
|
|
99
|
+
| T003 | Remove redundant preload coupling from runtime call sites | [tickets/T003.md](tickets/T003.md) |
|
|
100
|
+
| T004 | Add targeted cold-cache regression coverage for session and pricing paths | [tickets/T004.md](tickets/T004.md) |
|
|
101
|
+
|
|
102
|
+
<!-- TICKET_INDEX:END -->
|
|
103
|
+
|
|
104
|
+
## Work Breakdown (Tasks)
|
|
105
|
+
|
|
106
|
+
### T001: Add a single internal registry accessor for read paths
|
|
107
|
+
|
|
108
|
+
**Summary**: Use the private helper in `models.py` as the only internal load-backed registry accessor for normal read operations, and formalize the registry JSON shape with typed schema definitions.
|
|
109
|
+
|
|
110
|
+
**Owner**: backend
|
|
111
|
+
|
|
112
|
+
**Estimate**: 1.5h
|
|
113
|
+
|
|
114
|
+
**Dependencies**: none
|
|
115
|
+
|
|
116
|
+
**Target milestone**: M1
|
|
117
|
+
|
|
118
|
+
**Acceptance test**: `uv run pytest tests/unit/infrastructure/test_migrated_lru_cache_replacements.py::test_models_registry_cache_clears_via_clear_all -q`
|
|
119
|
+
|
|
120
|
+
**Files/modules touched**:
|
|
121
|
+
- src/tunacode/configuration/models.py
|
|
122
|
+
- src/tunacode/infrastructure/cache/caches/models_registry.py
|
|
123
|
+
- src/tunacode/types/models_registry.py
|
|
124
|
+
- src/tunacode/types/__init__.py
|
|
125
|
+
- src/tunacode/types/dataclasses.py
|
|
126
|
+
|
|
127
|
+
**Steps**:
|
|
128
|
+
1. Use the existing private helper `_get_registry_for_read()` in `models.py` as the single internal load-backed entry point for normal registry reads. Do not add a second helper.
|
|
129
|
+
2. Add a dedicated typed schema for the bundled registry document in the `types` layer. The schema should represent the real JSON structure used by provider and model entries, including `models`, `env`, `api`, `alchemy_api`, `limit`, and `cost`.
|
|
130
|
+
3. Update registry cache and loader signatures to return the typed registry document instead of `dict[str, Any]`.
|
|
131
|
+
4. Remove the stale unused `ModelRegistry` alias that does not describe the real bundled JSON document.
|
|
132
|
+
5. Keep `get_cached_models_registry()` behavior unchanged for explicit cache-only callers.
|
|
133
|
+
6. Keep cache clearing semantics unchanged: `clear_all()` must still empty the models registry cache.
|
|
134
|
+
|
|
135
|
+
### T002: Refactor registry-dependent metadata and pricing lookups to the unified loader
|
|
136
|
+
|
|
137
|
+
**Summary**: Migrate cache-dependent accessors so cold-cache reads return registry-backed values instead of fallback-only values when registry data exists.
|
|
138
|
+
|
|
139
|
+
**Owner**: backend
|
|
140
|
+
|
|
141
|
+
**Estimate**: 2h
|
|
142
|
+
|
|
143
|
+
**Dependencies**: T001
|
|
144
|
+
|
|
145
|
+
**Target milestone**: M2
|
|
146
|
+
|
|
147
|
+
**Acceptance test**: `uv run pytest tests/unit/configuration/test_models_registry_minimax_contract.py tests/unit/configuration/test_models_registry_loading_behavior.py -q`
|
|
148
|
+
|
|
149
|
+
**Files/modules touched**:
|
|
150
|
+
- src/tunacode/configuration/models.py
|
|
151
|
+
- src/tunacode/configuration/pricing.py
|
|
152
|
+
- src/tunacode/core/ui_api/configuration.py
|
|
153
|
+
- tests/unit/configuration/test_provider_api_key_env_fallback.py
|
|
154
|
+
- tests/unit/configuration/test_models_registry_minimax_contract.py
|
|
155
|
+
- tests/unit/configuration/test_models_registry_loading_behavior.py
|
|
156
|
+
|
|
157
|
+
**Steps**:
|
|
158
|
+
1. Refactor `get_provider_env_var`, `get_provider_base_url`, `get_provider_alchemy_api`, and `get_model_context_window` to use `_get_registry_for_read()`.
|
|
159
|
+
2. Refactor `get_model_pricing` in `pricing.py` to use the same load-backed contract. Do not add a second registry-loading implementation.
|
|
160
|
+
3. Use the typed registry schema in these accessors instead of raw `dict[str, Any]` access where practical. Helper functions for looking up provider/model entries are acceptable if they keep the code smaller and clearer.
|
|
161
|
+
4. Preserve fallback behavior exactly:
|
|
162
|
+
- unknown provider env var still derives from provider id
|
|
163
|
+
- missing base URL or alchemy API still returns `None`
|
|
164
|
+
- invalid model string or missing context limit still returns `DEFAULT_CONTEXT_WINDOW`
|
|
165
|
+
- missing pricing still returns `None`
|
|
166
|
+
5. Create `tests/unit/configuration/test_models_registry_loading_behavior.py` and add explicit cold-cache assertions:
|
|
167
|
+
- `get_provider_env_var("minimax-coding-plan") == "MINIMAX_API_KEY"`
|
|
168
|
+
- `get_provider_alchemy_api("minimax-coding-plan") == "minimax-completions"`
|
|
169
|
+
- `get_model_context_window("minimax-coding-plan:MiniMax-M2.1") == 204800`
|
|
170
|
+
- `get_model_pricing("openrouter:openai/gpt-4.1")` returns `input=2`, `cached_input=0.5`, `output=8`
|
|
171
|
+
6. Keep `tests/unit/configuration/test_models_registry_minimax_contract.py` as the normalized-contract test and use the new file for cold-cache behavior.
|
|
172
|
+
|
|
173
|
+
### T003: Remove redundant preload coupling from runtime call sites
|
|
174
|
+
|
|
175
|
+
**Summary**: Simplify runtime paths by removing explicit preload calls that were previously required for correctness, while keeping behavior stable.
|
|
176
|
+
|
|
177
|
+
**Owner**: backend
|
|
178
|
+
|
|
179
|
+
**Estimate**: 1.5h
|
|
180
|
+
|
|
181
|
+
**Dependencies**: T002
|
|
182
|
+
|
|
183
|
+
**Target milestone**: M3
|
|
184
|
+
|
|
185
|
+
**Acceptance test**: `uv run pytest tests/unit/core/test_tinyagent_openrouter_model_config.py -q`
|
|
186
|
+
|
|
187
|
+
**Files/modules touched**:
|
|
188
|
+
- src/tunacode/core/agents/agent_components/agent_config.py
|
|
189
|
+
- src/tunacode/core/compaction/controller.py
|
|
190
|
+
- src/tunacode/ui/commands/model.py
|
|
191
|
+
|
|
192
|
+
**Steps**:
|
|
193
|
+
1. Remove `load_models_registry()` from `agent_config._resolve_base_url()`.
|
|
194
|
+
2. Remove `load_models_registry()` from `CompactionController._resolve_base_url()` and `CompactionController._resolve_api_key()`.
|
|
195
|
+
3. Remove `load_models_registry()` from `ModelCommand._handle_direct_model_selection()`.
|
|
196
|
+
4. Keep `load_models_registry()` in `agent_config.get_or_create_agent()` for now. It remains an intentional init warmup/logging hook and is not part of this cleanup.
|
|
197
|
+
5. Do not add any new preload to `StateManager`; first-read correctness there must come from load-backed accessors, not caller preloading.
|
|
198
|
+
6. Update any affected inline comments to describe the lazy-load contract.
|
|
199
|
+
|
|
200
|
+
### T004: Add targeted cold-cache regression coverage for session and pricing paths
|
|
201
|
+
|
|
202
|
+
**Summary**: Add focused tests proving that first-read behavior is correct without manual preload in state initialization and pricing lookup.
|
|
203
|
+
|
|
204
|
+
**Owner**: backend
|
|
205
|
+
|
|
206
|
+
**Estimate**: 2h
|
|
207
|
+
|
|
208
|
+
**Dependencies**: T002,T003
|
|
209
|
+
|
|
210
|
+
**Target milestone**: M4
|
|
211
|
+
|
|
212
|
+
**Acceptance test**: `uv run pytest tests/unit/core/test_session_state_model_registry_loading.py tests/unit/configuration/test_pricing_registry_loading.py -q`
|
|
213
|
+
|
|
214
|
+
**Files/modules touched**:
|
|
215
|
+
- tests/unit/core/test_session_state_model_registry_loading.py
|
|
216
|
+
- tests/unit/configuration/test_pricing_registry_loading.py
|
|
217
|
+
|
|
218
|
+
**Steps**:
|
|
219
|
+
1. Create `tests/unit/core/test_session_state_model_registry_loading.py`.
|
|
220
|
+
2. In the session test, isolate user config by patching `HOME` to a temp directory before constructing `StateManager()`. `Path.home() / ".config"` is the config source used by `ApplicationSettings`, so patching `XDG_DATA_HOME` alone is not sufficient.
|
|
221
|
+
3. In the session test, call `clear_all()` before construction and assert:
|
|
222
|
+
- `state_manager.session.current_model == "openrouter:openai/gpt-4.1"`
|
|
223
|
+
- `state_manager.session.conversation.max_tokens == 1047576`
|
|
224
|
+
4. Create `tests/unit/configuration/test_pricing_registry_loading.py`.
|
|
225
|
+
5. In the pricing test, call `clear_all()` and assert `get_model_pricing("openrouter:openai/gpt-4.1")` succeeds on cold cache with `input=2`, `cached_input=0.5`, `output=8`.
|
|
226
|
+
6. Keep both tests isolated with explicit cache clearing before and after to avoid order-dependent behavior.
|
|
227
|
+
7. Do not modify source files in this ticket unless a failing test proves an unresolved T002/T003 bug.
|
|
228
|
+
|
|
229
|
+
## Risks & Mitigations
|
|
230
|
+
|
|
231
|
+
- Risk: eager loading in new paths could mask invalid registry file errors at different call timing.
|
|
232
|
+
- Mitigation: keep failure mode explicit via existing `TypeError`/JSON loading behavior and test first-read paths.
|
|
233
|
+
- Risk: typed schema drifts from the real bundled JSON shape.
|
|
234
|
+
- Mitigation: define the schema from the actual `models_registry.json` fields used in production code and keep it scoped to the fields TunaCode actually reads.
|
|
235
|
+
- Risk: hidden callers may rely on previous fallback strings/`None` values when cache is empty.
|
|
236
|
+
- Mitigation: constrain change to the accessors listed in the implementation contract and keep fallback behavior explicit in tests.
|
|
237
|
+
- Risk: cache lifecycle regressions after refactor.
|
|
238
|
+
- Mitigation: keep `clear_all` regression test as gate and avoid cache-manager API changes.
|
|
239
|
+
- Risk: junior implementer removes the wrong preload.
|
|
240
|
+
- Mitigation: T003 now names each preload call to remove and the one preload to keep.
|
|
241
|
+
- Risk: session-state test reads the real user config.
|
|
242
|
+
- Mitigation: T004 requires patching `HOME` to a temp directory before constructing `StateManager()`.
|
|
243
|
+
|
|
244
|
+
## Test Strategy
|
|
245
|
+
|
|
246
|
+
- One primary validation per task (as listed in each ticket acceptance test).
|
|
247
|
+
- Add at most one new focused test file per subsystem touched (configuration, core/session).
|
|
248
|
+
- Prioritize cold-cache first-read behavior and deterministic results for known MiniMax/openrouter fixtures.
|
|
249
|
+
- Use exact assertion values for MiniMax env/alchemy/context and OpenRouter pricing/context so the tests do not depend on vague “truthy” checks.
|
|
250
|
+
- After touching `src/`, run `uv run python scripts/check_agents_freshness.py`.
|
|
251
|
+
|
|
252
|
+
## References
|
|
253
|
+
|
|
254
|
+
- `.artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md`
|
|
255
|
+
- `src/tunacode/configuration/models.py` (`load_models_registry`, `_get_registry_for_read`, provider/context accessors)
|
|
256
|
+
- `src/tunacode/configuration/pricing.py` (`get_model_pricing`)
|
|
257
|
+
- `src/tunacode/types/models_registry.py` (typed registry document schema)
|
|
258
|
+
- `src/tunacode/core/session/state.py` (`_load_user_configuration`, `load_session`)
|
|
259
|
+
- `src/tunacode/core/agents/agent_components/agent_config.py` (`_resolve_base_url`, `get_or_create_agent`)
|
|
260
|
+
- `src/tunacode/core/compaction/controller.py` (`_resolve_base_url`, `_resolve_api_key`)
|
|
261
|
+
- `src/tunacode/ui/commands/model.py` (`_handle_direct_model_selection`)
|
|
262
|
+
- `src/tunacode/configuration/settings.py` (`ApplicationSettings.paths.config_file`)
|
|
263
|
+
|
|
264
|
+
## Final Gate
|
|
265
|
+
|
|
266
|
+
- **Output summary**: `.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/`, milestones=4, tickets=4
|
|
267
|
+
- **Required checks before handoff**:
|
|
268
|
+
- `uv run pytest tests/unit/infrastructure/test_migrated_lru_cache_replacements.py::test_models_registry_cache_clears_via_clear_all -q`
|
|
269
|
+
- task acceptance tests listed in each ticket
|
|
270
|
+
- `uv run python scripts/check_agents_freshness.py`
|
|
271
|
+
- **Next step**: proceed to execute-phase with `.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/PLAN.md`
|
tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/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-26T20:35:15Z"
|
|
6
|
+
tags: [ticket, plan]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Ticket Index
|
|
10
|
+
|
|
11
|
+
| Task | Title | Ticket |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| T001 | Add a single internal registry accessor for read paths | [T001](./T001.md) |
|
|
14
|
+
| T002 | Refactor registry-dependent metadata and pricing lookups to the unified loader | [T002](./T002.md) |
|
|
15
|
+
| T003 | Remove redundant preload coupling from runtime call sites | [T003](./T003.md) |
|
|
16
|
+
| T004 | Add targeted cold-cache regression coverage for session and pricing paths | [T004](./T004.md) |
|
tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T001.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "T001: Add a single internal registry accessor for read paths"
|
|
3
|
+
type: plan_ticket
|
|
4
|
+
task_id: "T001"
|
|
5
|
+
parent_plan: "../PLAN.md"
|
|
6
|
+
created_at: "2026-03-26T20:35:15Z"
|
|
7
|
+
tags: [ticket, plan]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# T001: Add a single internal registry accessor for read paths
|
|
11
|
+
|
|
12
|
+
**Summary**: Use the private helper in `models.py` as the single internal load-backed registry accessor for normal read operations, and formalize the registry JSON shape with typed schema definitions.
|
|
13
|
+
|
|
14
|
+
**Owner**: backend
|
|
15
|
+
|
|
16
|
+
**Estimate**: 1.5h
|
|
17
|
+
|
|
18
|
+
**Dependencies**: none
|
|
19
|
+
|
|
20
|
+
**Target milestone**: M1
|
|
21
|
+
|
|
22
|
+
**Acceptance test**: `uv run pytest tests/unit/infrastructure/test_migrated_lru_cache_replacements.py::test_models_registry_cache_clears_via_clear_all -q`
|
|
23
|
+
|
|
24
|
+
**Files/modules touched**:
|
|
25
|
+
- src/tunacode/configuration/models.py
|
|
26
|
+
- src/tunacode/infrastructure/cache/caches/models_registry.py
|
|
27
|
+
- src/tunacode/types/models_registry.py
|
|
28
|
+
- src/tunacode/types/__init__.py
|
|
29
|
+
- src/tunacode/types/dataclasses.py
|
|
30
|
+
|
|
31
|
+
**Steps**:
|
|
32
|
+
1. Use the existing private helper `_get_registry_for_read()` in `models.py` as the single internal load-backed entry point for normal registry reads. Do not add a second helper.
|
|
33
|
+
2. Add a dedicated typed schema for the bundled registry document in the `types` layer. The schema should represent the real JSON structure used by provider and model entries, including `models`, `env`, `api`, `alchemy_api`, `limit`, and `cost`.
|
|
34
|
+
3. Update registry cache and loader signatures to return the typed registry document instead of `dict[str, Any]`.
|
|
35
|
+
4. Remove the stale unused `ModelRegistry` alias that does not describe the real bundled JSON document.
|
|
36
|
+
5. Keep `get_cached_models_registry()` behavior unchanged for explicit cache-only callers.
|
|
37
|
+
6. Keep cache clearing semantics unchanged: `clear_all()` must still empty the models registry cache.
|
tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T002.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "T002: Refactor registry-dependent metadata and pricing lookups to the unified loader"
|
|
3
|
+
type: plan_ticket
|
|
4
|
+
task_id: "T002"
|
|
5
|
+
parent_plan: "../PLAN.md"
|
|
6
|
+
created_at: "2026-03-26T20:35:15Z"
|
|
7
|
+
tags: [ticket, plan]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# T002: Refactor registry-dependent metadata and pricing lookups to the unified loader
|
|
11
|
+
|
|
12
|
+
**Summary**: Migrate cache-dependent accessors so cold-cache reads return registry-backed values instead of fallback-only values when registry data exists.
|
|
13
|
+
|
|
14
|
+
**Owner**: backend
|
|
15
|
+
|
|
16
|
+
**Estimate**: 2h
|
|
17
|
+
|
|
18
|
+
**Dependencies**: T001
|
|
19
|
+
|
|
20
|
+
**Target milestone**: M2
|
|
21
|
+
|
|
22
|
+
**Acceptance test**: `uv run pytest tests/unit/configuration/test_models_registry_minimax_contract.py tests/unit/configuration/test_models_registry_loading_behavior.py -q`
|
|
23
|
+
|
|
24
|
+
**Files/modules touched**:
|
|
25
|
+
- src/tunacode/configuration/models.py
|
|
26
|
+
- src/tunacode/configuration/pricing.py
|
|
27
|
+
- src/tunacode/core/ui_api/configuration.py
|
|
28
|
+
- tests/unit/configuration/test_provider_api_key_env_fallback.py
|
|
29
|
+
- tests/unit/configuration/test_models_registry_minimax_contract.py
|
|
30
|
+
- tests/unit/configuration/test_models_registry_loading_behavior.py
|
|
31
|
+
|
|
32
|
+
**Steps**:
|
|
33
|
+
1. Refactor `get_provider_env_var`, `get_provider_base_url`, `get_provider_alchemy_api`, and `get_model_context_window` to use `_get_registry_for_read()`.
|
|
34
|
+
2. Refactor `get_model_pricing` in `pricing.py` to use the same load-backed contract. Do not add a second registry-loading implementation.
|
|
35
|
+
3. Use the typed registry schema in these accessors instead of raw `dict[str, Any]` access where practical. Helper functions for looking up provider/model entries are acceptable if they keep the code smaller and clearer.
|
|
36
|
+
4. Preserve fallback behavior exactly:
|
|
37
|
+
- unknown provider env var still derives from provider id
|
|
38
|
+
- missing base URL or alchemy API still returns `None`
|
|
39
|
+
- invalid model string or missing context limit still returns `DEFAULT_CONTEXT_WINDOW`
|
|
40
|
+
- missing pricing still returns `None`
|
|
41
|
+
5. Create `tests/unit/configuration/test_models_registry_loading_behavior.py` and add explicit cold-cache assertions:
|
|
42
|
+
- `get_provider_env_var("minimax-coding-plan") == "MINIMAX_API_KEY"`
|
|
43
|
+
- `get_provider_alchemy_api("minimax-coding-plan") == "minimax-completions"`
|
|
44
|
+
- `get_model_context_window("minimax-coding-plan:MiniMax-M2.1") == 204800`
|
|
45
|
+
- `get_model_pricing("openrouter:openai/gpt-4.1")` returns `input=2`, `cached_input=0.5`, `output=8`
|
|
46
|
+
6. Keep `tests/unit/configuration/test_models_registry_minimax_contract.py` as the normalized-contract test and use the new file for cold-cache behavior.
|
tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T003.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "T003: Remove redundant preload coupling from runtime call sites"
|
|
3
|
+
type: plan_ticket
|
|
4
|
+
task_id: "T003"
|
|
5
|
+
parent_plan: "../PLAN.md"
|
|
6
|
+
created_at: "2026-03-26T20:35:15Z"
|
|
7
|
+
tags: [ticket, plan]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# T003: Remove redundant preload coupling from runtime call sites
|
|
11
|
+
|
|
12
|
+
**Summary**: Simplify runtime paths by removing explicit preload calls that were previously required for correctness, while keeping behavior stable.
|
|
13
|
+
|
|
14
|
+
**Owner**: backend
|
|
15
|
+
|
|
16
|
+
**Estimate**: 1.5h
|
|
17
|
+
|
|
18
|
+
**Dependencies**: T002
|
|
19
|
+
|
|
20
|
+
**Target milestone**: M3
|
|
21
|
+
|
|
22
|
+
**Acceptance test**: `uv run pytest tests/unit/core/test_tinyagent_openrouter_model_config.py -q`
|
|
23
|
+
|
|
24
|
+
**Files/modules touched**:
|
|
25
|
+
- src/tunacode/core/agents/agent_components/agent_config.py
|
|
26
|
+
- src/tunacode/core/compaction/controller.py
|
|
27
|
+
- src/tunacode/ui/commands/model.py
|
|
28
|
+
|
|
29
|
+
**Steps**:
|
|
30
|
+
1. Remove `load_models_registry()` from `agent_config._resolve_base_url()`.
|
|
31
|
+
2. Remove `load_models_registry()` from `CompactionController._resolve_base_url()` and `CompactionController._resolve_api_key()`.
|
|
32
|
+
3. Remove `load_models_registry()` from `ModelCommand._handle_direct_model_selection()`.
|
|
33
|
+
4. Keep `load_models_registry()` in `agent_config.get_or_create_agent()` for now. It remains an intentional init warmup/logging hook and is not part of this cleanup.
|
|
34
|
+
5. Do not add any new preload to `StateManager`; first-read correctness there must come from load-backed accessors, not caller preloading.
|
|
35
|
+
6. Update any affected inline comments to describe the lazy-load contract.
|
tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T004.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "T004: Add targeted cold-cache regression coverage for session and pricing paths"
|
|
3
|
+
type: plan_ticket
|
|
4
|
+
task_id: "T004"
|
|
5
|
+
parent_plan: "../PLAN.md"
|
|
6
|
+
created_at: "2026-03-26T20:35:15Z"
|
|
7
|
+
tags: [ticket, plan]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# T004: Add targeted cold-cache regression coverage for session and pricing paths
|
|
11
|
+
|
|
12
|
+
**Summary**: Add focused tests proving that first-read behavior is correct without manual preload in state initialization and pricing lookup.
|
|
13
|
+
|
|
14
|
+
**Owner**: backend
|
|
15
|
+
|
|
16
|
+
**Estimate**: 2h
|
|
17
|
+
|
|
18
|
+
**Dependencies**: T002,T003
|
|
19
|
+
|
|
20
|
+
**Target milestone**: M4
|
|
21
|
+
|
|
22
|
+
**Acceptance test**: `uv run pytest tests/unit/core/test_session_state_model_registry_loading.py tests/unit/configuration/test_pricing_registry_loading.py -q`
|
|
23
|
+
|
|
24
|
+
**Files/modules touched**:
|
|
25
|
+
- tests/unit/core/test_session_state_model_registry_loading.py
|
|
26
|
+
- tests/unit/configuration/test_pricing_registry_loading.py
|
|
27
|
+
|
|
28
|
+
**Steps**:
|
|
29
|
+
1. Create `tests/unit/core/test_session_state_model_registry_loading.py`.
|
|
30
|
+
2. In the session test, isolate user config by patching `HOME` to a temp directory before constructing `StateManager()`. `Path.home() / ".config"` is the config source used by `ApplicationSettings`, so patching `XDG_DATA_HOME` alone is not sufficient.
|
|
31
|
+
3. In the session test, call `clear_all()` before construction and assert:
|
|
32
|
+
- `state_manager.session.current_model == "openrouter:openai/gpt-4.1"`
|
|
33
|
+
- `state_manager.session.conversation.max_tokens == 1047576`
|
|
34
|
+
4. Create `tests/unit/configuration/test_pricing_registry_loading.py`.
|
|
35
|
+
5. In the pricing test, call `clear_all()` and assert `get_model_pricing("openrouter:openai/gpt-4.1")` succeeds on cold cache with `input=2`, `cached_input=0.5`, `output=8`.
|
|
36
|
+
6. Keep both tests isolated with explicit cache clearing before and after to avoid order-dependent behavior.
|
|
37
|
+
7. Do not modify source files in this ticket unless a failing test proves an unresolved T002/T003 bug.
|
|
38
|
+
|
|
39
|
+
## Risks & Mitigations
|
|
40
|
+
|
|
41
|
+
- Risk: eager loading in new paths could mask invalid registry file errors at different call timing.
|
|
42
|
+
- Mitigation: keep failure mode explicit via existing `TypeError`/JSON loading behavior and test first-read paths.
|
|
43
|
+
- Risk: hidden callers may rely on previous fallback strings/`None` values when cache is empty.
|
|
44
|
+
- Mitigation: constrain change to the accessors listed in the plan contract and keep fallback behavior explicit in tests.
|
|
45
|
+
- Risk: cache lifecycle regressions after refactor.
|
|
46
|
+
- Mitigation: keep `clear_all` regression test as gate and avoid cache-manager API changes.
|
|
47
|
+
- Risk: session-state test reads the real user config.
|
|
48
|
+
- Mitigation: patch `HOME` to a temp directory before constructing `StateManager()`.
|
|
49
|
+
|
|
50
|
+
## Test Strategy
|
|
51
|
+
|
|
52
|
+
- One primary validation per task (as listed in each ticket acceptance test).
|
|
53
|
+
- Add at most one new focused test file per subsystem touched (configuration, core/session).
|
|
54
|
+
- Prioritize cold-cache first-read behavior and deterministic results for known MiniMax/openrouter fixtures.
|
|
55
|
+
- Use exact assertion values rather than truthy/non-`None` checks.
|
|
56
|
+
|
|
57
|
+
## References
|
|
58
|
+
|
|
59
|
+
- `.artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md`
|
|
60
|
+
- `src/tunacode/configuration/models.py`
|
|
61
|
+
- `src/tunacode/configuration/pricing.py`
|
|
62
|
+
- `src/tunacode/core/session/state.py`
|
|
63
|
+
- `src/tunacode/core/agents/agent_components/agent_config.py`
|
|
64
|
+
- `src/tunacode/core/compaction/controller.py`
|
|
65
|
+
- `src/tunacode/configuration/settings.py`
|
|
66
|
+
|
|
67
|
+
## Final Gate
|
|
68
|
+
|
|
69
|
+
- **Output summary**: `.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/`, milestones=4, tickets=4
|
|
70
|
+
- **Next step**: proceed to execute-phase with `.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/PLAN.md`
|