tunacode-cli 0.1.101__tar.gz → 0.2.1__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.1/.githooks/pre-commit +11 -0
- tunacode_cli-0.2.1/.githooks/pre-push +11 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/pull_request_template.md +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/workflows/dependency-map.yml +2 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/workflows/empty-dir-check.yml +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/workflows/lint.yml +5 -4
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/workflows/publish-release.yml +2 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/workflows/release.yml +2 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/workflows/tech-debt.yml +4 -4
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.gitignore +1 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.pre-commit-config.yaml +26 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/AGENTS.md +14 -6
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/CHANGELOG.md +31 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/HARNESS.md +35 -3
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/Makefile +12 -9
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/PKG-INFO +7 -29
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/README.md +6 -28
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/CODE-STANDARDS.md +9 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/README.md +14 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/architecture/dependencies/DEPENDENCY_LAYERS.md +9 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/architecture/patterns/agent-message-serialization.md +6 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/codebase-map/structure/tree-structure.txt +1 -2
- tunacode_cli-0.2.1/docs/deployment.md +168 -0
- tunacode_cli-0.2.1/docs/git/changelog-update.md +73 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/git/practices.md +31 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/configuration/configuration.md +6 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/configuration/models-registry.md +5 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/core/core.md +5 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/index.md +4 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/infrastructure/infrastructure.md +5 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/skills/skills.md +5 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/tools/hashline-subsystem.md +6 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/tools/tools-system.md +7 -5
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/tools/tools.md +7 -3
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/types/types.md +5 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/ui/commands.md +6 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/ui/ui.md +9 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/modules/utils/utils.md +5 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/reviews/2026-03-24-input-latency-research-artifact.md +9 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/reviews/2026-03-25-provider-stream-stall-artifact.md +9 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/reviews/pr-429-coderabbit-review.md +9 -0
- tunacode_cli-0.2.1/docs/skills/audit-harness/SKILL.md +101 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/ui/css-architecture.md +14 -1
- tunacode_cli-0.2.1/docs/workflows/DEBUG.md +93 -0
- tunacode_cli-0.2.1/docs/workflows/DOCS.md +82 -0
- tunacode_cli-0.2.1/docs/workflows/DREAM.md +66 -0
- tunacode_cli-0.2.1/docs/workflows/FEATURES.md +86 -0
- tunacode_cli-0.2.1/docs/workflows/HARNESS.md +72 -0
- tunacode_cli-0.2.1/docs/workflows/HOTFIX.md +8 -0
- tunacode_cli-0.2.1/docs/workflows/QA.md +65 -0
- tunacode_cli-0.2.1/docs/workflows/README.md +39 -0
- tunacode_cli-0.2.1/package-lock.json +6 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/pyproject.toml +1 -2
- tunacode_cli-0.2.1/rules/ast-grep/baseline/no-getattr-in-src.json +47 -0
- tunacode_cli-0.2.1/rules/ast-grep/rule-tests/__snapshots__/no-getattr-in-src-snapshot.yml +10 -0
- tunacode_cli-0.2.1/rules/ast-grep/rule-tests/no-getattr-in-src-test.yml +12 -0
- tunacode_cli-0.2.1/rules/ast-grep/rules/no-getattr-in-src.yml +8 -0
- tunacode_cli-0.2.1/rules/ast-grep/sgconfig.yml +5 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/check-file-length.sh +2 -0
- tunacode_cli-0.2.1/scripts/check_ast_grep_baseline.py +127 -0
- tunacode_cli-0.2.1/scripts/check_markdown_frontmatter.py +135 -0
- tunacode_cli-0.2.1/scripts/check_stale_symbol_surfaces.py +37 -0
- tunacode_cli-0.2.1/scripts/dev-setup.sh +31 -0
- tunacode_cli-0.2.1/scripts/install-git-hooks.sh +17 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/preview_tool_panels.py +3 -22
- tunacode_cli-0.2.1/scripts/run-pre-commit-hook.sh +43 -0
- tunacode_cli-0.2.1/scripts/run_ast_grep_checks.sh +22 -0
- tunacode_cli-0.2.1/scripts/stale_symbol_surfaces_analysis.py +244 -0
- tunacode_cli-0.2.1/scripts/stale_symbol_surfaces_models.py +186 -0
- tunacode_cli-0.2.1/scripts/stale_symbol_surfaces_visitors.py +224 -0
- tunacode_cli-0.2.1/scripts/validate_ast_grep_rules.py +63 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/skills/pypi-release/scripts/bump_version.py +5 -8
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/skills/pypi-release/scripts/local_publish.py +6 -11
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/skills/pypi-release/scripts/release.py +41 -31
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/configuration/defaults.py +0 -4
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/configuration/ignore_patterns.py +18 -34
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/configuration/user_config.py +0 -10
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/constants.py +45 -16
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/agents/agent_components/__init__.py +0 -2
- tunacode_cli-0.2.1/src/tunacode/core/agents/agent_components/agent_helpers.py +59 -0
- tunacode_cli-0.2.1/src/tunacode/core/agents/agent_components/agent_streaming.py +426 -0
- tunacode_cli-0.2.1/src/tunacode/core/agents/helpers.py +71 -0
- tunacode_cli-0.2.1/src/tunacode/core/agents/main.py +267 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/agents/resume/sanitize.py +1 -6
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/compaction/controller.py +14 -3
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/debug/usage_trace.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/logging/manager.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/session/state.py +23 -18
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/types/__init__.py +0 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/types/state_structures.py +2 -11
- tunacode_cli-0.2.1/src/tunacode/core/ui_api/__init__.py +8 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/ui_api/file_filter.py +2 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/exceptions.py +0 -21
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/skills/models.py +2 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/hashline_edit.py +1 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/write_file.py +1 -3
- tunacode_cli-0.2.1/src/tunacode/types/__init__.py +185 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/types/base.py +2 -8
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/app.py +60 -19
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/clear.py +2 -3
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/compact.py +2 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/debug.py +7 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/help.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/model.py +8 -10
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/resume.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/theme.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/update.py +2 -4
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/context_panel.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/lifecycle.py +2 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/main.py +5 -4
- tunacode_cli-0.2.1/src/tunacode/ui/render_safety.py +153 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/__init__.py +0 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/agent_response.py +1 -5
- tunacode_cli-0.2.1/src/tunacode/ui/renderers/errors.py +87 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/panel_widths.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/panels.py +4 -5
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/search.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/tools/base.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/tools/bash.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/tools/discover.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/tools/hashline_edit.py +5 -30
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/tools/read_file.py +3 -3
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/tools/web_fetch.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/tools/write_file.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/repl_support.py +4 -28
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/request_debug.py +103 -20
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/screens/api_key_entry.py +2 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/screens/model_picker.py +3 -4
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/screens/session_picker.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/screens/setup.py +3 -3
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/shell_runner.py +2 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/styles.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/thinking_state.py +2 -4
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/welcome.py +16 -2
- tunacode_cli-0.2.1/src/tunacode/ui/widgets/autocomplete_positioning.py +21 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/widgets/chat.py +14 -2
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/widgets/command_autocomplete.py +2 -14
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/widgets/editor.py +12 -10
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/widgets/file_autocomplete.py +6 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/widgets/messages.py +1 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/widgets/resource_bar.py +2 -22
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/widgets/skills_autocomplete.py +6 -0
- tunacode_cli-0.2.1/src/tunacode/utils/messaging/adapter.py +208 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/utils/messaging/token_counter.py +3 -20
- tunacode_cli-0.2.1/tc-cvurren.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/architecture/test_import_order.py +26 -1
- tunacode_cli-0.2.1/tests/architecture/test_ui_api_surface.py +16 -0
- tunacode_cli-0.2.1/tests/integration/ui/test_theme_render_crash_regression.py +65 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/system/cli/test_repl_support.py +4 -19
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/system/cli/test_tmux_tools.py +1 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/test_compaction.py +6 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/test_dependency_layers.py +2 -3
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/configuration/test_ignore_patterns.py +2 -3
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/configuration/test_user_config_loading.py +0 -5
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_logging.py +12 -0
- tunacode_cli-0.2.1/tests/unit/core/test_provider_error_surfacing.py +109 -0
- tunacode_cli-0.2.1/tests/unit/test_stale_symbol_surfaces.py +102 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/tools/test_ignore_manager.py +1 -3
- tunacode_cli-0.2.1/tests/unit/ui/test_context_panel.py +38 -0
- tunacode_cli-0.2.1/tests/unit/ui/test_render_safety.py +86 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/ui/test_request_debug.py +60 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/ui/test_request_threading.py +2 -10
- tunacode_cli-0.2.1/tests/unit/ui/test_theme_wrapping.py +62 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/utils/test_shell_command_escape.py +29 -1
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/uv.lock +1 -1
- tunacode_cli-0.1.101/.artifacts/README.md +0 -32
- tunacode_cli-0.1.101/.artifacts/debug_history/2026-03-25_tinyagent-1-2-27-gil-hotfix-validation.md +0 -132
- tunacode_cli-0.1.101/.artifacts/debug_history/REQUEST_CONTEXT_CUTOVER_LESSON.md +0 -34
- tunacode_cli-0.1.101/.artifacts/debug_history/postmortem-defensive-message-typing-2026-03-17.md +0 -74
- tunacode_cli-0.1.101/.artifacts/debug_history/postmortem-loading-indicator-submit-regression-2026-03-24.md +0 -126
- tunacode_cli-0.1.101/.artifacts/debug_history/slop_fixture.py +0 -14
- tunacode_cli-0.1.101/.artifacts/execute/2026-03-22_19-54-47_tinyagent-message-typing-cleanup.md +0 -98
- tunacode_cli-0.1.101/.artifacts/execute/2026-03-24_19-20-38_input-latency-threaded-request-execution.md +0 -185
- tunacode_cli-0.1.101/.artifacts/execute/2026-03-26_16-20-32_models-loading-unification.md +0 -101
- tunacode_cli-0.1.101/.artifacts/execute/2026-03-28_12-18-53_pr-444-review-fixes.md +0 -57
- tunacode_cli-0.1.101/.artifacts/issue_analysis_report_2026-03-21.md +0 -52
- tunacode_cli-0.1.101/.artifacts/plan/2026-03-22_09-58-20_native-tinyagent-tool-contract.md +0 -341
- tunacode_cli-0.1.101/.artifacts/plan/2026-03-22_18-08-41_tinyagent-message-typing-cleanup.md +0 -215
- tunacode_cli-0.1.101/.artifacts/plan/2026-03-23_15-35-00_command-autocomplete-positioning.md +0 -145
- tunacode_cli-0.1.101/.artifacts/plan/2026-03-24_19-15-16_input-latency-threaded-request-execution.md +0 -326
- tunacode_cli-0.1.101/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/PLAN.md +0 -271
- tunacode_cli-0.1.101/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/INDEX.md +0 -16
- tunacode_cli-0.1.101/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T001.md +0 -37
- tunacode_cli-0.1.101/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T002.md +0 -46
- tunacode_cli-0.1.101/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T003.md +0 -35
- tunacode_cli-0.1.101/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T004.md +0 -70
- tunacode_cli-0.1.101/.artifacts/plan/2026-03-27_13-59-15_pr-444-review-fixes/PLAN.md +0 -202
- tunacode_cli-0.1.101/.artifacts/plans/consolidate-main-support-plan.md +0 -82
- tunacode_cli-0.1.101/.artifacts/plans/reduce-src-python-files-to-500-lines-plan.md +0 -67
- tunacode_cli-0.1.101/.artifacts/query_data_flow.md +0 -99
- tunacode_cli-0.1.101/.artifacts/release/model-registry-refresh-release-blocker-2026-03-21.md +0 -134
- tunacode_cli-0.1.101/.artifacts/release/release-v0.1.94-run.md +0 -422
- tunacode_cli-0.1.101/.artifacts/release/tmux-suite-validation-2026-03-21.md +0 -82
- tunacode_cli-0.1.101/.artifacts/research/2026-03-17_13-01-09_replace_messages-cutover.md +0 -98
- tunacode_cli-0.1.101/.artifacts/research/2026-03-17_14-04-53_mypy-main-py-errors-map.md +0 -93
- tunacode_cli-0.1.101/.artifacts/research/2026-03-21_14-07-44_prompt-versioning-map.md +0 -65
- tunacode_cli-0.1.101/.artifacts/research/2026-03-22_09-42-58_tools-implementation.md +0 -76
- tunacode_cli-0.1.101/.artifacts/research/2026-03-22_09-43-01_tools-context-synthesis.md +0 -137
- tunacode_cli-0.1.101/.artifacts/research/2026-03-22_09-43-03_codebase-locator_tool-system.md +0 -101
- tunacode_cli-0.1.101/.artifacts/research/2026-03-22_09-45-29_tools-data-inputs-contracts.md +0 -193
- tunacode_cli-0.1.101/.artifacts/research/2026-03-22_09-53-07_tool-result-adapter-runtime.md +0 -65
- tunacode_cli-0.1.101/.artifacts/research/2026-03-22_09-53-52_minimax-tinyagent-contract-shape-vs-runtime.md +0 -120
- tunacode_cli-0.1.101/.artifacts/research/2026-03-22_17-57-53_message-ingress-data-contract-map.md +0 -137
- tunacode_cli-0.1.101/.artifacts/research/2026-03-23_15-30-00_command-autocomplete-positioning.md +0 -221
- tunacode_cli-0.1.101/.artifacts/research/2026-03-24_16-58-32_tui-submit-latency.md +0 -165
- tunacode_cli-0.1.101/.artifacts/research/2026-03-24_18-46-40_input-latency-ui-loop-coupling.md +0 -111
- tunacode_cli-0.1.101/.artifacts/research/2026-03-24_20-07-05_input-latency-regression-probe.md +0 -265
- tunacode_cli-0.1.101/.artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md +0 -212
- tunacode_cli-0.1.101/.artifacts/tunacode_action_audit.md +0 -98
- tunacode_cli-0.1.101/.test_reports/.gitkeep +0 -0
- tunacode_cli-0.1.101/LOG.md +0 -73
- tunacode_cli-0.1.101/docs/docs_audit.html +0 -162
- tunacode_cli-0.1.101/plan.md +0 -275
- tunacode_cli-0.1.101/scripts/dev-setup.sh +0 -31
- tunacode_cli-0.1.101/src/tunacode/core/agents/agent_components/agent_helpers.py +0 -108
- tunacode_cli-0.1.101/src/tunacode/core/agents/helpers.py +0 -144
- tunacode_cli-0.1.101/src/tunacode/core/agents/main.py +0 -766
- tunacode_cli-0.1.101/src/tunacode/core/types/tool_registry.py +0 -188
- tunacode_cli-0.1.101/src/tunacode/core/ui_api/__init__.py +0 -8
- tunacode_cli-0.1.101/src/tunacode/core/ui_api/configuration.py +0 -101
- tunacode_cli-0.1.101/src/tunacode/core/ui_api/constants.py +0 -47
- tunacode_cli-0.1.101/src/tunacode/core/ui_api/lsp_status.py +0 -58
- tunacode_cli-0.1.101/src/tunacode/core/ui_api/messaging.py +0 -36
- tunacode_cli-0.1.101/src/tunacode/core/ui_api/shared_types.py +0 -17
- tunacode_cli-0.1.101/src/tunacode/core/ui_api/system_paths.py +0 -44
- tunacode_cli-0.1.101/src/tunacode/core/ui_api/user_configuration.py +0 -51
- tunacode_cli-0.1.101/src/tunacode/tools/lsp/__init__.py +0 -107
- tunacode_cli-0.1.101/src/tunacode/tools/lsp/client.py +0 -352
- tunacode_cli-0.1.101/src/tunacode/tools/lsp/diagnostics.py +0 -60
- tunacode_cli-0.1.101/src/tunacode/tools/lsp/servers.py +0 -101
- tunacode_cli-0.1.101/src/tunacode/types/__init__.py +0 -107
- tunacode_cli-0.1.101/src/tunacode/types/canonical.py +0 -365
- tunacode_cli-0.1.101/src/tunacode/ui/renderers/errors.py +0 -207
- tunacode_cli-0.1.101/src/tunacode/ui/renderers/tools/diagnostics.py +0 -186
- tunacode_cli-0.1.101/src/tunacode/utils/messaging/adapter.py +0 -506
- tunacode_cli-0.1.101/tests/architecture/test_init_bloat.py +0 -58
- tunacode_cli-0.1.101/tests/unit/core/test_agent_helpers.py +0 -34
- tunacode_cli-0.1.101/tests/unit/core/test_openrouter_usage_metrics.py +0 -45
- tunacode_cli-0.1.101/tests/unit/core/test_provider_error_surfacing.py +0 -50
- tunacode_cli-0.1.101/tests/unit/core/test_request_orchestrator_parallel_tools.py +0 -234
- tunacode_cli-0.1.101/tests/unit/core/test_stream_phase_debug.py +0 -90
- tunacode_cli-0.1.101/tests/unit/core/test_usage_trace_debug.py +0 -138
- tunacode_cli-0.1.101/tests/unit/test_sanitize_canonicalization.py +0 -61
- tunacode_cli-0.1.101/tests/unit/types/test_adapter.py +0 -229
- tunacode_cli-0.1.101/tests/unit/types/test_canonical.py +0 -418
- tunacode_cli-0.1.101/tests/unit/types/test_tool_registry.py +0 -102
- tunacode_cli-0.1.101/tests/unit/utils/test_token_counter.py +0 -77
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.coderabbit.yaml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/.github/dependabot.yml +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/LICENSE +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/MANIFEST.in +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/assets/hashline-edit.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/assets/home.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/architecture/dependencies/DEPENDENCY_LAYERS.dot +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/architecture/dependencies/DEPENDENCY_LAYERS.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/images/dream-ui/tunacode-cli-home-catpu.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/images/dream-ui/tunacode-cli-home.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/images/dream-ui/tunacode-cli-lsp.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/images/dream-ui/tunacode-cli-response.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/images/tool-calls.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/docs/images/tunacode.png +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/pytest.ini +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/benchmarks/input_latency.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/benchmarks/input_paint_latency.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/benchmarks/input_tmux_latency.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/check-defensive-slop.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/check-naming-conventions.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/check-unused-constants.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/check_agents_freshness.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/check_unused_modules.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/download_ripgrep.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/generate-release-notes.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/generate_structure_tree.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/grimp_layers_report.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/install_linux.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/playwright_cache.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/run-dead-imports.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/run_gates.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/startup_timer.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/todo_baseline.json +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/todo_scanner.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/ui_import_timer.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/uninstall.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/update_models_registry.sh +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/utils/check_empty_dirs.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/scripts/utils/vulture_whitelist.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/skills/pypi-release/SKILL.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/skills/pypi-release/references/common-issues.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/skills/pypi-release/references/workflow-structure.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/configuration/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/configuration/limits.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/configuration/models.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/configuration/models_registry.json +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/configuration/paths.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/configuration/pricing.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/configuration/settings.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/agents/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/agents/agent_components/agent_config.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/agents/agent_components/agent_session_config.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/agents/resume/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/agents/resume/sanitize_debug.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/compaction/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/compaction/prompts.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/compaction/summarizer.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/compaction/types.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/debug/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/logging/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/logging/handlers.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/logging/levels.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/logging/records.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/session/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/types/agent_state.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/types/state.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/core/ui_api/formatting.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/cache/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/cache/caches/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/cache/caches/agents.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/cache/caches/limits_settings.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/cache/caches/models_registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/cache/caches/skills.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/cache/caches/tunacode_context.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/cache/manager.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/cache/metadata.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/cache/strategies.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/infrastructure/file_filter.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/prompts/system_prompt.md +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/py.typed +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/skills/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/skills/discovery.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/skills/loader.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/skills/prompting.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/skills/registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/skills/search.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/skills/selection.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/bash.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/cache_accessors/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/cache_accessors/ignore_manager_cache.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/cache_accessors/ripgrep_cache.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/discover.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/hashline.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/ignore.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/ignore_manager.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/line_cache.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/read_file.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/utils/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/utils/discover_pipeline.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/utils/discover_terms.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/utils/discover_types.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/utils/file_errors.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/utils/formatting.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/utils/ripgrep.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/tools/web_fetch.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/types/callbacks.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/types/dataclasses.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/types/models_registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/assets/logo.ansi +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/clipboard.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/command_registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/base.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/cancel.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/exit.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/skills.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/commands/thoughts.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/esc/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/esc/handler.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/esc/types.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/logo_assets.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/model_display.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/thinking.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/tools/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/renderers/tools/syntax_utils.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/request_bridge.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/screens/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/screens/theme_picker.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/screens/update_confirm.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/slopgotchi/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/slopgotchi/panel.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/streaming.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/styles/layout.tcss +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/styles/modals.tcss +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/styles/panels.tcss +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/styles/widgets.tcss +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/ui/widgets/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/utils/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/utils/messaging/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/utils/system/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/src/tunacode/utils/system/gitignore.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/architecture/__init__.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/architecture/test_imports_in_init.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/architecture/test_layer_dependencies.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/conftest.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/integration/core/test_minimax_execution_path.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/integration/core/test_mtime_caches_end_to_end.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/integration/core/test_tinyagent_alchemy_usage_contract_live.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/integration/ui/test_submit_loading_lifecycle.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/system/cli/test_cli_default_command.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/system/cli/test_startup.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/configuration/test_default_config_minimax_keys.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/configuration/test_default_config_stream_agent_text.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/configuration/test_models_registry_loading_behavior.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/configuration/test_models_registry_minimax_contract.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/configuration/test_pricing_registry_loading.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/configuration/test_provider_api_key_env_fallback.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_agent_cache_abort.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_agent_init_debug.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_agent_skills_prompt_injection.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_agent_stream_provider_debug.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_compaction_controller_outcomes.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_compaction_summarizer.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_context_overflow_detection.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_exceptions.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_session_state_defaults.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_session_state_model_registry_loading.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_session_usage_schema.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_thinking_stream_routing.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_tinyagent_openrouter_model_config.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/core/test_tool_concurrency_limit.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/infrastructure/test_cache_infrastructure.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/infrastructure/test_file_filter.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/infrastructure/test_migrated_lru_cache_replacements.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/infrastructure/test_typed_cache_accessors.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/skills/test_registry.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/skills/test_selection.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/ui/test_app_loading_indicator.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/ui/test_thinking_state.py +0 -0
- {tunacode_cli-0.1.101 → tunacode_cli-0.2.1}/tests/unit/utils/test_gitignore.py +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
SOURCE="${BASH_SOURCE[0]}"
|
|
5
|
+
while [[ -L "$SOURCE" ]]; do
|
|
6
|
+
HOOK_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
|
|
7
|
+
SOURCE="$(readlink "$SOURCE")"
|
|
8
|
+
[[ "$SOURCE" != /* ]] && SOURCE="$HOOK_DIR/$SOURCE"
|
|
9
|
+
done
|
|
10
|
+
HOOK_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
|
|
11
|
+
exec "$HOOK_DIR/../scripts/run-pre-commit-hook.sh" pre-commit "$@"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
SOURCE="${BASH_SOURCE[0]}"
|
|
5
|
+
while [[ -L "$SOURCE" ]]; do
|
|
6
|
+
HOOK_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
|
|
7
|
+
SOURCE="$(readlink "$SOURCE")"
|
|
8
|
+
[[ "$SOURCE" != /* ]] && SOURCE="$HOOK_DIR/$SOURCE"
|
|
9
|
+
done
|
|
10
|
+
HOOK_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
|
|
11
|
+
exec "$HOOK_DIR/../scripts/run-pre-commit-hook.sh" pre-push "$@"
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
- [ ] All pre-commit hooks pass
|
|
34
34
|
- [ ] Code formatted with `ruff format`
|
|
35
35
|
- [ ] Code passes `ruff check` without warnings
|
|
36
|
-
- [ ] No Python file exceeds **600 lines**
|
|
36
|
+
- [ ] No non-test Python file exceeds **600 lines**
|
|
37
37
|
|
|
38
38
|
## Checklist
|
|
39
39
|
- [ ] My code follows the Python coding standards (type hints, f-strings, pathlib, etc.)
|
|
@@ -15,11 +15,11 @@ jobs:
|
|
|
15
15
|
permissions:
|
|
16
16
|
contents: write
|
|
17
17
|
steps:
|
|
18
|
-
- uses: actions/checkout@
|
|
18
|
+
- uses: actions/checkout@v5
|
|
19
19
|
with:
|
|
20
20
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
21
21
|
|
|
22
|
-
- uses: actions/setup-python@
|
|
22
|
+
- uses: actions/setup-python@v6
|
|
23
23
|
with:
|
|
24
24
|
python-version: "3.12"
|
|
25
25
|
|
|
@@ -9,8 +9,8 @@ jobs:
|
|
|
9
9
|
pre-commit:
|
|
10
10
|
runs-on: ubuntu-latest
|
|
11
11
|
steps:
|
|
12
|
-
- uses: actions/checkout@
|
|
13
|
-
- uses: actions/setup-python@
|
|
12
|
+
- uses: actions/checkout@v5
|
|
13
|
+
- uses: actions/setup-python@v6
|
|
14
14
|
with:
|
|
15
15
|
python-version: "3.11"
|
|
16
16
|
- uses: astral-sh/setup-uv@v4
|
|
@@ -22,6 +22,7 @@ jobs:
|
|
|
22
22
|
run: |
|
|
23
23
|
uv run unimport --check --gitignore --exclude 'venv/*' --exclude '.venv/*' --exclude '.uv-cache/*' --exclude '.uv_cache/*' src
|
|
24
24
|
uv run vulture --min-confidence 80 scripts/utils/vulture_whitelist.py src
|
|
25
|
+
uv run python scripts/check_stale_symbol_surfaces.py
|
|
25
26
|
- name: Check for orphan modules
|
|
26
27
|
run: uv run python scripts/check_unused_modules.py
|
|
27
28
|
|
|
@@ -29,8 +30,8 @@ jobs:
|
|
|
29
30
|
deptry:
|
|
30
31
|
runs-on: ubuntu-latest
|
|
31
32
|
steps:
|
|
32
|
-
- uses: actions/checkout@
|
|
33
|
-
- uses: actions/setup-python@
|
|
33
|
+
- uses: actions/checkout@v5
|
|
34
|
+
- uses: actions/setup-python@v6
|
|
34
35
|
with:
|
|
35
36
|
python-version: "3.11"
|
|
36
37
|
- uses: astral-sh/setup-uv@v4
|
|
@@ -19,10 +19,10 @@ jobs:
|
|
|
19
19
|
group: pypi-release
|
|
20
20
|
cancel-in-progress: false
|
|
21
21
|
steps:
|
|
22
|
-
- uses: actions/checkout@
|
|
22
|
+
- uses: actions/checkout@v5
|
|
23
23
|
|
|
24
24
|
- name: Set up Python
|
|
25
|
-
uses: actions/setup-python@
|
|
25
|
+
uses: actions/setup-python@v6
|
|
26
26
|
with:
|
|
27
27
|
python-version: '3.12'
|
|
28
28
|
|
|
@@ -16,13 +16,13 @@ jobs:
|
|
|
16
16
|
cancel-in-progress: false
|
|
17
17
|
|
|
18
18
|
steps:
|
|
19
|
-
- uses: actions/checkout@
|
|
19
|
+
- uses: actions/checkout@v5
|
|
20
20
|
with:
|
|
21
21
|
fetch-depth: 0
|
|
22
22
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
23
23
|
|
|
24
24
|
- name: Set up Python
|
|
25
|
-
uses: actions/setup-python@
|
|
25
|
+
uses: actions/setup-python@v6
|
|
26
26
|
with:
|
|
27
27
|
python-version: '3.12'
|
|
28
28
|
|
|
@@ -13,8 +13,8 @@ jobs:
|
|
|
13
13
|
name: Scan TODO/FIXME
|
|
14
14
|
runs-on: ubuntu-latest
|
|
15
15
|
steps:
|
|
16
|
-
- uses: actions/checkout@
|
|
17
|
-
- uses: actions/setup-python@
|
|
16
|
+
- uses: actions/checkout@v5
|
|
17
|
+
- uses: actions/setup-python@v6
|
|
18
18
|
with:
|
|
19
19
|
python-version: "3.11"
|
|
20
20
|
- uses: astral-sh/setup-uv@v4
|
|
@@ -32,8 +32,8 @@ jobs:
|
|
|
32
32
|
contents: write
|
|
33
33
|
issues: write
|
|
34
34
|
steps:
|
|
35
|
-
- uses: actions/checkout@
|
|
36
|
-
- uses: actions/setup-python@
|
|
35
|
+
- uses: actions/checkout@v5
|
|
36
|
+
- uses: actions/setup-python@v6
|
|
37
37
|
with:
|
|
38
38
|
python-version: "3.11"
|
|
39
39
|
- uses: astral-sh/setup-uv@v4
|
|
@@ -68,6 +68,13 @@ repos:
|
|
|
68
68
|
files: \.py$
|
|
69
69
|
stages: [pre-commit]
|
|
70
70
|
|
|
71
|
+
- id: stale-symbol-surfaces
|
|
72
|
+
name: Check for stale symbol surfaces
|
|
73
|
+
entry: uv run python scripts/check_stale_symbol_surfaces.py
|
|
74
|
+
language: system
|
|
75
|
+
pass_filenames: false
|
|
76
|
+
stages: [pre-push]
|
|
77
|
+
|
|
71
78
|
- id: vulture-changed
|
|
72
79
|
name: Check for dead code in changed files
|
|
73
80
|
entry: uv run vulture --min-confidence 80 scripts/utils/vulture_whitelist.py
|
|
@@ -104,7 +111,7 @@ repos:
|
|
|
104
111
|
entry: scripts/check-file-length.sh
|
|
105
112
|
language: script
|
|
106
113
|
files: \.py$
|
|
107
|
-
exclude: ^tests/benchmarks/bench_discover\.py$
|
|
114
|
+
exclude: ^tests/|^tests/benchmarks/bench_discover\.py$
|
|
108
115
|
pass_filenames: true
|
|
109
116
|
|
|
110
117
|
# Check naming conventions
|
|
@@ -142,6 +149,15 @@ repos:
|
|
|
142
149
|
pass_filenames: false
|
|
143
150
|
stages: [pre-push]
|
|
144
151
|
|
|
152
|
+
- id: ast-grep-getattr-ratchet
|
|
153
|
+
name: Run ast-grep getattr ratchet
|
|
154
|
+
entry: scripts/run_ast_grep_checks.sh
|
|
155
|
+
language: script
|
|
156
|
+
files: ^(src/.*\.py|rules/ast-grep/.*|scripts/run_ast_grep_checks\.sh|scripts/validate_ast_grep_rules\.py|scripts/check_ast_grep_baseline\.py)$
|
|
157
|
+
always_run: true
|
|
158
|
+
pass_filenames: false
|
|
159
|
+
stages: [pre-push]
|
|
160
|
+
|
|
145
161
|
# Check for empty directories or __init__.py-only directories (runs on push)
|
|
146
162
|
- id: empty-dir-check
|
|
147
163
|
name: Check for Empty Directories
|
|
@@ -150,6 +166,15 @@ repos:
|
|
|
150
166
|
pass_filenames: false
|
|
151
167
|
stages: [pre-push]
|
|
152
168
|
|
|
169
|
+
- id: markdown-frontmatter
|
|
170
|
+
name: Require markdown frontmatter in root/docs
|
|
171
|
+
entry: uv run python scripts/check_markdown_frontmatter.py
|
|
172
|
+
language: system
|
|
173
|
+
files: ^docs/.*\.md$|^[^/]+\.md$
|
|
174
|
+
exclude: ^(AGENTS|README)\.md$
|
|
175
|
+
pass_filenames: false
|
|
176
|
+
stages: [pre-push]
|
|
177
|
+
|
|
153
178
|
# Dependency layer check (runs on commit - architectural check)
|
|
154
179
|
# Note: Map visualization generated by GitHub Action on master pushes
|
|
155
180
|
- id: dependency-layers
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# AGENTS.md
|
|
2
|
-
Last Updated: 2026-
|
|
2
|
+
Last Updated: 2026-04-27
|
|
3
3
|
|
|
4
4
|
## Repository Orientation
|
|
5
5
|
- This is `tunacode-cli`, a terminal AI coding agent with a Textual UI and tiny-agent tool loop.
|
|
@@ -9,10 +9,11 @@ Last Updated: 2026-03-29
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
## Start Here
|
|
12
|
-
- `README.md` — user-facing setup, supported features, and command usage.
|
|
13
12
|
- `docs/modules/index.md` — module layer map and reading order.
|
|
14
13
|
- `docs/architecture/dependencies/DEPENDENCY_LAYERS.md` — generated dependency summary.
|
|
14
|
+
- `docs/skills/audit-harness/SKILL.md` — strict harness-audit procedure; treat any mismatch or failed gate as critical and run checks manually one by one.
|
|
15
15
|
- `docs/modules/ui/commands.md` — command model and command registration notes.
|
|
16
|
+
- `docs/workflows/README.md` — accepted development workflows and execution guidance.
|
|
16
17
|
- `scripts/check_agents_freshness.py` — validates this file is current.
|
|
17
18
|
|
|
18
19
|
## Harness Documentation Purpose
|
|
@@ -23,6 +24,7 @@ Last Updated: 2026-03-29
|
|
|
23
24
|
|
|
24
25
|
## Git Safety and Non-Destructive Defaults
|
|
25
26
|
- Follow `docs/git/practices.md` for local Git workflow and safety rules.
|
|
27
|
+
- Use `docs/git/changelog-update.md` when the task is to refresh `CHANGELOG.md` from recently merged PRs.
|
|
26
28
|
- Before performing any Git operation (`git status`, `git add`, `git commit`, etc.), read `docs/git/practices.md` in that session.
|
|
27
29
|
- Default behavior is non-destructive: never delete or clean untracked files/directories unless explicitly requested by the user.
|
|
28
30
|
- If unknown files appear during checks, pause and ask before cleanup.
|
|
@@ -43,7 +45,7 @@ Last Updated: 2026-03-29
|
|
|
43
45
|
- Developer entry: `Makefile` target `make run` -> `uv run tunacode`.
|
|
44
46
|
|
|
45
47
|
## Source Structure (high-level)
|
|
46
|
-
- `src/tunacode/ui/` — terminal UI, widgets, screens, CSS, command shell.
|
|
48
|
+
- `src/tunacode/ui/` — terminal UI, widgets, screens, CSS, command shell, and render-safety helpers for Rich/Textual theme stability.
|
|
47
49
|
- `src/tunacode/core/` — agents, compaction, session, prompting, logging.
|
|
48
50
|
- `src/tunacode/tools/` — native tinyagent tool implementations (`bash`, `discover`, `read_file`, `hashline_edit`, `web_fetch`, `write_file`) plus supporting helpers.
|
|
49
51
|
- `src/tunacode/configuration/` — settings, model registry, API paths, limits, pricing, and ignore patterns.
|
|
@@ -51,7 +53,7 @@ Last Updated: 2026-03-29
|
|
|
51
53
|
- `src/tunacode/utils/` — adapters, messaging helpers, token counting, gitignore, system utilities.
|
|
52
54
|
- `src/tunacode/types/` — canonical data models, callbacks, protocol types.
|
|
53
55
|
- Shared packages: `src/tunacode/constants.py`, `src/tunacode/exceptions.py`, `src/tunacode/skills/`, `src/tunacode/prompts/`.
|
|
54
|
-
- Notable sub-packages: `src/tunacode/core/ui_api/` (core→UI bridge)
|
|
56
|
+
- Notable sub-packages: `src/tunacode/core/ui_api/` (core→UI bridge).
|
|
55
57
|
|
|
56
58
|
## Architecture Boundaries
|
|
57
59
|
- Documented conceptual stack (bottom-up): `types -> utils -> infrastructure -> configuration -> tools -> core -> ui`.
|
|
@@ -68,6 +70,9 @@ Last Updated: 2026-03-29
|
|
|
68
70
|
- Review notes for active PR triage: `docs/reviews/`.
|
|
69
71
|
- Debugging and investigation artifacts: `docs/reviews/*-artifact.md`.
|
|
70
72
|
- Git workflow and safety practices: `docs/git/practices.md`.
|
|
73
|
+
- Changelog refresh procedure for merged PR summaries: `docs/git/changelog-update.md`.
|
|
74
|
+
- Workflow guidance: `docs/workflows/README.md` and workflow-specific files such
|
|
75
|
+
as `docs/workflows/REFACTOR.md`.
|
|
71
76
|
- Module-specific docs:
|
|
72
77
|
- `docs/modules/core/core.md`
|
|
73
78
|
- `docs/modules/ui/ui.md`
|
|
@@ -82,8 +87,9 @@ Last Updated: 2026-03-29
|
|
|
82
87
|
- UI design reference: `docs/ui/css-architecture.md` and generated map at `docs/codebase-map/structure/tree-structure.txt`.
|
|
83
88
|
|
|
84
89
|
## Routine Commands
|
|
85
|
-
- Setup: `make dev
|
|
86
|
-
-
|
|
90
|
+
- Setup: `make install` (canonical full dev environment bootstrap).
|
|
91
|
+
- Installs repo-managed `pre-commit` and `pre-push` git hooks from `.githooks/`.
|
|
92
|
+
- Compatibility alias: `make dev-setup`.
|
|
87
93
|
- Run app: `make run`.
|
|
88
94
|
- Full tests: `make test`.
|
|
89
95
|
- Linters + hooks: `make lint`.
|
|
@@ -109,6 +115,7 @@ Last Updated: 2026-03-29
|
|
|
109
115
|
## Quality Constraints (Do not break)
|
|
110
116
|
- `README.md` and docs should stay consistent with implementation.
|
|
111
117
|
- Keep `AGENTS.md` updated with `Last Updated: YYYY-MM-DD` whenever `src/` or `docs/` changes.
|
|
118
|
+
- The 2026-04-13 getattr baseline follow-up reduced the scoped UI/runtime and owned-exception `getattr(...)` usage; the committed ast-grep baseline should stay aligned with those removals.
|
|
112
119
|
- Do not add TunaCode-owned message-contract wrappers around tinyagent message types; use tinyagent models directly in memory and keep dict payloads at real boundaries.
|
|
113
120
|
- Preserve existing architecture order rules; do not add new imports across forbidden layers.
|
|
114
121
|
- Treat current file-length allowlist entries as temporary debt only. Do not add any new file-specific exemptions to the `>600` line rule; fix the enforcement path or split the code instead.
|
|
@@ -120,4 +127,5 @@ Last Updated: 2026-03-29
|
|
|
120
127
|
- Prefer small, scoped changes.
|
|
121
128
|
- Keep edits minimal and targeted.
|
|
122
129
|
- Prefer existing patterns; mirror command/test naming used in nearby code.
|
|
130
|
+
- Treat `src/tunacode/ui/render_safety.py` plus built-in theme wrapping in `src/tunacode/constants.py` as part of the startup/theme stability path; keep Rich default/ANSI color handling local to TunaCode rather than patching Textual.
|
|
123
131
|
- Run validation commands before handoff when touching architecture, dependencies, or shared packages.
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Changelog
|
|
3
|
+
summary: Release history for TunaCode versions and notable changes.
|
|
4
|
+
when_to_read:
|
|
5
|
+
- When preparing a release note
|
|
6
|
+
- When reviewing past changes or version history
|
|
7
|
+
last_updated: "2026-04-27"
|
|
8
|
+
---
|
|
9
|
+
|
|
1
10
|
# Changelog
|
|
2
11
|
|
|
3
12
|
All notable changes to this project will be documented in this file.
|
|
@@ -7,6 +16,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
16
|
|
|
8
17
|
## [Unreleased]
|
|
9
18
|
|
|
19
|
+
## [0.2.1] - 2026-04-27
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
- Added a stale-symbol surface checker, related unit coverage, and lint/pre-push enforcement to catch dead re-export and annotation-only APIs.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
- Simplified stream orchestration and interrupted-stream cleanup by moving the stream loop into a dedicated module, tracking per-stream baselines, and tightening callback typing.
|
|
26
|
+
- Removed dead agent component helpers and legacy dangling-tool-call patching paths from the runtime cleanup flow.
|
|
27
|
+
- Documented explicit `bug:`/`refactor:` style labels for issues and PRs and clarified that the repository root `README.md` is exempt from markdown frontmatter requirements.
|
|
28
|
+
- Updated release-gate enums to `StrEnum` and restored tmux marker selection for the release E2E test.
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
- Fixed abort-time tool reconciliation so completed tool results are preserved and interrupted tool calls are patched with explicit error results instead of rolling history back.
|
|
32
|
+
- Fixed Textual startup and theme-switch rendering crashes by hardening built-in theme colors and normalizing Rich dim/default styles before Textual filtering.
|
|
33
|
+
|
|
34
|
+
## [0.2.0] - 2026-04-02
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
- Cached conversation total token counts and improved request debug flow.
|
|
38
|
+
- Hardened the harness audit workflow.
|
|
39
|
+
- Documented the deployment flow and refreshed workflow action references.
|
|
40
|
+
|
|
10
41
|
## [0.1.101] - 2026-03-30
|
|
11
42
|
|
|
12
43
|
### Added
|
|
@@ -1,9 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Harness
|
|
3
|
+
summary: Repository code-quality harness for hooks, CI checks, and local enforcement.
|
|
4
|
+
when_to_read:
|
|
5
|
+
- When auditing pre-commit or pre-push hooks
|
|
6
|
+
- When checking local and CI enforcement behavior
|
|
7
|
+
last_updated: "2026-04-13"
|
|
8
|
+
---
|
|
9
|
+
|
|
1
10
|
# HARNESS.md
|
|
2
11
|
|
|
3
12
|
## Pre-commits
|
|
4
13
|
|
|
5
14
|
Source of truth: `.pre-commit-config.yaml`
|
|
6
15
|
|
|
16
|
+
Git hook entrypoints are repo-managed wrappers in `.githooks/`, installed into `.git/hooks/` as relative symlinks by `scripts/install-git-hooks.sh`. This keeps hook execution tied to the checkout's local `.venv` after the repository directory moves.
|
|
17
|
+
|
|
7
18
|
### Global pre-commit settings
|
|
8
19
|
- Python runtime: `python3`
|
|
9
20
|
- Global exclude regex:
|
|
@@ -35,10 +46,13 @@ Source of truth: `.pre-commit-config.yaml`
|
|
|
35
46
|
- `ruff` (repo: `astral-sh/ruff-pre-commit`, args: `--fix --show-fixes`)
|
|
36
47
|
- `ruff-format` (repo: `astral-sh/ruff-pre-commit`, excludes `models_registry.json`)
|
|
37
48
|
- `dead-imports` (repo: `local`, entry: `scripts/run-dead-imports.sh`, files: `\.py$`)
|
|
49
|
+
- `stale-symbol-surfaces` (repo: `local`, entry: `uv run python scripts/check_stale_symbol_surfaces.py`, stage: `pre-push`)
|
|
50
|
+
- Detects public symbols that survive only via package `__init__` re-exports or same-module annotation scaffolding.
|
|
38
51
|
- `vulture-changed` (repo: `local`, entry: `uv run vulture --min-confidence 80 scripts/utils/vulture_whitelist.py`, files: `^src/.*\.py$`, exclude: `tests/|test_`)
|
|
39
52
|
- `naming-conventions` (repo: `local`, entry: `uv run python scripts/check-naming-conventions.py`, files: `^src/.*\.py$`, exclude: `tests/|scripts/`)
|
|
40
53
|
- `defensive-slop` (repo: `local`, entry: `uv run python scripts/check-defensive-slop.py`, files: `^src/.*\.py$`, stages: `pre-commit`, `pre-push`)
|
|
41
|
-
- `check-file-length` (repo: `local`, entry: `scripts/check-file-length.sh`, files: `\.py$`, exclude: `tests
|
|
54
|
+
- `check-file-length` (repo: `local`, entry: `scripts/check-file-length.sh`, files: `\.py$`, exclude: `tests/`)
|
|
55
|
+
- Current behavior: enforces the `>600` line rule for non-test Python files only. All files under `tests/` are intentionally excluded from this gate.
|
|
42
56
|
|
|
43
57
|
#### Security and safeguards
|
|
44
58
|
- `bandit` (repo: `PyCQA/bandit`, args: `-c pyproject.toml`, dep: `bandit[toml]`)
|
|
@@ -48,7 +62,14 @@ Source of truth: `.pre-commit-config.yaml`
|
|
|
48
62
|
|
|
49
63
|
#### Architecture and docs
|
|
50
64
|
- `dependency-layers` (repo: `local`, entry: `uv run pytest tests/test_dependency_layers.py -v`)
|
|
65
|
+
- Source of truth for import-layer enforcement: `tests/test_dependency_layers.py` uses `grimp.build_graph("tunacode")` to detect illegal cross-layer imports.
|
|
66
|
+
- Dependency report generation: `scripts/grimp_layers_report.py` uses `grimp` to generate `docs/architecture/dependencies/DEPENDENCY_LAYERS.*`.
|
|
67
|
+
- Supplemental only: `scripts/run_gates.py` also uses `grimp`, but it is not the canonical architecture check.
|
|
68
|
+
- `tests/architecture/test_import_order.py` enforces first-party import layer ordering.
|
|
69
|
+
- `tests/architecture/test_init_bloat.py` enforces thin `__init__.py` modules.
|
|
70
|
+
- `scripts/check_agents_freshness.py` validates `AGENTS.md` freshness against recent `src/` and `docs/` changes.
|
|
51
71
|
- `doc8` (repo: `pycqa/doc8`, args: `--max-line-length=120`)
|
|
72
|
+
- Current behavior: the hook is configured, but `pre-commit run doc8 --all-files` skips in this repository because no matching doc8-supported files are selected.
|
|
52
73
|
|
|
53
74
|
### Currently disabled in config
|
|
54
75
|
- `isort` (commented out; replaced by Ruff import sorting)
|
|
@@ -60,11 +81,17 @@ Pre-push hooks run from `.pre-commit-config.yaml` with stage `pre-push`.
|
|
|
60
81
|
|
|
61
82
|
### Active pre-push hooks
|
|
62
83
|
- `mypy` (local, `uv run mypy --ignore-missing-imports --no-strict-optional`, scoped to `src/**/*.py`)
|
|
84
|
+
- `stale-symbol-surfaces` (local, `uv run python scripts/check_stale_symbol_surfaces.py`)
|
|
63
85
|
- `defensive-slop` (local, `uv run python scripts/check-defensive-slop.py`, scoped to `src/**/*.py`)
|
|
64
86
|
- `pylint-duplicates` (local, duplicate-code check)
|
|
65
87
|
- `pytest` (local, `uv run pytest -x -q`)
|
|
88
|
+
- `ast-grep-getattr-ratchet` (local, `scripts/run_ast_grep_checks.sh`, scoped to `src/**/*.py`, `rules/ast-grep/**`, and ast-grep helper scripts)
|
|
89
|
+
- Validates the ast-grep rule file, runs the rule test, then scans all of `src/` for `getattr(...)` and fails only on findings not present in the committed baseline.
|
|
90
|
+
- `empty-dir-check` (local, `uv run python scripts/utils/check_empty_dirs.py`)
|
|
91
|
+
- `markdown-frontmatter` (local, `uv run python scripts/check_markdown_frontmatter.py`, scoped to repo-root/docs markdown except `AGENTS.md` and root `README.md`)
|
|
66
92
|
|
|
67
93
|
### Run hooks manually
|
|
94
|
+
- Canonical local harness entrypoint: `make check`
|
|
68
95
|
- Pre-commit stage: `uv run pre-commit run --hook-stage pre-commit --all-files`
|
|
69
96
|
- Pre-push stage: `uv run pre-commit run --hook-stage pre-push --all-files`
|
|
70
97
|
- Combined shortcut: `make check`
|
|
@@ -78,5 +105,10 @@ Pre-push hooks run from `.pre-commit-config.yaml` with stage `pre-push`.
|
|
|
78
105
|
|
|
79
106
|
## CI/CD
|
|
80
107
|
|
|
81
|
-
-
|
|
82
|
-
-
|
|
108
|
+
- Local source of truth: `make check` runs the full pre-commit and pre-push hook stages across all files, plus the CI enforcement checks for full dead-code scan, orphan-module detection, and `deptry`.
|
|
109
|
+
- Local supplemental check: `uv run python scripts/run_gates.py` is a subset spot-check and does not mirror the full local or CI harness.
|
|
110
|
+
- CI enforcement: pre-commit and pre-push remain the first enforcement line before CI.
|
|
111
|
+
- CI enforcement: `.github/workflows/lint.yml` runs `pre-commit`, full dead-code checks, stale symbol surface detection, orphan-module detection, and a separate `deptry` job.
|
|
112
|
+
- CI enforcement: `.github/workflows/empty-dir-check.yml` enforces the empty-directory / `__init__.py`-only directory rule in CI.
|
|
113
|
+
- CI artifact generation: `.github/workflows/dependency-map.yml` runs on pushes to `main`/`master`, regenerates `docs/architecture/dependencies/DEPENDENCY_LAYERS.*`, and pushes changes to `automation/dependency-map` for PR review.
|
|
114
|
+
- CI report / issue automation: `.github/workflows/tech-debt.yml` scans TODO/FIXME-style debt and the scheduled report job can open or update a GitHub issue.
|
|
@@ -7,23 +7,22 @@
|
|
|
7
7
|
help:
|
|
8
8
|
@echo "Tunacode Development Commands:"
|
|
9
9
|
@echo ""
|
|
10
|
-
@echo " make
|
|
11
|
-
@echo " make
|
|
10
|
+
@echo " make install - Cleanly bootstrap the verified dev environment"
|
|
11
|
+
@echo " make dev-setup - Alias for make install"
|
|
12
12
|
@echo " make run - Run the development server"
|
|
13
13
|
@echo " make test - Run test suite"
|
|
14
14
|
@echo " make test-tmux - Run the tmux system test suite"
|
|
15
15
|
@echo " make lint - Run linters and formatters"
|
|
16
|
-
@echo " make check - Run harness checks (
|
|
16
|
+
@echo " make check - Run harness checks (hooks + CI enforcement parity checks)"
|
|
17
17
|
@echo " make clean - Clean build artifacts"
|
|
18
18
|
@echo ""
|
|
19
19
|
|
|
20
|
-
#
|
|
21
|
-
|
|
20
|
+
# Cleanly bootstrap the full development environment
|
|
21
|
+
install:
|
|
22
22
|
@bash scripts/dev-setup.sh
|
|
23
23
|
|
|
24
|
-
#
|
|
25
|
-
install
|
|
26
|
-
uv sync --extra dev
|
|
24
|
+
# Backwards-compatible alias for the canonical install target
|
|
25
|
+
dev-setup: install
|
|
27
26
|
|
|
28
27
|
# Run the development server
|
|
29
28
|
run:
|
|
@@ -41,10 +40,14 @@ test-tmux:
|
|
|
41
40
|
lint:
|
|
42
41
|
uv run ruff check --fix .
|
|
43
42
|
|
|
44
|
-
# Run full harness checks locally (
|
|
43
|
+
# Run full harness checks locally (hooks + CI enforcement parity checks)
|
|
45
44
|
check:
|
|
46
45
|
uv run pre-commit run --all-files --hook-stage pre-commit
|
|
47
46
|
uv run pre-commit run --all-files --hook-stage pre-push
|
|
47
|
+
uv run unimport --check --gitignore --exclude 'venv/*' --exclude '.venv/*' --exclude '.uv-cache/*' --exclude '.uv_cache/*' src
|
|
48
|
+
uv run vulture --min-confidence 80 scripts/utils/vulture_whitelist.py src
|
|
49
|
+
uv run python scripts/check_unused_modules.py
|
|
50
|
+
uv run deptry src/
|
|
48
51
|
|
|
49
52
|
# Clean build artifacts
|
|
50
53
|
clean:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tunacode-cli
|
|
3
|
-
Version: 0.1
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: Your agentic CLI developer.
|
|
5
5
|
Project-URL: Homepage, https://tunacode.xyz/
|
|
6
6
|
Project-URL: Repository, https://github.com/alchemiststudiosDOTai/tunacode
|
|
@@ -74,13 +74,11 @@ A terminal-based AI coding agent with a NeXTSTEP-inspired interface.
|
|
|
74
74
|
|
|
75
75
|
## Features
|
|
76
76
|
|
|
77
|
-
- **Any model** - Works with any OpenAI-compatible API
|
|
78
|
-
- **Native tinyagent tools** - Direct tinyagent tool contracts with no legacy wrapper compatibility layer
|
|
77
|
+
- **Any model** - Works with any OpenAI-compatible API
|
|
79
78
|
- **File operations** - Read files with hash-tagged lines, create files, and edit existing files with hash-validated references
|
|
80
79
|
- **Shell access** - Run bash commands with output capture
|
|
81
80
|
- **Repository discovery** - Use `discover` for natural-language code search and repository exploration
|
|
82
81
|
- **Session persistence** - Resume previous conversations with `/resume`
|
|
83
|
-
- **LSP diagnostics** - Real-time code errors after file writes (Python, TypeScript, Go, Rust)
|
|
84
82
|
- **Themeable UI** - CSS-based theming with NeXTSTEP-inspired design
|
|
85
83
|
- **Text selection + clipboard copy** - Mouse selection works across Rich-rendered chat content; copy with `ctrl+y` or `ctrl+shift+c`
|
|
86
84
|
- **Agent loop** - Powered by [tinyAgent](https://github.com/alchemiststudiosDOTai/tinyAgent)
|
|
@@ -112,7 +110,7 @@ pip install tunacode-cli
|
|
|
112
110
|
```bash
|
|
113
111
|
git clone https://github.com/alchemiststudiosDOTai/tunacode.git
|
|
114
112
|
cd tunacode
|
|
115
|
-
make
|
|
113
|
+
make install
|
|
116
114
|
```
|
|
117
115
|
|
|
118
116
|
Or without make:
|
|
@@ -127,14 +125,16 @@ cd tunacode
|
|
|
127
125
|
Common development tasks:
|
|
128
126
|
|
|
129
127
|
```bash
|
|
130
|
-
make
|
|
131
|
-
make
|
|
128
|
+
make install # Cleanly bootstrap the verified dev environment
|
|
129
|
+
make dev-setup # Alias for make install
|
|
132
130
|
make run # Run the development server
|
|
133
131
|
make test # Run test suite
|
|
134
132
|
make lint # Run linters
|
|
135
133
|
make clean # Clean build artifacts
|
|
136
134
|
```
|
|
137
135
|
|
|
136
|
+
`make install` also installs repo-managed `pre-commit` and `pre-push` hooks from `.githooks/` using relative symlinks, so moving the checkout does not strand the hooks on an old absolute virtualenv path.
|
|
137
|
+
|
|
138
138
|
View technical debt:
|
|
139
139
|
|
|
140
140
|
```bash
|
|
@@ -188,16 +188,6 @@ Slash commands are command objects in `tunacode.ui.commands`; each one is a `Com
|
|
|
188
188
|
| `/exit` | Exit TunaCode |
|
|
189
189
|
| `exit` | Legacy alias for exit |
|
|
190
190
|
|
|
191
|
-
### Confirm Parallel Tool Calls
|
|
192
|
-
|
|
193
|
-
Run `/debug` to enable lifecycle logs. During agent execution, parallel batches are reported with lines prefixed by:
|
|
194
|
-
|
|
195
|
-
- `[LIFECYCLE] Parallel tool calls active: ...`
|
|
196
|
-
- `[LIFECYCLE] Parallel tool calls update: ...`
|
|
197
|
-
- `[LIFECYCLE] Parallel tool calls complete`
|
|
198
|
-
|
|
199
|
-
If no `Parallel tool calls` lifecycle lines appear, that request did not execute a parallel tool batch.
|
|
200
|
-
## Tools
|
|
201
191
|
|
|
202
192
|
The agent has access to:
|
|
203
193
|
|
|
@@ -210,7 +200,6 @@ The agent has access to:
|
|
|
210
200
|
| `web_fetch` | Fetch web page content |
|
|
211
201
|
| `write_file` | Create new files |
|
|
212
202
|
|
|
213
|
-
TunaCode now uses the native tinyagent tool surface directly. Legacy wrapper-based tools such as `update_file`, `glob`, `grep`, and `list_dir` are removed rather than translated through a compatibility layer.
|
|
214
203
|
|
|
215
204
|
Important tool rules:
|
|
216
205
|
|
|
@@ -223,17 +212,6 @@ Important tool rules:
|
|
|
223
212
|
|
|
224
213
|
<img src="assets/hashline-edit.png" alt="hashline-edit tool in tunacode" width="600"/>
|
|
225
214
|
|
|
226
|
-
## LSP Integration
|
|
227
|
-
|
|
228
|
-
Automatic code diagnostics when LSP servers are in PATH:
|
|
229
|
-
|
|
230
|
-
| Language | Server |
|
|
231
|
-
|----------|--------|
|
|
232
|
-
| Python | `ruff server` |
|
|
233
|
-
| TypeScript/JS | `typescript-language-server` |
|
|
234
|
-
| Go | `gopls` |
|
|
235
|
-
| Rust | `rust-analyzer` |
|
|
236
|
-
|
|
237
215
|
## Security
|
|
238
216
|
|
|
239
217
|
TunaCode has **full shell access** with no permission prompts. If you're concerned:
|
|
@@ -14,13 +14,11 @@ A terminal-based AI coding agent with a NeXTSTEP-inspired interface.
|
|
|
14
14
|
|
|
15
15
|
## Features
|
|
16
16
|
|
|
17
|
-
- **Any model** - Works with any OpenAI-compatible API
|
|
18
|
-
- **Native tinyagent tools** - Direct tinyagent tool contracts with no legacy wrapper compatibility layer
|
|
17
|
+
- **Any model** - Works with any OpenAI-compatible API
|
|
19
18
|
- **File operations** - Read files with hash-tagged lines, create files, and edit existing files with hash-validated references
|
|
20
19
|
- **Shell access** - Run bash commands with output capture
|
|
21
20
|
- **Repository discovery** - Use `discover` for natural-language code search and repository exploration
|
|
22
21
|
- **Session persistence** - Resume previous conversations with `/resume`
|
|
23
|
-
- **LSP diagnostics** - Real-time code errors after file writes (Python, TypeScript, Go, Rust)
|
|
24
22
|
- **Themeable UI** - CSS-based theming with NeXTSTEP-inspired design
|
|
25
23
|
- **Text selection + clipboard copy** - Mouse selection works across Rich-rendered chat content; copy with `ctrl+y` or `ctrl+shift+c`
|
|
26
24
|
- **Agent loop** - Powered by [tinyAgent](https://github.com/alchemiststudiosDOTai/tinyAgent)
|
|
@@ -52,7 +50,7 @@ pip install tunacode-cli
|
|
|
52
50
|
```bash
|
|
53
51
|
git clone https://github.com/alchemiststudiosDOTai/tunacode.git
|
|
54
52
|
cd tunacode
|
|
55
|
-
make
|
|
53
|
+
make install
|
|
56
54
|
```
|
|
57
55
|
|
|
58
56
|
Or without make:
|
|
@@ -67,14 +65,16 @@ cd tunacode
|
|
|
67
65
|
Common development tasks:
|
|
68
66
|
|
|
69
67
|
```bash
|
|
70
|
-
make
|
|
71
|
-
make
|
|
68
|
+
make install # Cleanly bootstrap the verified dev environment
|
|
69
|
+
make dev-setup # Alias for make install
|
|
72
70
|
make run # Run the development server
|
|
73
71
|
make test # Run test suite
|
|
74
72
|
make lint # Run linters
|
|
75
73
|
make clean # Clean build artifacts
|
|
76
74
|
```
|
|
77
75
|
|
|
76
|
+
`make install` also installs repo-managed `pre-commit` and `pre-push` hooks from `.githooks/` using relative symlinks, so moving the checkout does not strand the hooks on an old absolute virtualenv path.
|
|
77
|
+
|
|
78
78
|
View technical debt:
|
|
79
79
|
|
|
80
80
|
```bash
|
|
@@ -128,16 +128,6 @@ Slash commands are command objects in `tunacode.ui.commands`; each one is a `Com
|
|
|
128
128
|
| `/exit` | Exit TunaCode |
|
|
129
129
|
| `exit` | Legacy alias for exit |
|
|
130
130
|
|
|
131
|
-
### Confirm Parallel Tool Calls
|
|
132
|
-
|
|
133
|
-
Run `/debug` to enable lifecycle logs. During agent execution, parallel batches are reported with lines prefixed by:
|
|
134
|
-
|
|
135
|
-
- `[LIFECYCLE] Parallel tool calls active: ...`
|
|
136
|
-
- `[LIFECYCLE] Parallel tool calls update: ...`
|
|
137
|
-
- `[LIFECYCLE] Parallel tool calls complete`
|
|
138
|
-
|
|
139
|
-
If no `Parallel tool calls` lifecycle lines appear, that request did not execute a parallel tool batch.
|
|
140
|
-
## Tools
|
|
141
131
|
|
|
142
132
|
The agent has access to:
|
|
143
133
|
|
|
@@ -150,7 +140,6 @@ The agent has access to:
|
|
|
150
140
|
| `web_fetch` | Fetch web page content |
|
|
151
141
|
| `write_file` | Create new files |
|
|
152
142
|
|
|
153
|
-
TunaCode now uses the native tinyagent tool surface directly. Legacy wrapper-based tools such as `update_file`, `glob`, `grep`, and `list_dir` are removed rather than translated through a compatibility layer.
|
|
154
143
|
|
|
155
144
|
Important tool rules:
|
|
156
145
|
|
|
@@ -163,17 +152,6 @@ Important tool rules:
|
|
|
163
152
|
|
|
164
153
|
<img src="assets/hashline-edit.png" alt="hashline-edit tool in tunacode" width="600"/>
|
|
165
154
|
|
|
166
|
-
## LSP Integration
|
|
167
|
-
|
|
168
|
-
Automatic code diagnostics when LSP servers are in PATH:
|
|
169
|
-
|
|
170
|
-
| Language | Server |
|
|
171
|
-
|----------|--------|
|
|
172
|
-
| Python | `ruff server` |
|
|
173
|
-
| TypeScript/JS | `typescript-language-server` |
|
|
174
|
-
| Go | `gopls` |
|
|
175
|
-
| Rust | `rust-analyzer` |
|
|
176
|
-
|
|
177
155
|
## Security
|
|
178
156
|
|
|
179
157
|
TunaCode has **full shell access** with no permission prompts. If you're concerned:
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Code Standards
|
|
3
|
+
summary: Repository coding standards and guardrails for keeping changes simple and scoped.
|
|
4
|
+
when_to_read:
|
|
5
|
+
- When editing source code
|
|
6
|
+
- When reviewing local style and complexity rules
|
|
7
|
+
last_updated: "2026-04-04"
|
|
8
|
+
---
|
|
9
|
+
|
|
1
10
|
# CODE-STANDARDS.md
|
|
2
11
|
|
|
3
12
|
## Purpose
|