tunacode-cli 0.0.70__py3-none-any.whl → 0.0.78.6__py3-none-any.whl
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.
Potentially problematic release.
This version of tunacode-cli might be problematic. Click here for more details.
- tunacode/cli/commands/__init__.py +0 -2
- tunacode/cli/commands/implementations/__init__.py +0 -3
- tunacode/cli/commands/implementations/debug.py +2 -2
- tunacode/cli/commands/implementations/development.py +10 -8
- tunacode/cli/commands/implementations/model.py +357 -29
- tunacode/cli/commands/implementations/system.py +3 -2
- tunacode/cli/commands/implementations/template.py +0 -2
- tunacode/cli/commands/registry.py +8 -7
- tunacode/cli/commands/slash/loader.py +2 -1
- tunacode/cli/commands/slash/validator.py +2 -1
- tunacode/cli/main.py +19 -1
- tunacode/cli/repl.py +90 -229
- tunacode/cli/repl_components/command_parser.py +2 -1
- tunacode/cli/repl_components/error_recovery.py +8 -5
- tunacode/cli/repl_components/output_display.py +1 -10
- tunacode/cli/repl_components/tool_executor.py +1 -13
- tunacode/configuration/defaults.py +2 -2
- tunacode/configuration/key_descriptions.py +284 -0
- tunacode/configuration/settings.py +0 -1
- tunacode/constants.py +6 -42
- tunacode/core/agents/__init__.py +43 -2
- tunacode/core/agents/agent_components/__init__.py +7 -0
- tunacode/core/agents/agent_components/agent_config.py +162 -158
- tunacode/core/agents/agent_components/agent_helpers.py +31 -2
- tunacode/core/agents/agent_components/node_processor.py +180 -146
- tunacode/core/agents/agent_components/response_state.py +123 -6
- tunacode/core/agents/agent_components/state_transition.py +116 -0
- tunacode/core/agents/agent_components/streaming.py +296 -0
- tunacode/core/agents/agent_components/task_completion.py +19 -6
- tunacode/core/agents/agent_components/tool_buffer.py +21 -1
- tunacode/core/agents/agent_components/tool_executor.py +10 -0
- tunacode/core/agents/main.py +522 -370
- tunacode/core/agents/main_legact.py +538 -0
- tunacode/core/agents/prompts.py +66 -0
- tunacode/core/agents/utils.py +29 -122
- tunacode/core/setup/__init__.py +0 -2
- tunacode/core/setup/config_setup.py +88 -227
- tunacode/core/setup/config_wizard.py +230 -0
- tunacode/core/setup/coordinator.py +2 -1
- tunacode/core/state.py +16 -64
- tunacode/core/token_usage/usage_tracker.py +3 -1
- tunacode/core/tool_authorization.py +352 -0
- tunacode/core/tool_handler.py +67 -60
- tunacode/prompts/system.xml +751 -0
- tunacode/services/mcp.py +97 -1
- tunacode/setup.py +0 -23
- tunacode/tools/base.py +54 -1
- tunacode/tools/bash.py +14 -0
- tunacode/tools/glob.py +4 -2
- tunacode/tools/grep.py +7 -17
- tunacode/tools/prompts/glob_prompt.xml +1 -1
- tunacode/tools/prompts/grep_prompt.xml +1 -0
- tunacode/tools/prompts/list_dir_prompt.xml +1 -1
- tunacode/tools/prompts/react_prompt.xml +23 -0
- tunacode/tools/prompts/read_file_prompt.xml +1 -1
- tunacode/tools/react.py +153 -0
- tunacode/tools/run_command.py +15 -0
- tunacode/types.py +14 -79
- tunacode/ui/completers.py +434 -50
- tunacode/ui/config_dashboard.py +585 -0
- tunacode/ui/console.py +63 -11
- tunacode/ui/input.py +8 -3
- tunacode/ui/keybindings.py +0 -18
- tunacode/ui/model_selector.py +395 -0
- tunacode/ui/output.py +40 -19
- tunacode/ui/panels.py +173 -49
- tunacode/ui/path_heuristics.py +91 -0
- tunacode/ui/prompt_manager.py +1 -20
- tunacode/ui/tool_ui.py +30 -8
- tunacode/utils/api_key_validation.py +93 -0
- tunacode/utils/config_comparator.py +340 -0
- tunacode/utils/models_registry.py +593 -0
- tunacode/utils/text_utils.py +18 -1
- {tunacode_cli-0.0.70.dist-info → tunacode_cli-0.0.78.6.dist-info}/METADATA +80 -12
- {tunacode_cli-0.0.70.dist-info → tunacode_cli-0.0.78.6.dist-info}/RECORD +78 -74
- tunacode/cli/commands/implementations/plan.py +0 -50
- tunacode/cli/commands/implementations/todo.py +0 -217
- tunacode/context.py +0 -71
- tunacode/core/setup/git_safety_setup.py +0 -186
- tunacode/prompts/system.md +0 -359
- tunacode/prompts/system.md.bak +0 -487
- tunacode/tools/exit_plan_mode.py +0 -273
- tunacode/tools/present_plan.py +0 -288
- tunacode/tools/prompts/exit_plan_mode_prompt.xml +0 -25
- tunacode/tools/prompts/present_plan_prompt.xml +0 -20
- tunacode/tools/prompts/todo_prompt.xml +0 -96
- tunacode/tools/todo.py +0 -456
- {tunacode_cli-0.0.70.dist-info → tunacode_cli-0.0.78.6.dist-info}/WHEEL +0 -0
- {tunacode_cli-0.0.70.dist-info → tunacode_cli-0.0.78.6.dist-info}/entry_points.txt +0 -0
- {tunacode_cli-0.0.70.dist-info → tunacode_cli-0.0.78.6.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tunacode-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.78.6
|
|
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
|
|
@@ -20,13 +20,15 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
20
20
|
Classifier: Topic :: Software Development
|
|
21
21
|
Classifier: Topic :: Utilities
|
|
22
22
|
Requires-Python: <3.14,>=3.10
|
|
23
|
-
Requires-Dist: click<
|
|
23
|
+
Requires-Dist: click<9.0.0,>=8.3.1
|
|
24
24
|
Requires-Dist: defusedxml
|
|
25
|
-
Requires-Dist: prompt-toolkit
|
|
26
|
-
Requires-Dist: pydantic-ai
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist:
|
|
29
|
-
Requires-Dist:
|
|
25
|
+
Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
|
|
26
|
+
Requires-Dist: pydantic-ai<2.0.0,>=1.18.0
|
|
27
|
+
Requires-Dist: pydantic<3.0.0,>=2.12.4
|
|
28
|
+
Requires-Dist: pygments<3.0.0,>=2.19.2
|
|
29
|
+
Requires-Dist: rich<15.0.0,>=14.2.0
|
|
30
|
+
Requires-Dist: textual
|
|
31
|
+
Requires-Dist: tiktoken<1.0.0,>=0.12.0
|
|
30
32
|
Requires-Dist: typer<0.10.0,>=0.9.0
|
|
31
33
|
Provides-Extra: dev
|
|
32
34
|
Requires-Dist: autoflake>=2.0.0; extra == 'dev'
|
|
@@ -69,12 +71,37 @@ Description-Content-Type: text/markdown
|
|
|
69
71
|
# Option 1: One-line install (Linux/macOS)
|
|
70
72
|
wget -qO- https://raw.githubusercontent.com/alchemiststudiosDOTai/tunacode/master/scripts/install_linux.sh | bash
|
|
71
73
|
|
|
72
|
-
# Option 2:
|
|
74
|
+
# Option 2: UV install (recommended)
|
|
75
|
+
uv tool install tunacode-cli
|
|
76
|
+
|
|
77
|
+
# Option 3: pip install
|
|
73
78
|
pip install tunacode-cli
|
|
74
79
|
```
|
|
75
80
|
|
|
76
81
|
For detailed installation and configuration instructions, see the [**Getting Started Guide**](documentation/user/getting-started.md).
|
|
77
82
|
|
|
83
|
+
## Quickstart
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# 1) Install (choose one)
|
|
87
|
+
uv tool install tunacode-cli # recommended
|
|
88
|
+
# or: pip install tunacode-cli
|
|
89
|
+
|
|
90
|
+
# 2) Launch the CLI
|
|
91
|
+
tunacode --wizard # guided setup (enter an API key, pick a model)
|
|
92
|
+
|
|
93
|
+
# 3) Try common commands in the REPL
|
|
94
|
+
/help # see commands
|
|
95
|
+
/model # explore models and set a default
|
|
96
|
+
/plan # enter read-only Plan Mode
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Tip: You can also skip the wizard and set everything via flags:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
tunacode --model openai:gpt-4.1 --key sk-your-key
|
|
103
|
+
```
|
|
104
|
+
|
|
78
105
|
## Development Installation
|
|
79
106
|
|
|
80
107
|
For contributors and developers who want to work on TunaCode:
|
|
@@ -84,23 +111,64 @@ For contributors and developers who want to work on TunaCode:
|
|
|
84
111
|
git clone https://github.com/alchemiststudiosDOTai/tunacode.git
|
|
85
112
|
cd tunacode
|
|
86
113
|
|
|
87
|
-
# Quick setup (recommended)
|
|
114
|
+
# Quick setup (recommended) - uses UV automatically if available
|
|
88
115
|
./scripts/setup_dev_env.sh
|
|
89
116
|
|
|
90
|
-
# Or manual setup
|
|
117
|
+
# Or manual setup with UV (recommended)
|
|
118
|
+
uv venv
|
|
119
|
+
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
120
|
+
uv pip install -e ".[dev]"
|
|
121
|
+
|
|
122
|
+
# Alternative: traditional setup
|
|
91
123
|
python3 -m venv venv
|
|
92
124
|
source venv/bin/activate # On Windows: venv\Scripts\activate
|
|
93
125
|
pip install -e ".[dev]"
|
|
94
126
|
|
|
95
127
|
# Verify installation
|
|
96
|
-
|
|
128
|
+
tunacode --version
|
|
97
129
|
```
|
|
98
130
|
|
|
99
131
|
See the [Hatch Build System Guide](documentation/development/hatch-build-system.md) for detailed instructions on the development environment.
|
|
100
132
|
|
|
101
133
|
## Configuration
|
|
102
134
|
|
|
103
|
-
Choose your AI provider and set your API key. For more details, see the [Configuration Section](documentation/user/getting-started.md#2-configuration) in the Getting Started Guide.
|
|
135
|
+
Choose your AI provider and set your API key. For more details, see the [Configuration Section](documentation/user/getting-started.md#2-configuration) in the Getting Started Guide. For local models (LM Studio, Ollama, etc.), see the [Local Models Setup Guide](documentation/configuration/local-models.md).
|
|
136
|
+
|
|
137
|
+
### New: Enhanced Model Selection
|
|
138
|
+
|
|
139
|
+
TunaCode now automatically saves your model selection for future sessions. When you choose a model using `/model <provider:name>`, it will be remembered across restarts.
|
|
140
|
+
|
|
141
|
+
**If you encounter API key errors**, you can manually create a configuration file that matches the current schema:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# Create the config file
|
|
145
|
+
cat > ~/.config/tunacode.json << 'EOF'
|
|
146
|
+
{
|
|
147
|
+
"default_model": "openai:gpt-4.1",
|
|
148
|
+
"env": {
|
|
149
|
+
"OPENAI_API_KEY": "your-openai-api-key-here",
|
|
150
|
+
"ANTHROPIC_API_KEY": "",
|
|
151
|
+
"GEMINI_API_KEY": "",
|
|
152
|
+
"OPENROUTER_API_KEY": ""
|
|
153
|
+
},
|
|
154
|
+
"settings": {
|
|
155
|
+
"enable_streaming": true,
|
|
156
|
+
"max_iterations": 40,
|
|
157
|
+
"context_window_size": 200000
|
|
158
|
+
},
|
|
159
|
+
"mcpServers": {}
|
|
160
|
+
}
|
|
161
|
+
EOF
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Replace the model and API key with your preferred provider and credentials. Examples:
|
|
165
|
+
- `openai:gpt-4.1` (requires OPENAI_API_KEY)
|
|
166
|
+
- `anthropic:claude-4-sonnet-20250522` (requires ANTHROPIC_API_KEY)
|
|
167
|
+
- `google:gemini-2.5-pro` (requires GEMINI_API_KEY)
|
|
168
|
+
|
|
169
|
+
### ⚠️ Important Notice
|
|
170
|
+
|
|
171
|
+
I apologize for any recent issues with model selection and configuration. I'm actively working to fix these problems and improve the overall stability of TunaCode. Your patience and feedback are greatly appreciated as I work to make the tool more reliable.
|
|
104
172
|
|
|
105
173
|
### Recommended Models
|
|
106
174
|
|
|
@@ -1,61 +1,64 @@
|
|
|
1
1
|
tunacode/__init__.py,sha256=yUul8igNYMfUrHnYfioIGAqvrH8b5BKiO_pt1wVnmd0,119
|
|
2
|
-
tunacode/constants.py,sha256=
|
|
3
|
-
tunacode/context.py,sha256=YtfRjUiqsSkk2k9Nn_pjb_m-AXyh6XcOBOJWtFI0wVw,2405
|
|
2
|
+
tunacode/constants.py,sha256=r08u5GRo9jK_ySVI4g_itxnvNs09kRVrrnazwavAVes,5151
|
|
4
3
|
tunacode/exceptions.py,sha256=m80njR-LqBXhFAEOPqCE7N2QPU4Fkjlf_f6CWKO0_Is,8479
|
|
5
4
|
tunacode/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
tunacode/setup.py,sha256=
|
|
7
|
-
tunacode/types.py,sha256=
|
|
5
|
+
tunacode/setup.py,sha256=m8-198OY5Yp9NSR3OzS_rWeFQPD83ex2UCazDarjA04,1341
|
|
6
|
+
tunacode/types.py,sha256=XllBT4miOtpz4maY5Q6qWoWJLhZB4ksVuMEWDtPlGps,8366
|
|
8
7
|
tunacode/cli/__init__.py,sha256=zgs0UbAck8hfvhYsWhWOfBe5oK09ug2De1r4RuQZREA,55
|
|
9
|
-
tunacode/cli/main.py,sha256=
|
|
10
|
-
tunacode/cli/repl.py,sha256=
|
|
11
|
-
tunacode/cli/commands/__init__.py,sha256=
|
|
8
|
+
tunacode/cli/main.py,sha256=cRqSto2PNYipgGxOX5Q4zabsYR0YCwbaVmGjAx0FuTA,3699
|
|
9
|
+
tunacode/cli/repl.py,sha256=L4dtH7j9io9SKzD7S8heFC41bgTSA5NKR2iaVQLA8U4,17315
|
|
10
|
+
tunacode/cli/commands/__init__.py,sha256=XmDNszfG0AnLK46P6OHP8LR6khKNYahXfqgmkSJt6wc,1758
|
|
12
11
|
tunacode/cli/commands/base.py,sha256=Ge_lNQA-GDfcb1Ap1oznCH3UrifBiHH3bA9DNL-tCDw,2519
|
|
13
|
-
tunacode/cli/commands/registry.py,sha256=
|
|
12
|
+
tunacode/cli/commands/registry.py,sha256=WMmZCK5rMDrtW9cjKbK51GDquvE-dfO_m36XzFVdwcA,14906
|
|
14
13
|
tunacode/cli/commands/template_shortcut.py,sha256=ApYTPkDVBRaLxa7rWaPrsGcJdkR7eg09k18KyTjYg_E,3447
|
|
15
|
-
tunacode/cli/commands/implementations/__init__.py,sha256=
|
|
14
|
+
tunacode/cli/commands/implementations/__init__.py,sha256=QLOS4S2mXxRH65bIXcX3r4IMek_aVaRNJMK1wW0oN2I,1019
|
|
16
15
|
tunacode/cli/commands/implementations/command_reload.py,sha256=GyjeKvJbgE4VYkaasGajspdk9wffumZMNLzfCUeNazM,1555
|
|
17
16
|
tunacode/cli/commands/implementations/conversation.py,sha256=ZijCNaRi1p5v1Q-IaVHtU2_BripSW3JCVKTtqFkOUjg,4676
|
|
18
|
-
tunacode/cli/commands/implementations/debug.py,sha256=
|
|
19
|
-
tunacode/cli/commands/implementations/development.py,sha256=
|
|
20
|
-
tunacode/cli/commands/implementations/model.py,sha256=
|
|
21
|
-
tunacode/cli/commands/implementations/plan.py,sha256=iZtvdGPqvGqMr8_lYil8_8NOL1iyc54Bxtb0gb9VOnw,1825
|
|
17
|
+
tunacode/cli/commands/implementations/debug.py,sha256=w2fUgqFB4ipBCmNotbvaOOVW4OiCwJM6MXNWlyKyoqs,6754
|
|
18
|
+
tunacode/cli/commands/implementations/development.py,sha256=arMtmRX8Nw7irbeV7xCbkma5iEOp5r9sS7OQ26KItYk,2839
|
|
19
|
+
tunacode/cli/commands/implementations/model.py,sha256=dFRmMlcN78TdGMFX-B2OPyoWqOVQL72XC8ayPyUQmpA,16166
|
|
22
20
|
tunacode/cli/commands/implementations/quickstart.py,sha256=53H7ubYMGMgmCeYCs6o_F91Q4pd3Ky008lCU4GPuRP8,1363
|
|
23
|
-
tunacode/cli/commands/implementations/system.py,sha256=
|
|
24
|
-
tunacode/cli/commands/implementations/template.py,sha256=
|
|
25
|
-
tunacode/cli/commands/implementations/todo.py,sha256=Dtz5bgcuK2VXGPWEBBZQgnWUMYkRXNzTGf_qkVPLF2U,8125
|
|
21
|
+
tunacode/cli/commands/implementations/system.py,sha256=EV3-_bvygRWdVRAIUqm5pGKIZ8uKWE2DcHWrKX9-I0w,12023
|
|
22
|
+
tunacode/cli/commands/implementations/template.py,sha256=Akm4kz0sQCx3n0KWQmACQrVyvTLhavC9I2Eg9SRjNu8,5394
|
|
26
23
|
tunacode/cli/commands/slash/__init__.py,sha256=O5EiITHZJgzIciKA_nylj5PyOZNvXE9jPmOHioDk3cU,824
|
|
27
24
|
tunacode/cli/commands/slash/command.py,sha256=ewtyLJNAW0cJLwpSiycyVH0LpqsR3xVqCBhSym7d_7w,6329
|
|
28
|
-
tunacode/cli/commands/slash/loader.py,sha256=
|
|
25
|
+
tunacode/cli/commands/slash/loader.py,sha256=i37m_reKbcezK405-J-OmnpyBzV_QXoZB3Oa_bPw8kY,5632
|
|
29
26
|
tunacode/cli/commands/slash/processor.py,sha256=JQ_sE9Vu7LAdSnUmMz-hBPfD8E60aIHPNeaFMn7PQjM,11751
|
|
30
27
|
tunacode/cli/commands/slash/types.py,sha256=v52tDX7T5I3nEETakloXLQzJqWXSyxcM1K5FbFNdtzw,2375
|
|
31
|
-
tunacode/cli/commands/slash/validator.py,sha256=
|
|
28
|
+
tunacode/cli/commands/slash/validator.py,sha256=UKPE4dijq6VbhcyKcAnuij7Gw1IkvHUijheeiWWEer0,13985
|
|
32
29
|
tunacode/cli/repl_components/__init__.py,sha256=5ZjPJ3yUvZ5x6Vg9EYJ03-tdxfEEdmfradCmwSlVY3E,334
|
|
33
|
-
tunacode/cli/repl_components/command_parser.py,sha256=
|
|
34
|
-
tunacode/cli/repl_components/error_recovery.py,sha256=
|
|
35
|
-
tunacode/cli/repl_components/output_display.py,sha256=
|
|
36
|
-
tunacode/cli/repl_components/tool_executor.py,sha256=
|
|
30
|
+
tunacode/cli/repl_components/command_parser.py,sha256=iRSs4K6aKjKstNNNCYQoGWd3hN1FHDrQrOa7uB9z0Z4,2376
|
|
31
|
+
tunacode/cli/repl_components/error_recovery.py,sha256=1Zm9W_AE9WKfv8n5LnTA_myAu9qotRPEVt72_hnaSq4,6222
|
|
32
|
+
tunacode/cli/repl_components/output_display.py,sha256=7a5CIUjm99RUyK7jj1taEySI1lKlcQxa3T3DzKUa4Go,1107
|
|
33
|
+
tunacode/cli/repl_components/tool_executor.py,sha256=dbvrJFfL1i2kf2XpPXhvCgbTKVSyCAA110brA2ze5B4,3142
|
|
37
34
|
tunacode/configuration/__init__.py,sha256=MbVXy8bGu0yKehzgdgZ_mfWlYGvIdb1dY2Ly75nfuPE,17
|
|
38
|
-
tunacode/configuration/defaults.py,sha256=
|
|
35
|
+
tunacode/configuration/defaults.py,sha256=eFUDD73tTWa3HM320BEn0VWM-XuDKW7d6m32qTK2eRI,1313
|
|
36
|
+
tunacode/configuration/key_descriptions.py,sha256=tvFhdA98RgRoE-Xsb5gfuzB3HSl_GY568Q5vg0C8s2A,11249
|
|
39
37
|
tunacode/configuration/models.py,sha256=buH8ZquvcYI3OQBDIZeJ08cu00rSCeNABtUwl3VQS0E,4103
|
|
40
|
-
tunacode/configuration/settings.py,sha256=
|
|
38
|
+
tunacode/configuration/settings.py,sha256=zLeTmntMY94M87aD9xPNhS4yc8yApdPWltw6u4slP2Q,1020
|
|
41
39
|
tunacode/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
40
|
tunacode/core/code_index.py,sha256=2qxEn2eTIegV4F_gLeZO5lAOv8mkf4Y_t21whZ9F2Fk,17370
|
|
43
|
-
tunacode/core/state.py,sha256=
|
|
44
|
-
tunacode/core/
|
|
45
|
-
tunacode/core/
|
|
46
|
-
tunacode/core/agents/
|
|
47
|
-
tunacode/core/agents/
|
|
48
|
-
tunacode/core/agents/
|
|
49
|
-
tunacode/core/agents/
|
|
50
|
-
tunacode/core/agents/
|
|
41
|
+
tunacode/core/state.py,sha256=esGjB3zCfdwqcZzurH7oxAC5Klkd0gskkAgY3fviCDU,6367
|
|
42
|
+
tunacode/core/tool_authorization.py,sha256=VBPNCWxoxlq_dEuo8EfkQoSwCJqCdn0vOIu9spB82v4,11655
|
|
43
|
+
tunacode/core/tool_handler.py,sha256=PzLg3VYtIGj9dnyJ4kCfCwyncmuxzsMgPwQqn2jmzqI,4444
|
|
44
|
+
tunacode/core/agents/__init__.py,sha256=HmrifkzSUykt4hcL-SeZUgEshYVSZBxLDUSgaS81-A8,1107
|
|
45
|
+
tunacode/core/agents/main.py,sha256=H3PHfQCvDYazlu-hqzlmeEUE-uImjSf1aqYcBmb0vQo,23314
|
|
46
|
+
tunacode/core/agents/main_legact.py,sha256=5p5k7Em1_dH5ZoytWEhPHYKx3Nhb71KoE_TN-mwOfOE,20856
|
|
47
|
+
tunacode/core/agents/prompts.py,sha256=Eps3qQm8zdgPnyYOvRYwINMGVa71ttuqGlgtH17-3ag,2357
|
|
48
|
+
tunacode/core/agents/utils.py,sha256=jqR7xIeeqj45SbFjUcIBi1-f10Af8iKwM2Abezvb0II,10607
|
|
49
|
+
tunacode/core/agents/agent_components/__init__.py,sha256=65V5ijSKen0F0zLvUO3AkZJmCrocSW3lEbqNPrHqxoc,1706
|
|
50
|
+
tunacode/core/agents/agent_components/agent_config.py,sha256=9mjZlRVUTSJh7Y2fbBmyLrojBHfSGpqwQ4ES5-C6ozc,11872
|
|
51
|
+
tunacode/core/agents/agent_components/agent_helpers.py,sha256=pfoP_pX4N1g950UDcLkZS-FSq5at3IvNDZhJStt7IWk,9157
|
|
51
52
|
tunacode/core/agents/agent_components/json_tool_parser.py,sha256=HuyNT0rs-ppx_gLAI2e0XMVGbR_F0WXZfP3sx38VoMg,3447
|
|
52
53
|
tunacode/core/agents/agent_components/message_handler.py,sha256=KJGOtb9VhumgZpxxwO45HrKLhU9_MwuoWRsSQwJviNU,3704
|
|
53
|
-
tunacode/core/agents/agent_components/node_processor.py,sha256=
|
|
54
|
-
tunacode/core/agents/agent_components/response_state.py,sha256=
|
|
54
|
+
tunacode/core/agents/agent_components/node_processor.py,sha256=2DqM__dU2bNlcrCS7ptD05a3xI7mR4GURCj5DzofuiY,21533
|
|
55
|
+
tunacode/core/agents/agent_components/response_state.py,sha256=XHaJrkn4kWecVM008kWf_nEAkoR2UPYfqaH-azdzhj8,5061
|
|
55
56
|
tunacode/core/agents/agent_components/result_wrapper.py,sha256=9CFK0wpsfZx2WT4PBHfkSv22GxL1gAQuUYVMlmYtCJU,1761
|
|
56
|
-
tunacode/core/agents/agent_components/
|
|
57
|
-
tunacode/core/agents/agent_components/
|
|
58
|
-
tunacode/core/agents/agent_components/
|
|
57
|
+
tunacode/core/agents/agent_components/state_transition.py,sha256=uyvLJriexosBDQIrxbVDLR_luvXAMG6tnDsX10mbZcI,4077
|
|
58
|
+
tunacode/core/agents/agent_components/streaming.py,sha256=hVtxxZTkJZPSqlQxi5twRoWz0FXRApQ8pG83zRNSHSU,15207
|
|
59
|
+
tunacode/core/agents/agent_components/task_completion.py,sha256=iLzwspVDtkXTJNQFk8YNSbb6wzMWEelmSMwSnzLIzbk,1193
|
|
60
|
+
tunacode/core/agents/agent_components/tool_buffer.py,sha256=h9PeP9glW_rlGKElH-JD_CPUVhS3tS4AUwZSn4oINzg,1520
|
|
61
|
+
tunacode/core/agents/agent_components/tool_executor.py,sha256=MMGjRmjBnuyYnKh64fMTAQJujIEgDizQFMUdNSbP0Cc,2401
|
|
59
62
|
tunacode/core/agents/agent_components/truncation_checker.py,sha256=XbJ3wwtdC4NhgIMIvFR0z_cfNnYMkiYAZo9zGDBPU8Y,2685
|
|
60
63
|
tunacode/core/background/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
61
64
|
tunacode/core/background/manager.py,sha256=AxNcuuE7T2pqeI2lLIGJgaS_jEw60YzBfZY9EOY54fc,1160
|
|
@@ -65,35 +68,32 @@ tunacode/core/logging/config.py,sha256=bhJ6KYrEliKC5BehXKXZHHPBJUBX0g5O3uxbr8qUK
|
|
|
65
68
|
tunacode/core/logging/formatters.py,sha256=uWx-M0jSvsAVo5JVdCK1VIVawXNONjJ2CvMwPuuUTg8,1236
|
|
66
69
|
tunacode/core/logging/handlers.py,sha256=lkLczpcI6kSammSdjrCccosGMrRdcAA_3UmuTOiPnxg,3788
|
|
67
70
|
tunacode/core/logging/logger.py,sha256=9RjRuX0GoUojRJ8WnJGQPFdXiluiJMCoFmvc8xEioB8,142
|
|
68
|
-
tunacode/core/setup/__init__.py,sha256=
|
|
71
|
+
tunacode/core/setup/__init__.py,sha256=edzZ5tdWPdokPaOuFgYGEUGY_Fcn6bcWSiDOhGGZTBc,372
|
|
69
72
|
tunacode/core/setup/agent_setup.py,sha256=tpOIW85C6o1m8pwAZQBIMKxKIyBUOpHHn4JJmDBFH3Q,1403
|
|
70
73
|
tunacode/core/setup/base.py,sha256=FMjBQQS_q3KOxHqfg7NJGmKq-1nxC40htiPZprzTu7I,970
|
|
71
|
-
tunacode/core/setup/config_setup.py,sha256=
|
|
72
|
-
tunacode/core/setup/
|
|
74
|
+
tunacode/core/setup/config_setup.py,sha256=lzVsnXZ6jnrD1tasjd4BDPFrSrFNcreZXEf3Twp_re0,19192
|
|
75
|
+
tunacode/core/setup/config_wizard.py,sha256=0QnJk6UzdXhfNWlu_YgndLP5oMyxJEt-zzGdQaRFjnU,9376
|
|
76
|
+
tunacode/core/setup/coordinator.py,sha256=_tGi5QuV00IJ4QK8mYfpaHZn0esB6CWCuiTE55zhSuw,2407
|
|
73
77
|
tunacode/core/setup/environment_setup.py,sha256=n3IrObKEynHZSwtUJ1FddMg2C4sHz7ca42awemImV8s,2225
|
|
74
|
-
tunacode/core/setup/git_safety_setup.py,sha256=Htt8A4BAn7F4DbjhNu_SO01zjwaRQ3wMv-vZujE1-JA,7328
|
|
75
78
|
tunacode/core/setup/template_setup.py,sha256=0lDGhNVCvGN7ykqHnl3pj4CONH3I2PvMzkmIZibfSoc,2640
|
|
76
79
|
tunacode/core/token_usage/api_response_parser.py,sha256=plLltHg4zGVzxjv3MFj45bbd-NOJeT_v3P0Ki4zlvn4,1831
|
|
77
80
|
tunacode/core/token_usage/cost_calculator.py,sha256=RjO-O0JENBuGOrWP7QgBZlZxeXC-PAIr8tj_9p_BxOU,2058
|
|
78
|
-
tunacode/core/token_usage/usage_tracker.py,sha256=
|
|
79
|
-
tunacode/prompts/system.
|
|
80
|
-
tunacode/prompts/system.md.bak,sha256=q0gbk_-pvQlNtZBonRo4gNILkKStqNxgDN0ZEwzC3E4,17541
|
|
81
|
+
tunacode/core/token_usage/usage_tracker.py,sha256=lF-ehx-UQnorS4T1Xxa06GGRRjpaEnfmZl5LukGW9LY,6068
|
|
82
|
+
tunacode/prompts/system.xml,sha256=CdUctusc2qBoTYF3zWAzXv9djrqAZcj68-eyT3FF714,25122
|
|
81
83
|
tunacode/services/__init__.py,sha256=w_E8QK6RnvKSvU866eDe8BCRV26rAm4d3R-Yg06OWCU,19
|
|
82
|
-
tunacode/services/mcp.py,sha256=
|
|
84
|
+
tunacode/services/mcp.py,sha256=AXDbEEDiVA6VhcGUmSm4uo7cBk-2qBHp-j6r57Cjt3k,7573
|
|
83
85
|
tunacode/templates/__init__.py,sha256=ssEOPrPjyCywtKI-QFcoqcWhMjlfI5TbI8Ip0_wyqGM,241
|
|
84
86
|
tunacode/templates/loader.py,sha256=6_Dk4jX47_GKUAWxlHG2Mzkl9lkXFUOiAdlcJqb6rBA,6765
|
|
85
87
|
tunacode/tools/__init__.py,sha256=ECBuUWWF1JjHW42CCceaPKgVTQyuljbz3RlhuA2fe2s,314
|
|
86
|
-
tunacode/tools/base.py,sha256=
|
|
87
|
-
tunacode/tools/bash.py,sha256=
|
|
88
|
-
tunacode/tools/
|
|
89
|
-
tunacode/tools/
|
|
90
|
-
tunacode/tools/grep.py,sha256=nKKpJjr2uupErB2KAUgTog3ZqC8oKiho5qkKeFvpY70,22178
|
|
88
|
+
tunacode/tools/base.py,sha256=PqXBYbXncGoUDWrLPwMxLJiM0CLFqGmieIMBnoi3TL8,12767
|
|
89
|
+
tunacode/tools/bash.py,sha256=3fQgeJSm0bCwNbr3DoGYGiDbagGMl0GtzABeoUWLUrU,13160
|
|
90
|
+
tunacode/tools/glob.py,sha256=OEs-DZmXGn1ak-hcMBLJC3vMo2hwU2O-C5eauRdm1dY,22998
|
|
91
|
+
tunacode/tools/grep.py,sha256=cI73BKgW-StCVsGyjWowgPrCEHqptOvH3MA82ZHwxK8,21597
|
|
91
92
|
tunacode/tools/list_dir.py,sha256=aJ2FdAUU-HxOmAwBk188KYIYB94thESIrSBflzoUlYs,12402
|
|
92
|
-
tunacode/tools/
|
|
93
|
+
tunacode/tools/react.py,sha256=qEXhtxFM3skoz__L9R0Rabt1bmKdNkRyFMyAgNB_TFo,5602
|
|
93
94
|
tunacode/tools/read_file.py,sha256=Xy8vkckjq8kBNNYJMpMhq0pabVi4Kp8b57C3C3picI4,6729
|
|
94
|
-
tunacode/tools/run_command.py,sha256=
|
|
95
|
+
tunacode/tools/run_command.py,sha256=C267wJG6uw2goSTzLhCPTeDphoI0wXTC9zX043iagks,8846
|
|
95
96
|
tunacode/tools/schema_assembler.py,sha256=sUePWvprfTHz9hau1q7hmWd12ew3rHdbASAGkpjBhuM,5507
|
|
96
|
-
tunacode/tools/todo.py,sha256=wO8Ui19Jd4r_LQ9Iirlo0WQamcxu1H6NuVWf87soKwk,18027
|
|
97
97
|
tunacode/tools/update_file.py,sha256=0KTbEe1awS53CZPh1G3F3-TWuemWWBuDVQhcRYwXKOg,7619
|
|
98
98
|
tunacode/tools/write_file.py,sha256=WHEXdUKqUHZZ8Jh1muyupJgjud-x6h99x7qAMaloLao,6021
|
|
99
99
|
tunacode/tools/xml_helper.py,sha256=iDEUeLDNWwdGFyb8T9Vqfo_V7oX7oXm4l3IFPTdJtCM,2996
|
|
@@ -103,14 +103,12 @@ tunacode/tools/grep_components/pattern_matcher.py,sha256=ZvEUqBZ6UWf9wZzb1DIRGST
|
|
|
103
103
|
tunacode/tools/grep_components/result_formatter.py,sha256=S2TKdkJ81akFWyhwico0xR4jSx4yubfqchErEW-mEDQ,5223
|
|
104
104
|
tunacode/tools/grep_components/search_result.py,sha256=xzb_htSANuPIPVWViPAqIMsCCWVA8loxWdaZOA8RqMs,869
|
|
105
105
|
tunacode/tools/prompts/bash_prompt.xml,sha256=TzbZDFPhpRdYit0w3AVX66uCtJGDQhrdCEqY_FbHSC8,4051
|
|
106
|
-
tunacode/tools/prompts/
|
|
107
|
-
tunacode/tools/prompts/
|
|
108
|
-
tunacode/tools/prompts/
|
|
109
|
-
tunacode/tools/prompts/
|
|
110
|
-
tunacode/tools/prompts/
|
|
111
|
-
tunacode/tools/prompts/read_file_prompt.xml,sha256=oM3NmTv7wTv39LwAEsdXnWATJNI8qFr6WSK_esR09Is,3087
|
|
106
|
+
tunacode/tools/prompts/glob_prompt.xml,sha256=G_ZTrHrhgzL3IvO9GIZPMBT6uEKy6AUU_xYTl7ZVPsU,1940
|
|
107
|
+
tunacode/tools/prompts/grep_prompt.xml,sha256=yxZcebUH_TtmllepXUdPnifr1TFlG0jsk3o1wOjl3mM,4944
|
|
108
|
+
tunacode/tools/prompts/list_dir_prompt.xml,sha256=oijSGEMOVh7FglSFQUawQMmmutfC_msZYBJt_KC6mjs,1401
|
|
109
|
+
tunacode/tools/prompts/react_prompt.xml,sha256=etF23T96I5XFs8MczeScjF7NH6jeEHaPOOmwGBwnnv0,829
|
|
110
|
+
tunacode/tools/prompts/read_file_prompt.xml,sha256=K_5FxytYACoj45oAvAnzrrOgU5CJMs421jdzuckUZaE,3123
|
|
112
111
|
tunacode/tools/prompts/run_command_prompt.xml,sha256=JVz0CXdXrI6nthI9QaWN-b1OTTlbIy-TQ7_3MwBs7hI,2332
|
|
113
|
-
tunacode/tools/prompts/todo_prompt.xml,sha256=_fuPhhJYWwIx4No1G2yAyEt054aoybWGfUuzVY8OHWc,4602
|
|
114
112
|
tunacode/tools/prompts/update_file_prompt.xml,sha256=TmIc8K6myqgT_eauYMZmHPfhj-y1S3Gcp680e40pfyA,2831
|
|
115
113
|
tunacode/tools/prompts/write_file_prompt.xml,sha256=n7Q2evuCT0NLEDcoiiBkFcjBeQayF66TF5u-bYplk7U,1610
|
|
116
114
|
tunacode/tutorial/__init__.py,sha256=JyTt2S2cy8u1PnoChBmcOPk1Ru7ElhierltCLqZ-2BY,163
|
|
@@ -118,37 +116,43 @@ tunacode/tutorial/content.py,sha256=qaQewFwXtKKEmzLH-4oMECGAa4Z4nd1qh2HfRWLpwyk,
|
|
|
118
116
|
tunacode/tutorial/manager.py,sha256=ZgkzSC6ZtYSDq5Ce_TfYk9O9cvgFSL-pXrLZb7_HStM,6309
|
|
119
117
|
tunacode/tutorial/steps.py,sha256=l2bbRVJuYlC186A-U1TIoMPBtLl4j053h4Wlzo1VO8c,4393
|
|
120
118
|
tunacode/ui/__init__.py,sha256=aRNE2pS50nFAX6y--rSGMNYwhz905g14gRd6g4BolYU,13
|
|
121
|
-
tunacode/ui/completers.py,sha256=
|
|
122
|
-
tunacode/ui/
|
|
119
|
+
tunacode/ui/completers.py,sha256=QAXnJeq5-p5BFkohCJ-VEe30U7ugetUXo7ZNO7kGMYM,19554
|
|
120
|
+
tunacode/ui/config_dashboard.py,sha256=iwY-52zTeC2EOVn7Cg6LKa2Soxcy9VAGZW-91qOGElI,22213
|
|
121
|
+
tunacode/ui/console.py,sha256=H9BoQpmo-rFpGFcfXW41XAFxbNZn4N7dmcg_PTPvORk,3801
|
|
123
122
|
tunacode/ui/constants.py,sha256=A76B_KpM8jCuBYRg4cPmhi8_j6LLyWttO7_jjv47r3w,421
|
|
124
123
|
tunacode/ui/decorators.py,sha256=jJDNztO8MyX_IG1nqXAL8-sQUFjaAzBnc5BsM3ioX24,1955
|
|
125
|
-
tunacode/ui/input.py,sha256=
|
|
126
|
-
tunacode/ui/keybindings.py,sha256=
|
|
124
|
+
tunacode/ui/input.py,sha256=Mg-w2FvZqf4aw0bS840KfxDq9NY1fMMrzOSlDqo0pD8,3430
|
|
125
|
+
tunacode/ui/keybindings.py,sha256=BGEP3-Gv4p_PbDmCJYy5eJsWhnGbDJpaK-o6xuXJ_Hw,1692
|
|
127
126
|
tunacode/ui/lexers.py,sha256=tmg4ic1enyTRLzanN5QPP7D_0n12YjX_8ZhsffzhXA4,1340
|
|
128
127
|
tunacode/ui/logging_compat.py,sha256=5v6lcjVaG1CxdY1Zm9FAGr9H7Sy-tP6ihGfhP-5YvAY,1406
|
|
129
|
-
tunacode/ui/
|
|
130
|
-
tunacode/ui/
|
|
131
|
-
tunacode/ui/
|
|
128
|
+
tunacode/ui/model_selector.py,sha256=PZH7P6C3sJMU8TAne-VAOCcdUSnwmBChUQ_gqaDiqHc,13449
|
|
129
|
+
tunacode/ui/output.py,sha256=oMozluhzospH8zGSj6Vu2egzWSCJgYSa-T1P7wS8iGM,6381
|
|
130
|
+
tunacode/ui/panels.py,sha256=EeXFMbITcuY44L_1rBpFyKc4tcfhILon10hB4g2BggM,18396
|
|
131
|
+
tunacode/ui/path_heuristics.py,sha256=YfAP7AteI5FCUH2jZX9erSLADfDuH4OCny96OWb0M-Q,2185
|
|
132
|
+
tunacode/ui/prompt_manager.py,sha256=YRtSKPe7uVaJOizNEoTghB82a01K9dnhN-PKka8ZbFU,4767
|
|
132
133
|
tunacode/ui/tool_descriptions.py,sha256=vk61JPIXy7gHNfJ--77maXgK6WwNwxqY47QYsw_a2uw,4126
|
|
133
|
-
tunacode/ui/tool_ui.py,sha256=
|
|
134
|
+
tunacode/ui/tool_ui.py,sha256=tB1w01ffPVtWJn1veutcUrOZE6yb7t7kMqzxVNPfZZs,8132
|
|
134
135
|
tunacode/ui/utils.py,sha256=yvoCTz8AOdRfV0XIqUX3sgg88g_wntV9yhnQP6WzAVs,114
|
|
135
136
|
tunacode/ui/validators.py,sha256=MMIMT1I2v0l2jIy-gxX_4GSApvUTi8XWIOACr_dmoBA,758
|
|
136
137
|
tunacode/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
138
|
+
tunacode/utils/api_key_validation.py,sha256=djfayP2g01d7YDVQXZUdW5ZhFtWAWw5oPhHCo_p74t0,2677
|
|
137
139
|
tunacode/utils/bm25.py,sha256=fd59YQXovC8rXwZrdoqIAfFrLn_WCVjzCh0pkU22APE,1966
|
|
140
|
+
tunacode/utils/config_comparator.py,sha256=iMShhYCKlo0dXycbfpRu5rj3ckT460FoDvkbr5_-yTY,12879
|
|
138
141
|
tunacode/utils/diff_utils.py,sha256=V9QqQ0q4MfabVTnWptF3IXDp3estnfOKcJtDe_Sj14I,2372
|
|
139
142
|
tunacode/utils/file_utils.py,sha256=84g-MQRzmBI2aG_CuXsDl2OhvvWoSL7YdL5Kz_UKSwk,979
|
|
140
143
|
tunacode/utils/import_cache.py,sha256=q_xjJbtju05YbFopLDSkIo1hOtCx3DOTl3GQE5FFDgs,295
|
|
141
144
|
tunacode/utils/json_utils.py,sha256=cMVctSwwV9Z1c-rZdj6UuOlZwsUPSTF5oUruP6uPix0,6470
|
|
142
145
|
tunacode/utils/message_utils.py,sha256=V4MrZZPmwO22_MVGupMqtE5ltQEBwaSIqGD5LEb_bLw,1050
|
|
146
|
+
tunacode/utils/models_registry.py,sha256=Tn2ByGFV1yJsWumFYy6JuT0eVpuPeZ1Zxj6JYsRRy1g,21277
|
|
143
147
|
tunacode/utils/retry.py,sha256=AHdUzY6m-mwlT4OPXdtWWMAafL_NeS7JAMORGyM8c5k,4931
|
|
144
148
|
tunacode/utils/ripgrep.py,sha256=VdGWYPQ1zCwUidw2QicuVmG5OiAgqI93jAsjS3y3ksE,11001
|
|
145
149
|
tunacode/utils/security.py,sha256=i3eGKg4o-qY2S_ObTlEaHO93q14iBfiPXR5O7srHn58,6579
|
|
146
150
|
tunacode/utils/system.py,sha256=J8KqJ4ZqQrNSnM5rrJxPeMk9z2xQQp6dWtI1SKBY1-0,11121
|
|
147
|
-
tunacode/utils/text_utils.py,sha256=
|
|
151
|
+
tunacode/utils/text_utils.py,sha256=KBI_xARsttD03rnCipNHG2RsC-0HV_TPbraT36M9tEI,8218
|
|
148
152
|
tunacode/utils/token_counter.py,sha256=dmFuqVz4ywGFdLfAi5Mg9bAGf8v87Ek-mHU-R3fsYjI,2711
|
|
149
153
|
tunacode/utils/user_configuration.py,sha256=OA-L0BgWNbf9sWpc8lyivgLscwJdpdI8TAYbe0wRs1s,4836
|
|
150
|
-
tunacode_cli-0.0.
|
|
151
|
-
tunacode_cli-0.0.
|
|
152
|
-
tunacode_cli-0.0.
|
|
153
|
-
tunacode_cli-0.0.
|
|
154
|
-
tunacode_cli-0.0.
|
|
154
|
+
tunacode_cli-0.0.78.6.dist-info/METADATA,sha256=UcS7USp5Eibu_5fxYd0n6feaOsXqV5kz3VgT3dbNRdc,9004
|
|
155
|
+
tunacode_cli-0.0.78.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
156
|
+
tunacode_cli-0.0.78.6.dist-info/entry_points.txt,sha256=hbkytikj4dGu6rizPuAd_DGUPBGF191RTnhr9wdhORY,51
|
|
157
|
+
tunacode_cli-0.0.78.6.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
|
|
158
|
+
tunacode_cli-0.0.78.6.dist-info/RECORD,,
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"""Plan mode commands for TunaCode."""
|
|
2
|
-
|
|
3
|
-
from typing import List
|
|
4
|
-
|
|
5
|
-
from ....types import CommandContext
|
|
6
|
-
from ....ui import console as ui
|
|
7
|
-
from ..base import CommandCategory, CommandSpec, SimpleCommand
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class PlanCommand(SimpleCommand):
|
|
11
|
-
"""Enter plan mode for read-only research and planning."""
|
|
12
|
-
|
|
13
|
-
spec = CommandSpec(
|
|
14
|
-
name="plan",
|
|
15
|
-
aliases=["/plan"],
|
|
16
|
-
description="Enter Plan Mode - read-only research phase",
|
|
17
|
-
category=CommandCategory.DEVELOPMENT,
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
async def execute(self, args: List[str], context: CommandContext) -> None:
|
|
21
|
-
"""Enter plan mode."""
|
|
22
|
-
context.state_manager.enter_plan_mode()
|
|
23
|
-
|
|
24
|
-
await ui.info("🔍 Entering Plan Mode")
|
|
25
|
-
await ui.info("• Only read-only operations available")
|
|
26
|
-
await ui.info("• Use tools to research and analyze the codebase")
|
|
27
|
-
await ui.info("• Use 'exit_plan_mode' tool to present your plan")
|
|
28
|
-
await ui.info("• Read-only tools: read_file, grep, list_dir, glob")
|
|
29
|
-
await ui.success("✅ Plan Mode active - indicator will appear above next input")
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class ExitPlanCommand(SimpleCommand):
|
|
33
|
-
"""Exit plan mode manually."""
|
|
34
|
-
|
|
35
|
-
spec = CommandSpec(
|
|
36
|
-
name="exit-plan",
|
|
37
|
-
aliases=["/exit-plan"],
|
|
38
|
-
description="Exit Plan Mode and return to normal mode",
|
|
39
|
-
category=CommandCategory.DEVELOPMENT,
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
async def execute(self, args: List[str], context: CommandContext) -> None:
|
|
43
|
-
"""Exit plan mode manually."""
|
|
44
|
-
if not context.state_manager.is_plan_mode():
|
|
45
|
-
await ui.warning("Not currently in Plan Mode")
|
|
46
|
-
return
|
|
47
|
-
|
|
48
|
-
context.state_manager.exit_plan_mode()
|
|
49
|
-
await ui.success("🚪 Exiting Plan Mode - returning to normal mode")
|
|
50
|
-
await ui.info("✅ All tools are now available - '⏸ PLAN MODE ON' status removed")
|
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
"""Todo command implementation."""
|
|
2
|
-
|
|
3
|
-
from datetime import datetime
|
|
4
|
-
|
|
5
|
-
from rich.box import ROUNDED
|
|
6
|
-
from rich.table import Table
|
|
7
|
-
|
|
8
|
-
from tunacode.types import CommandArgs, CommandContext, CommandResult, TodoItem
|
|
9
|
-
from tunacode.ui import console as ui
|
|
10
|
-
|
|
11
|
-
from ..base import CommandCategory, CommandSpec, SimpleCommand
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class TodoCommand(SimpleCommand):
|
|
15
|
-
"""Manage todo items."""
|
|
16
|
-
|
|
17
|
-
spec = CommandSpec(
|
|
18
|
-
name="todo",
|
|
19
|
-
aliases=["/todo", "todos"],
|
|
20
|
-
description="Manage todo items.",
|
|
21
|
-
category=CommandCategory.DEVELOPMENT,
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
async def execute(self, args: CommandArgs, context: CommandContext) -> CommandResult:
|
|
25
|
-
if not args:
|
|
26
|
-
await self.list_todos(context)
|
|
27
|
-
return
|
|
28
|
-
|
|
29
|
-
subcommand = args[0].lower()
|
|
30
|
-
subcommand_args = args[1:]
|
|
31
|
-
|
|
32
|
-
if subcommand == "list":
|
|
33
|
-
await self.list_todos(context)
|
|
34
|
-
elif subcommand == "add":
|
|
35
|
-
await self.add_todo(subcommand_args, context)
|
|
36
|
-
elif subcommand == "done":
|
|
37
|
-
await self.mark_done(subcommand_args, context)
|
|
38
|
-
elif subcommand == "update":
|
|
39
|
-
await self.update_todo(subcommand_args, context)
|
|
40
|
-
elif subcommand == "priority":
|
|
41
|
-
await self.set_priority(subcommand_args, context)
|
|
42
|
-
elif subcommand == "remove":
|
|
43
|
-
await self.remove_todo(subcommand_args, context)
|
|
44
|
-
elif subcommand == "clear":
|
|
45
|
-
await self.clear_todos(context)
|
|
46
|
-
else:
|
|
47
|
-
await ui.error(
|
|
48
|
-
"Invalid todo subcommand. Available subcommands: list, add, done, update, priority, remove, clear"
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
async def list_todos(self, context: CommandContext) -> None:
|
|
52
|
-
"""Display the todo list with Rich formatting."""
|
|
53
|
-
todos = context.state_manager.session.todos
|
|
54
|
-
if not todos:
|
|
55
|
-
await ui.info("No todos found.")
|
|
56
|
-
return
|
|
57
|
-
|
|
58
|
-
# Create Rich table
|
|
59
|
-
table = Table(show_header=True, box=ROUNDED, padding=(0, 1))
|
|
60
|
-
table.add_column("ID", style="bold cyan", width=4, justify="center")
|
|
61
|
-
table.add_column("Status", width=12, justify="center")
|
|
62
|
-
table.add_column("Task", style="white", min_width=20)
|
|
63
|
-
table.add_column("Priority", width=10, justify="center")
|
|
64
|
-
table.add_column("Created", style="dim", width=12)
|
|
65
|
-
|
|
66
|
-
# Sort todos by status and priority
|
|
67
|
-
pending = [t for t in todos if t.status == "pending"]
|
|
68
|
-
in_progress = [t for t in todos if t.status == "in_progress"]
|
|
69
|
-
completed = [t for t in todos if t.status == "completed"]
|
|
70
|
-
|
|
71
|
-
# Sort each group by priority (high->medium->low)
|
|
72
|
-
priority_order = {"high": 0, "medium": 1, "low": 2}
|
|
73
|
-
|
|
74
|
-
for group in [in_progress, pending, completed]:
|
|
75
|
-
group.sort(key=lambda x: priority_order.get(x.priority, 3))
|
|
76
|
-
|
|
77
|
-
# Add rows to table
|
|
78
|
-
for todo in in_progress + pending + completed:
|
|
79
|
-
# Status with emoji
|
|
80
|
-
if todo.status == "pending":
|
|
81
|
-
status_display = "○ pending"
|
|
82
|
-
elif todo.status == "in_progress":
|
|
83
|
-
status_display = "○ in progress"
|
|
84
|
-
else:
|
|
85
|
-
status_display = "✓ completed"
|
|
86
|
-
|
|
87
|
-
# Priority with color coding
|
|
88
|
-
if todo.priority == "high":
|
|
89
|
-
priority_display = "[red] high[/red]"
|
|
90
|
-
elif todo.priority == "medium":
|
|
91
|
-
priority_display = "[yellow] medium[/yellow]"
|
|
92
|
-
else:
|
|
93
|
-
priority_display = "[green] low[/green]"
|
|
94
|
-
|
|
95
|
-
# Format created date
|
|
96
|
-
created_display = todo.created_at.strftime("%m/%d %H:%M")
|
|
97
|
-
|
|
98
|
-
table.add_row(todo.id, status_display, todo.content, priority_display, created_display)
|
|
99
|
-
|
|
100
|
-
await ui.print(table)
|
|
101
|
-
|
|
102
|
-
async def add_todo(self, args: CommandArgs, context: CommandContext) -> None:
|
|
103
|
-
"""Add a new todo and show updated list."""
|
|
104
|
-
if not args:
|
|
105
|
-
await ui.error("Please provide a task to add.")
|
|
106
|
-
return
|
|
107
|
-
|
|
108
|
-
content = " ".join(args)
|
|
109
|
-
new_id = f"{int(datetime.now().timestamp() * 1000000)}"
|
|
110
|
-
new_todo = TodoItem(
|
|
111
|
-
id=new_id,
|
|
112
|
-
content=content,
|
|
113
|
-
status="pending",
|
|
114
|
-
priority="medium",
|
|
115
|
-
created_at=datetime.now(),
|
|
116
|
-
)
|
|
117
|
-
context.state_manager.add_todo(new_todo)
|
|
118
|
-
|
|
119
|
-
await ui.success(f"Todo created: {content}")
|
|
120
|
-
await self.list_todos(context)
|
|
121
|
-
|
|
122
|
-
async def mark_done(self, args: CommandArgs, context: CommandContext) -> None:
|
|
123
|
-
"""Mark a todo as done and show updated list."""
|
|
124
|
-
if not args:
|
|
125
|
-
await ui.error("Please provide a todo ID to mark as done.")
|
|
126
|
-
return
|
|
127
|
-
|
|
128
|
-
todo_id = args[0]
|
|
129
|
-
# Find the todo to get its content for feedback
|
|
130
|
-
todo_content = None
|
|
131
|
-
for todo in context.state_manager.session.todos:
|
|
132
|
-
if todo.id == todo_id:
|
|
133
|
-
todo_content = todo.content
|
|
134
|
-
break
|
|
135
|
-
|
|
136
|
-
if not todo_content:
|
|
137
|
-
await ui.error(f"Todo with id {todo_id} not found.")
|
|
138
|
-
return
|
|
139
|
-
|
|
140
|
-
context.state_manager.update_todo(todo_id, "completed")
|
|
141
|
-
await ui.success(f"Marked todo {todo_id} as done: {todo_content}")
|
|
142
|
-
await self.list_todos(context)
|
|
143
|
-
|
|
144
|
-
async def update_todo(self, args: CommandArgs, context: CommandContext) -> None:
|
|
145
|
-
"""Update a todo status and show updated list."""
|
|
146
|
-
if len(args) < 2:
|
|
147
|
-
await ui.error("Please provide a todo ID and a new status.")
|
|
148
|
-
return
|
|
149
|
-
|
|
150
|
-
todo_id = args[0]
|
|
151
|
-
new_status = args[1].lower()
|
|
152
|
-
if new_status not in ["pending", "in_progress", "completed"]:
|
|
153
|
-
await ui.error("Invalid status. Must be one of: pending, in_progress, completed")
|
|
154
|
-
return
|
|
155
|
-
|
|
156
|
-
for todo in context.state_manager.session.todos:
|
|
157
|
-
if todo.id == todo_id:
|
|
158
|
-
todo.status = new_status
|
|
159
|
-
await ui.success(f"Updated todo {todo_id} to status {new_status}: {todo.content}")
|
|
160
|
-
await self.list_todos(context)
|
|
161
|
-
return
|
|
162
|
-
|
|
163
|
-
await ui.error(f"Todo with id {todo_id} not found.")
|
|
164
|
-
|
|
165
|
-
async def set_priority(self, args: CommandArgs, context: CommandContext) -> None:
|
|
166
|
-
"""Set todo priority and show updated list."""
|
|
167
|
-
if len(args) < 2:
|
|
168
|
-
await ui.error("Please provide a todo ID and a new priority.")
|
|
169
|
-
return
|
|
170
|
-
|
|
171
|
-
todo_id = args[0]
|
|
172
|
-
new_priority = args[1].lower()
|
|
173
|
-
if new_priority not in ["high", "medium", "low"]:
|
|
174
|
-
await ui.error("Invalid priority. Must be one of: high, medium, low")
|
|
175
|
-
return
|
|
176
|
-
|
|
177
|
-
for todo in context.state_manager.session.todos:
|
|
178
|
-
if todo.id == todo_id:
|
|
179
|
-
todo.priority = new_priority
|
|
180
|
-
await ui.success(f"Set todo {todo_id} to priority {new_priority}: {todo.content}")
|
|
181
|
-
await self.list_todos(context)
|
|
182
|
-
return
|
|
183
|
-
|
|
184
|
-
await ui.error(f"Todo with id {todo_id} not found.")
|
|
185
|
-
|
|
186
|
-
async def remove_todo(self, args: CommandArgs, context: CommandContext) -> None:
|
|
187
|
-
"""Remove a todo and show updated list."""
|
|
188
|
-
if not args:
|
|
189
|
-
await ui.error("Please provide a todo ID to remove.")
|
|
190
|
-
return
|
|
191
|
-
|
|
192
|
-
todo_id = args[0]
|
|
193
|
-
# Find the todo to get its content for feedback
|
|
194
|
-
todo_content = None
|
|
195
|
-
for todo in context.state_manager.session.todos:
|
|
196
|
-
if todo.id == todo_id:
|
|
197
|
-
todo_content = todo.content
|
|
198
|
-
break
|
|
199
|
-
|
|
200
|
-
if not todo_content:
|
|
201
|
-
await ui.error(f"Todo with id {todo_id} not found.")
|
|
202
|
-
return
|
|
203
|
-
|
|
204
|
-
context.state_manager.remove_todo(todo_id)
|
|
205
|
-
await ui.success(f"Removed todo {todo_id}: {todo_content}")
|
|
206
|
-
await self.list_todos(context)
|
|
207
|
-
|
|
208
|
-
async def clear_todos(self, context: CommandContext) -> None:
|
|
209
|
-
"""Clear all todos and show confirmation."""
|
|
210
|
-
todo_count = len(context.state_manager.session.todos)
|
|
211
|
-
if todo_count == 0:
|
|
212
|
-
await ui.info("No todos to clear.")
|
|
213
|
-
return
|
|
214
|
-
|
|
215
|
-
context.state_manager.clear_todos()
|
|
216
|
-
await ui.success(f"Cleared all {todo_count} todos.")
|
|
217
|
-
await self.list_todos(context)
|