code-puppy 0.0.336__py3-none-any.whl → 0.0.348__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.
- code_puppy/agents/base_agent.py +41 -224
- code_puppy/agents/event_stream_handler.py +257 -0
- code_puppy/claude_cache_client.py +208 -2
- code_puppy/cli_runner.py +53 -35
- code_puppy/command_line/add_model_menu.py +8 -9
- code_puppy/command_line/autosave_menu.py +18 -24
- code_puppy/command_line/clipboard.py +527 -0
- code_puppy/command_line/core_commands.py +34 -0
- code_puppy/command_line/mcp/catalog_server_installer.py +5 -6
- code_puppy/command_line/mcp/custom_server_form.py +54 -19
- code_puppy/command_line/mcp/custom_server_installer.py +8 -9
- code_puppy/command_line/mcp/handler.py +0 -2
- code_puppy/command_line/mcp/help_command.py +1 -5
- code_puppy/command_line/mcp/start_command.py +36 -18
- code_puppy/command_line/onboarding_slides.py +0 -1
- code_puppy/command_line/prompt_toolkit_completion.py +124 -0
- code_puppy/command_line/utils.py +54 -0
- code_puppy/http_utils.py +93 -130
- code_puppy/mcp_/async_lifecycle.py +35 -4
- code_puppy/mcp_/managed_server.py +49 -24
- code_puppy/mcp_/manager.py +81 -52
- code_puppy/messaging/message_queue.py +11 -23
- code_puppy/messaging/messages.py +3 -0
- code_puppy/messaging/rich_renderer.py +13 -3
- code_puppy/model_factory.py +16 -0
- code_puppy/models.json +2 -2
- code_puppy/plugins/antigravity_oauth/antigravity_model.py +17 -2
- code_puppy/plugins/claude_code_oauth/utils.py +126 -7
- code_puppy/terminal_utils.py +128 -1
- code_puppy/tools/agent_tools.py +66 -13
- code_puppy/tools/command_runner.py +1 -0
- code_puppy/tools/common.py +3 -9
- {code_puppy-0.0.336.data → code_puppy-0.0.348.data}/data/code_puppy/models.json +2 -2
- {code_puppy-0.0.336.dist-info → code_puppy-0.0.348.dist-info}/METADATA +19 -71
- {code_puppy-0.0.336.dist-info → code_puppy-0.0.348.dist-info}/RECORD +39 -38
- code_puppy/command_line/mcp/add_command.py +0 -170
- {code_puppy-0.0.336.data → code_puppy-0.0.348.data}/data/code_puppy/models_dev_api.json +0 -0
- {code_puppy-0.0.336.dist-info → code_puppy-0.0.348.dist-info}/WHEEL +0 -0
- {code_puppy-0.0.336.dist-info → code_puppy-0.0.348.dist-info}/entry_points.txt +0 -0
- {code_puppy-0.0.336.dist-info → code_puppy-0.0.348.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-puppy
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.348
|
|
4
4
|
Summary: Code generation agent
|
|
5
5
|
Project-URL: repository, https://github.com/mpfaffenberger/code_puppy
|
|
6
6
|
Project-URL: HomePage, https://github.com/mpfaffenberger/code_puppy
|
|
@@ -22,6 +22,7 @@ Requires-Dist: httpx[http2]>=0.24.1
|
|
|
22
22
|
Requires-Dist: json-repair>=0.46.2
|
|
23
23
|
Requires-Dist: logfire>=0.7.1
|
|
24
24
|
Requires-Dist: openai>=1.99.1
|
|
25
|
+
Requires-Dist: pillow>=10.0.0
|
|
25
26
|
Requires-Dist: playwright>=1.40.0
|
|
26
27
|
Requires-Dist: prompt-toolkit>=3.0.52
|
|
27
28
|
Requires-Dist: pydantic-ai==1.25.0
|
|
@@ -34,6 +35,7 @@ Requires-Dist: rich>=13.4.2
|
|
|
34
35
|
Requires-Dist: ripgrep==14.1.0
|
|
35
36
|
Requires-Dist: ruff>=0.11.11
|
|
36
37
|
Requires-Dist: tenacity>=8.2.0
|
|
38
|
+
Requires-Dist: termflow-md>=0.1.6
|
|
37
39
|
Requires-Dist: uvicorn>=0.30.0
|
|
38
40
|
Description-Content-Type: text/markdown
|
|
39
41
|
|
|
@@ -106,12 +108,7 @@ uvx code-puppy -i
|
|
|
106
108
|
# Install UV if you don't have it
|
|
107
109
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
108
110
|
|
|
109
|
-
|
|
110
|
-
echo 'export UV_MANAGED_PYTHON=1' >> ~/.zshrc # or ~/.bashrc
|
|
111
|
-
source ~/.zshrc # or ~/.bashrc
|
|
112
|
-
|
|
113
|
-
# Install and run code-puppy
|
|
114
|
-
uvx code-puppy -i
|
|
111
|
+
uvx code-puppy
|
|
115
112
|
```
|
|
116
113
|
|
|
117
114
|
#### Windows
|
|
@@ -122,73 +119,15 @@ On Windows, we recommend installing code-puppy as a global tool for the best exp
|
|
|
122
119
|
# Install UV if you don't have it (run in PowerShell as Admin)
|
|
123
120
|
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
|
124
121
|
|
|
125
|
-
|
|
126
|
-
uv tool install code-puppy
|
|
127
|
-
|
|
128
|
-
# Run code-puppy
|
|
129
|
-
code-puppy -i
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
**Why `uv tool install` on Windows?** Running with `uvx` creates an extra process layer that can interfere with keyboard signal handling (Ctrl+C, Ctrl+X). Installing as a tool runs code-puppy directly for reliable cancellation.
|
|
133
|
-
|
|
134
|
-
#### Upgrading
|
|
135
|
-
|
|
136
|
-
```bash
|
|
137
|
-
# Upgrade code-puppy to the latest version
|
|
138
|
-
uv tool upgrade code-puppy
|
|
139
|
-
|
|
140
|
-
# Or upgrade all installed tools
|
|
141
|
-
uv tool upgrade --all
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
UV will automatically download the latest compatible Python version (3.11+) if your system doesn't have one.
|
|
145
|
-
|
|
146
|
-
### pip (Alternative)
|
|
147
|
-
|
|
148
|
-
```bash
|
|
149
|
-
pip install code-puppy
|
|
122
|
+
uvx code-puppy
|
|
150
123
|
```
|
|
151
124
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
### Permanent Python Management
|
|
155
|
-
|
|
156
|
-
To make UV always use managed Python versions (recommended):
|
|
157
|
-
|
|
158
|
-
```bash
|
|
159
|
-
# Set environment variable permanently
|
|
160
|
-
echo 'export UV_MANAGED_PYTHON=1' >> ~/.zshrc # or ~/.bashrc
|
|
161
|
-
source ~/.zshrc # or ~/.bashrc
|
|
162
|
-
|
|
163
|
-
# Now all UV commands will prefer managed Python installations
|
|
164
|
-
uvx code-puppy # No need for --managed-python flag anymore
|
|
165
|
-
```
|
|
125
|
+
## Changelog (By Kittylog!)
|
|
166
126
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
```bash
|
|
170
|
-
# Check which Python UV will use
|
|
171
|
-
uv python find
|
|
172
|
-
|
|
173
|
-
# Or check the current project's Python
|
|
174
|
-
uv run python --version
|
|
175
|
-
```
|
|
127
|
+
[📋 View the full changelog on Kittylog](https://kittylog.app/c/mpfaffenberger/code_puppy)
|
|
176
128
|
|
|
177
129
|
## Usage
|
|
178
130
|
|
|
179
|
-
### Custom Commands
|
|
180
|
-
Create markdown files in `.claude/commands/`, `.github/prompts/`, or `.agents/commands/` to define custom slash commands. The filename becomes the command name and the content runs as a prompt.
|
|
181
|
-
|
|
182
|
-
```bash
|
|
183
|
-
# Create a custom command
|
|
184
|
-
echo "# Code Review
|
|
185
|
-
|
|
186
|
-
Please review this code for security issues." > .claude/commands/review.md
|
|
187
|
-
|
|
188
|
-
# Use it in Code Puppy
|
|
189
|
-
/review with focus on authentication
|
|
190
|
-
```
|
|
191
|
-
|
|
192
131
|
### Adding Models from models.dev 🆕
|
|
193
132
|
|
|
194
133
|
While there are several models configured right out of the box from providers like Synthetic, Cerebras, OpenAI, Google, and Anthropic, Code Puppy integrates with [models.dev](https://models.dev) to let you browse and add models from **65+ providers** with a single command:
|
|
@@ -256,6 +195,18 @@ The following environment variables control DBOS behavior:
|
|
|
256
195
|
- `DBOS_SYSTEM_DATABASE_URL`: Database URL used by DBOS. Can point to a local SQLite file or a Postgres instance. Example: `postgresql://postgres:dbos@localhost:5432/postgres`. Default: `dbos_store.sqlite` file in the config directory.
|
|
257
196
|
- `DBOS_APP_VERSION`: If set, Code Puppy uses it as the [DBOS application version](https://docs.dbos.dev/architecture#application-and-workflow-versions) and automatically tries to recover pending workflows for this version. Default: Code Puppy version + Unix timestamp in millisecond (disable automatic recovery).
|
|
258
197
|
|
|
198
|
+
### Custom Commands
|
|
199
|
+
Create markdown files in `.claude/commands/`, `.github/prompts/`, or `.agents/commands/` to define custom slash commands. The filename becomes the command name and the content runs as a prompt.
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Create a custom command
|
|
203
|
+
echo "# Code Review
|
|
204
|
+
|
|
205
|
+
Please review this code for security issues." > .claude/commands/review.md
|
|
206
|
+
|
|
207
|
+
# Use it in Code Puppy
|
|
208
|
+
/review with focus on authentication
|
|
209
|
+
```
|
|
259
210
|
|
|
260
211
|
## Requirements
|
|
261
212
|
|
|
@@ -275,9 +226,6 @@ For examples and more information about agent rules, visit [https://agent.md](ht
|
|
|
275
226
|
|
|
276
227
|
Use the `/mcp` command to manage MCP (list, start, stop, status, etc.)
|
|
277
228
|
|
|
278
|
-
Watch this video for examples! https://www.youtube.com/watch?v=1t1zEetOqlo
|
|
279
|
-
|
|
280
|
-
|
|
281
229
|
## Round Robin Model Distribution
|
|
282
230
|
|
|
283
231
|
Code Puppy supports **Round Robin model distribution** to help you overcome rate limits and distribute load across multiple AI models. This feature automatically cycles through configured models with each request, maximizing your API usage while staying within rate limits.
|
|
@@ -2,17 +2,17 @@ code_puppy/__init__.py,sha256=xMPewo9RNHb3yfFNIk5WCbv2cvSPtJOCgK2-GqLbNnU,373
|
|
|
2
2
|
code_puppy/__main__.py,sha256=pDVssJOWP8A83iFkxMLY9YteHYat0EyWDQqMkKHpWp4,203
|
|
3
3
|
code_puppy/callbacks.py,sha256=hqTV--dNxG5vwWWm3MrEjmb8MZuHFFdmHePl23NXPHk,8621
|
|
4
4
|
code_puppy/chatgpt_codex_client.py,sha256=Om0ANB_kpHubhCwNzF9ENf8RvKBqs0IYzBLl_SNw0Vk,9833
|
|
5
|
-
code_puppy/claude_cache_client.py,sha256=
|
|
6
|
-
code_puppy/cli_runner.py,sha256=
|
|
5
|
+
code_puppy/claude_cache_client.py,sha256=MLIRSJP428r9IK_aV6XyCXrCfQnNti32U60psPymLM4,14860
|
|
6
|
+
code_puppy/cli_runner.py,sha256=w5CLKgQYYaT7My3Cga2StXYol-u6DBxNzzUuhhsfhsA,34952
|
|
7
7
|
code_puppy/config.py,sha256=RlnrLkyFXm7h2Htf8rQA7vqoAyzLPMrESle417uLmFw,52373
|
|
8
8
|
code_puppy/error_logging.py,sha256=a80OILCUtJhexI6a9GM-r5LqIdjvSRzggfgPp2jv1X0,3297
|
|
9
9
|
code_puppy/gemini_code_assist.py,sha256=KGS7sO5OLc83nDF3xxS-QiU6vxW9vcm6hmzilu79Ef8,13867
|
|
10
|
-
code_puppy/http_utils.py,sha256=
|
|
10
|
+
code_puppy/http_utils.py,sha256=H3N5Qz2B1CcsGUYOycGWAqoNMr2P1NCVluKX3aRwRqI,10358
|
|
11
11
|
code_puppy/keymap.py,sha256=IvMkTlB_bIqOWpbTpmftkdyjhtD5todXuEIw1zCZ4u0,3584
|
|
12
12
|
code_puppy/main.py,sha256=82r3vZy_XcyEsenLn82BnUusaoyL3Bpm_Th_jKgqecE,273
|
|
13
|
-
code_puppy/model_factory.py,sha256=
|
|
13
|
+
code_puppy/model_factory.py,sha256=BSGHZlwtF7jkYz2qFG9oJglG-NnfmbsQXbx4I6stXW0,38313
|
|
14
14
|
code_puppy/model_utils.py,sha256=NU8W8NW5F7QS_PXHaLeh55Air1koUV7IVYFP7Rz3XpY,3615
|
|
15
|
-
code_puppy/models.json,sha256=
|
|
15
|
+
code_puppy/models.json,sha256=FMQdE_yvP_8y0xxt3K918UkFL9cZMYAqW1SfXcQkU_k,3105
|
|
16
16
|
code_puppy/models_dev_api.json,sha256=wHjkj-IM_fx1oHki6-GqtOoCrRMR0ScK0f-Iz0UEcy8,548187
|
|
17
17
|
code_puppy/models_dev_parser.py,sha256=8ndmWrsSyKbXXpRZPXc0w6TfWMuCcgaHiMifmlaBaPc,20611
|
|
18
18
|
code_puppy/pydantic_patches.py,sha256=YecAEeCOjSIwIBu2O5vEw72atMSL37cXGrbEuukI07o,4582
|
|
@@ -21,7 +21,7 @@ code_puppy/round_robin_model.py,sha256=kSawwPUiPgg0yg8r4AAVgvjzsWkptxpSORd75-HP7
|
|
|
21
21
|
code_puppy/session_storage.py,sha256=T4hOsAl9z0yz2JZCptjJBOnN8fCmkLZx5eLy1hTdv6Q,9631
|
|
22
22
|
code_puppy/status_display.py,sha256=qHzIQGAPEa2_-4gQSg7_rE1ihOosBq8WO73MWFNmmlo,8938
|
|
23
23
|
code_puppy/summarization_agent.py,sha256=6Pu_Wp_rF-HAhoX9u2uXTabRVkOZUYwRoMP1lzNS4ew,4485
|
|
24
|
-
code_puppy/terminal_utils.py,sha256=
|
|
24
|
+
code_puppy/terminal_utils.py,sha256=TaS19x7EZqudlBUAQwLMzBMNxBHBNInvQQREXqRGtkM,12984
|
|
25
25
|
code_puppy/uvx_detection.py,sha256=tP9X9Nvzow--KIqtqjgrHQkSxMJ3EevfoaeoB9VLY2o,7224
|
|
26
26
|
code_puppy/version_checker.py,sha256=aq2Mwxl1CR9sEFBgrPt3OQOowLOBUp9VaQYWJhuUv8Q,1780
|
|
27
27
|
code_puppy/agents/__init__.py,sha256=PtPB7Z5MSwmUKipgt_qxvIuGggcuVaYwNbnp1UP4tPc,518
|
|
@@ -40,18 +40,20 @@ code_puppy/agents/agent_qa_expert.py,sha256=5Ikb4U3SZQknUEfwlHZiyZXKqnffnOTQagr_
|
|
|
40
40
|
code_puppy/agents/agent_qa_kitten.py,sha256=5PeFFSwCFlTUvP6h5bGntx0xv5NmRwBiw0HnMqY8nLI,9107
|
|
41
41
|
code_puppy/agents/agent_security_auditor.py,sha256=SpiYNA0XAsIwBj7S2_EQPRslRUmF_-b89pIJyW7DYtY,12022
|
|
42
42
|
code_puppy/agents/agent_typescript_reviewer.py,sha256=vsnpp98xg6cIoFAEJrRTUM_i4wLEWGm5nJxs6fhHobM,10275
|
|
43
|
-
code_puppy/agents/base_agent.py,sha256=
|
|
43
|
+
code_puppy/agents/base_agent.py,sha256=zX7XPNgveBoBCm-SoRncwabnU0uSyEwtG3q-x8JFkiU,73256
|
|
44
|
+
code_puppy/agents/event_stream_handler.py,sha256=C1TDkp9eTHEFvnTQzaGFh_q9izL1r-EnCRTez9kqO2Y,11438
|
|
44
45
|
code_puppy/agents/json_agent.py,sha256=lhopDJDoiSGHvD8A6t50hi9ZBoNRKgUywfxd0Po_Dzc,4886
|
|
45
46
|
code_puppy/agents/prompt_reviewer.py,sha256=JJrJ0m5q0Puxl8vFsyhAbY9ftU9n6c6UxEVdNct1E-Q,5558
|
|
46
47
|
code_puppy/command_line/__init__.py,sha256=y7WeRemfYppk8KVbCGeAIiTuiOszIURCDjOMZv_YRmU,45
|
|
47
|
-
code_puppy/command_line/add_model_menu.py,sha256=
|
|
48
|
+
code_puppy/command_line/add_model_menu.py,sha256=CpURhxPvUhLHLBV_uwH1ODfJ-WAcGklvlsjEf5Vfvg4,43255
|
|
48
49
|
code_puppy/command_line/attachments.py,sha256=4Q5I2Es4j0ltnz5wjw2z0QXMsiMJvEfWRkPf_lJeITM,13093
|
|
49
|
-
code_puppy/command_line/autosave_menu.py,sha256=
|
|
50
|
+
code_puppy/command_line/autosave_menu.py,sha256=de7nOmFmEH6x5T7C95U8N8xgxxeF-l5lgaJzGJsF3ZY,19824
|
|
51
|
+
code_puppy/command_line/clipboard.py,sha256=oe9bfAX5RnT81FiYrDmhvHaePS1tAT-NFG1fSXubSD4,16869
|
|
50
52
|
code_puppy/command_line/colors_menu.py,sha256=LoFVfJ-Mo-Eq9hnb2Rj5mn7oBCnadAGr-8NNHsHlu18,17273
|
|
51
53
|
code_puppy/command_line/command_handler.py,sha256=CY9F27eovZJK_kpU1YmbroYLWGTCuouCOQ-TXfDp-nw,10916
|
|
52
54
|
code_puppy/command_line/command_registry.py,sha256=qFySsw1g8dol3kgi0p6cXrIDlP11_OhOoaQ5nAadWXg,4416
|
|
53
55
|
code_puppy/command_line/config_commands.py,sha256=qS9Cm758DPz2QGvHLhAV4Tp_Xfgo3PyoCoLDusbnmCw,25742
|
|
54
|
-
code_puppy/command_line/core_commands.py,sha256=
|
|
56
|
+
code_puppy/command_line/core_commands.py,sha256=ujAPD4yDbXwYGJJfR2u4ei24eBV-Ps_-BVBjFMEoJy0,27668
|
|
55
57
|
code_puppy/command_line/diff_menu.py,sha256=_Gr9SP9fbItk-08dya9WTAR53s_PlyAvEnbt-8VWKPk,24141
|
|
56
58
|
code_puppy/command_line/file_path_completion.py,sha256=gw8NpIxa6GOpczUJRyh7VNZwoXKKn-yvCqit7h2y6Gg,2931
|
|
57
59
|
code_puppy/command_line/load_context_completion.py,sha256=a3JvLDeLLSYxVgTjAdqWzS4spjv6ccCrK2LKZgVJ1IM,2202
|
|
@@ -59,21 +61,20 @@ code_puppy/command_line/mcp_completion.py,sha256=eKzW2O7gun7HoHekOW0XVXhNS5J2xCt
|
|
|
59
61
|
code_puppy/command_line/model_picker_completion.py,sha256=nDnlf0qFCG2zAm_mWW2eMYwVC7eROVQrFe92hZqOKa8,6810
|
|
60
62
|
code_puppy/command_line/model_settings_menu.py,sha256=AI97IusDgMmWoCOp7C0Yrk_Uy6M9cmVhoZfVWgFWwXg,32392
|
|
61
63
|
code_puppy/command_line/motd.py,sha256=XuIk3UTLawwVFM-NfoaJGU5F2hPLASTFXq84UdDMT0Q,2408
|
|
62
|
-
code_puppy/command_line/onboarding_slides.py,sha256=
|
|
64
|
+
code_puppy/command_line/onboarding_slides.py,sha256=itqAsuHzjHpD_XNz6FniBIYr6dNyP1AW_XQZQ6SbVek,7125
|
|
63
65
|
code_puppy/command_line/onboarding_wizard.py,sha256=U5lV_1P3IwDYZUHar0zKgdp121zzkvOwwORvdCZwFcw,10241
|
|
64
66
|
code_puppy/command_line/pin_command_completion.py,sha256=juSvdqRpk7AdfkPy1DJx5NzfEUU5KYGlChvP0hisM18,11667
|
|
65
|
-
code_puppy/command_line/prompt_toolkit_completion.py,sha256=
|
|
67
|
+
code_puppy/command_line/prompt_toolkit_completion.py,sha256=49GM3jVE89G1M3XroMZk2LhGgXpOO8XZ0Sg8h4a6LLw,32806
|
|
66
68
|
code_puppy/command_line/session_commands.py,sha256=Jh8GGfhlfBAEVfucKLbcZjNaXYd0twImiOwq2ZnGdQQ,9902
|
|
67
|
-
code_puppy/command_line/utils.py,sha256=
|
|
69
|
+
code_puppy/command_line/utils.py,sha256=_upMrrmDp5hteUjrRiEgVR6SoeNEPNZGXb5lOWYqcUQ,2952
|
|
68
70
|
code_puppy/command_line/mcp/__init__.py,sha256=0-OQuwjq_pLiTVJ1_NrirVwdRerghyKs_MTZkwPC7YY,315
|
|
69
|
-
code_puppy/command_line/mcp/add_command.py,sha256=iWqHReWbVOO3kuPE4NTMs3dv_BluxTBaasDPm9P1lU0,5892
|
|
70
71
|
code_puppy/command_line/mcp/base.py,sha256=pPeNnSyM0GGqD6mhYN-qA22rAT9bEapxliwH_YiIu3Q,823
|
|
71
|
-
code_puppy/command_line/mcp/catalog_server_installer.py,sha256=
|
|
72
|
-
code_puppy/command_line/mcp/custom_server_form.py,sha256=
|
|
73
|
-
code_puppy/command_line/mcp/custom_server_installer.py,sha256=
|
|
72
|
+
code_puppy/command_line/mcp/catalog_server_installer.py,sha256=G9FvQPTBB4LeJ4cOR9DvIkp82mClKRKI35KELbFLCKU,6181
|
|
73
|
+
code_puppy/command_line/mcp/custom_server_form.py,sha256=z0hsqXY1_ScJoacneyfrFHeVUlU3ZUHYt6CXV1wnJ0Y,23733
|
|
74
|
+
code_puppy/command_line/mcp/custom_server_installer.py,sha256=oLB5j07XKApdTrCDlY97GxE1NHrqupsX6DOCXzFj3TE,5744
|
|
74
75
|
code_puppy/command_line/mcp/edit_command.py,sha256=_WxxpaTgxo9pbvMogG9yvh2mcLE5SYf0Qbi8a8IpZ0k,4603
|
|
75
|
-
code_puppy/command_line/mcp/handler.py,sha256=
|
|
76
|
-
code_puppy/command_line/mcp/help_command.py,sha256=
|
|
76
|
+
code_puppy/command_line/mcp/handler.py,sha256=jwhcLi28QQ6IuE6E5IsMbU67jMZChfZW96hG9ezYgN4,4547
|
|
77
|
+
code_puppy/command_line/mcp/help_command.py,sha256=sTWecPqmmq6vmLVgZVNjBXKnziCLoJSKsugHkxiJlTI,5285
|
|
77
78
|
code_puppy/command_line/mcp/install_command.py,sha256=lmUyMUWtkGuy1SOQRHjQgt8mD3t1agVMQfEL5_TOzTM,8364
|
|
78
79
|
code_puppy/command_line/mcp/install_menu.py,sha256=GVNR7SJbheGLFc_r9N3CT1AT024ptzsEcj1cRnp4U3g,24769
|
|
79
80
|
code_puppy/command_line/mcp/list_command.py,sha256=UKQFPlhT9qGMCyG5VKjvnSMzDDtfAhIaKU_eErgZJDg,3181
|
|
@@ -82,7 +83,7 @@ code_puppy/command_line/mcp/remove_command.py,sha256=hyU_tKJWfyLnmufrFVLwlF0qFEb
|
|
|
82
83
|
code_puppy/command_line/mcp/restart_command.py,sha256=w5EcDac09iCvPBAR0u2M5KSIhASqTu5uZwsjCJ4JLhk,3588
|
|
83
84
|
code_puppy/command_line/mcp/search_command.py,sha256=mDkSz_KjPbvlO9U7oYUKJlqqY4QM90gWKO2xsH2i3SA,4244
|
|
84
85
|
code_puppy/command_line/mcp/start_all_command.py,sha256=_TVrjRR_oqJVS6qQaHssS0V_3342av1h9gz-Fxwa-Dw,4667
|
|
85
|
-
code_puppy/command_line/mcp/start_command.py,sha256=
|
|
86
|
+
code_puppy/command_line/mcp/start_command.py,sha256=XhuhyMpuo2Bkp53qxvZBSM8yRGatcwY8m-DXcQBHAZc,4344
|
|
86
87
|
code_puppy/command_line/mcp/status_command.py,sha256=NCyjFlBMURQ39T3G2dTPbyJdNC6X14FyWFzVh4BBnig,6657
|
|
87
88
|
code_puppy/command_line/mcp/stop_all_command.py,sha256=33mRvxd2cBbTXE6BSkSzFmdDOT4yCxwGEDrHczqpavw,3864
|
|
88
89
|
code_puppy/command_line/mcp/stop_command.py,sha256=iMzk9h6NuUDg0hhI5eDLem5VS8IwBC7xg8AU-7jsmBE,2679
|
|
@@ -90,7 +91,7 @@ code_puppy/command_line/mcp/test_command.py,sha256=eV8u5KKClRK1M2_os1zA78b9TDuYU
|
|
|
90
91
|
code_puppy/command_line/mcp/utils.py,sha256=0Wt4ttYgSlVvtusYmBLKXSkjAjcsDiUxcZQAoFLUNnE,3625
|
|
91
92
|
code_puppy/command_line/mcp/wizard_utils.py,sha256=M5X8RchkQujKYKORsXJnUq2kJHzmNfutIUrsHmfzi7k,11126
|
|
92
93
|
code_puppy/mcp_/__init__.py,sha256=P9bmVX5UDmzQDqHMylOxuo5Hi82E30pPSMOYw8lEx7Q,1781
|
|
93
|
-
code_puppy/mcp_/async_lifecycle.py,sha256=
|
|
94
|
+
code_puppy/mcp_/async_lifecycle.py,sha256=XVB73WOc2_sWi0ySWh_h6n5a-xtt72BGvtajyeoKW20,9014
|
|
94
95
|
code_puppy/mcp_/blocking_startup.py,sha256=27R2wwLVDu5i19IP90KmCn_zHrvVcHVNU8d9c8EcTeI,14780
|
|
95
96
|
code_puppy/mcp_/captured_stdio_server.py,sha256=t_mnCjtiopRsyi4Aa97rFzDVxEQmb-u94sWJsj2FP8k,8925
|
|
96
97
|
code_puppy/mcp_/circuit_breaker.py,sha256=a83YwXux9h4R6zBWBUrCIqtp2ffyl7JZEoK2tErG_0I,8601
|
|
@@ -98,8 +99,8 @@ code_puppy/mcp_/config_wizard.py,sha256=JNNpgnSD6PFSyS3pTdEdD164oXd2VKp4VHLSz3To
|
|
|
98
99
|
code_puppy/mcp_/dashboard.py,sha256=VtaFxLtPnbM_HL2TXRDAg6IqcM-EcFkoghGgkfhMrKI,9417
|
|
99
100
|
code_puppy/mcp_/error_isolation.py,sha256=mpPBiH17zTXPsOEAn9WmkbwQwnt4gmgiaWv87JBJbUo,12426
|
|
100
101
|
code_puppy/mcp_/health_monitor.py,sha256=n5R6EeYOYbUucUFe74qGWCU3g6Mep5UEQbLF0wbT0dU,19688
|
|
101
|
-
code_puppy/mcp_/managed_server.py,sha256=
|
|
102
|
-
code_puppy/mcp_/manager.py,sha256=
|
|
102
|
+
code_puppy/mcp_/managed_server.py,sha256=e-DetKb3bVgdLYw7miTptLAbqhRgZ1cNoTGS0fh4Noo,15371
|
|
103
|
+
code_puppy/mcp_/manager.py,sha256=_2ZRTLS8Sf3SMgEpAHl-wXBDYVqg2l-j9uI9EkfCNaE,31062
|
|
103
104
|
code_puppy/mcp_/mcp_logs.py,sha256=o4pSHwELWIjEjqhfaMMEGrBvb159-VIgUp21E707BPo,6264
|
|
104
105
|
code_puppy/mcp_/registry.py,sha256=U_t12WQ-En-KGyZoiTYdqlhp9NkDTWafu8g5InvF2NM,15774
|
|
105
106
|
code_puppy/mcp_/retry_manager.py,sha256=evVxbtrsHNyo8UoI7zpO-NVDegibn82RLlgN8VKewA8,10665
|
|
@@ -111,11 +112,11 @@ code_puppy/messaging/__init__.py,sha256=THJQDdRub3jiWIRPqF34VggXem3Y2tuUFAJGdDAL
|
|
|
111
112
|
code_puppy/messaging/bus.py,sha256=TbdltJ0D5tqnaE4irq1fcXllDYm-mQ_SiX1IFm-S4sw,21406
|
|
112
113
|
code_puppy/messaging/commands.py,sha256=77CtKVNaF5KS3Xyzd0ccDAisZWQxL3weVEt3J-SfYxo,5464
|
|
113
114
|
code_puppy/messaging/markdown_patches.py,sha256=dMIJozzJChuHa8QNMSEz_kC-dyt7kZiDLZ7rjthbcmg,1626
|
|
114
|
-
code_puppy/messaging/message_queue.py,sha256=
|
|
115
|
-
code_puppy/messaging/messages.py,sha256=
|
|
115
|
+
code_puppy/messaging/message_queue.py,sha256=1-5NFWIes5kpecsKnhuQQJPeT0-X102Xi1-IwXUM5_Y,11430
|
|
116
|
+
code_puppy/messaging/messages.py,sha256=F7RwMHeQrIk-8kuSSBU76wBq1NGuLb2H5cJrSMTC3XM,16464
|
|
116
117
|
code_puppy/messaging/queue_console.py,sha256=T0U_V1tdN6hd9DLokp-HCk0mhu8Ivpfajha368CBZrU,9983
|
|
117
118
|
code_puppy/messaging/renderers.py,sha256=GHVtMnxE1pJ-yrcRjacY81JcjlHRz3UVHzp-ohN-CGE,12058
|
|
118
|
-
code_puppy/messaging/rich_renderer.py,sha256=
|
|
119
|
+
code_puppy/messaging/rich_renderer.py,sha256=FiT1e5S8nNQte0E6CMFQ3KyTixadkgKSjp1hcZXtyOE,37892
|
|
119
120
|
code_puppy/messaging/spinner/__init__.py,sha256=KpK5tJqq9YnN3wklqvdH0BQmuwYnT83Mp4tPfQa9RqI,1664
|
|
120
121
|
code_puppy/messaging/spinner/console_spinner.py,sha256=YIReuWPD01YPy58FqWdMDWj2QhauTUxKo675Ub4-eDA,8451
|
|
121
122
|
code_puppy/messaging/spinner/spinner_base.py,sha256=JiQDAhCfwrWUFunb8Xcj1caEl34JJY7Bcio7mDeckSc,2694
|
|
@@ -123,7 +124,7 @@ code_puppy/plugins/__init__.py,sha256=gWgrXWoFpl-3Mxz2DAvxKW6SkCWrOnw-hKsY9O7nHc
|
|
|
123
124
|
code_puppy/plugins/oauth_puppy_html.py,sha256=Wpa-V_NlRiBAvo_OXHuR7wvOH_jSt8L9HSFGiab6xI0,13058
|
|
124
125
|
code_puppy/plugins/antigravity_oauth/__init__.py,sha256=1miHihSqRNXO20Vh_Gn9M3Aa2szh0gtdSCaKKj9nq0Q,362
|
|
125
126
|
code_puppy/plugins/antigravity_oauth/accounts.py,sha256=GQit2-K24bsopmTZyscFUq3M0cAEO5WutHWnipVdgz8,14304
|
|
126
|
-
code_puppy/plugins/antigravity_oauth/antigravity_model.py,sha256=
|
|
127
|
+
code_puppy/plugins/antigravity_oauth/antigravity_model.py,sha256=g0_nXnMg288CvBE48CFgZ-iAqlYbtbi1dcB4Up6cYYc,26115
|
|
127
128
|
code_puppy/plugins/antigravity_oauth/config.py,sha256=BoQgqf5I2XoHWnBBo9vhCIc_XwPj9Mbp0Z95ygWwt78,1362
|
|
128
129
|
code_puppy/plugins/antigravity_oauth/constants.py,sha256=qsrA10JJvzNuY0OobvvwCQcoGpILBninllcUUMKkUrQ,4644
|
|
129
130
|
code_puppy/plugins/antigravity_oauth/oauth.py,sha256=ZHXJtZP63l6brOpX1WdLfuUClIleA79-4y36YUJc6Wo,15137
|
|
@@ -145,7 +146,7 @@ code_puppy/plugins/claude_code_oauth/__init__.py,sha256=mCcOU-wM7LNCDjr-w-WLPzom
|
|
|
145
146
|
code_puppy/plugins/claude_code_oauth/config.py,sha256=DjGySCkvjSGZds6DYErLMAi3TItt8iSLGvyJN98nSEM,2013
|
|
146
147
|
code_puppy/plugins/claude_code_oauth/register_callbacks.py,sha256=g8sl-i7jIOF6OFALeaLqTF3mS4tD8GR_FCzvPjVw2js,10165
|
|
147
148
|
code_puppy/plugins/claude_code_oauth/test_plugin.py,sha256=yQy4EeZl4bjrcog1d8BjknoDTRK75mRXXvkSQJYSSEM,9286
|
|
148
|
-
code_puppy/plugins/claude_code_oauth/utils.py,sha256=
|
|
149
|
+
code_puppy/plugins/claude_code_oauth/utils.py,sha256=TVgz5aFd2GFPHSiG9NnOYiw-y6KRkWwt_SZxmMpwMIY,17243
|
|
149
150
|
code_puppy/plugins/customizable_commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
150
151
|
code_puppy/plugins/customizable_commands/register_callbacks.py,sha256=zVMfIzr--hVn0IOXxIicbmgj2s-HZUgtrOc0NCDOnDw,5183
|
|
151
152
|
code_puppy/plugins/example_custom_command/README.md,sha256=5c5Zkm7CW6BDSfe3WoLU7GW6t5mjjYAbu9-_pu-b3p4,8244
|
|
@@ -158,9 +159,9 @@ code_puppy/plugins/shell_safety/command_cache.py,sha256=adYtSPNVOZfW_6dQdtEihO6E
|
|
|
158
159
|
code_puppy/plugins/shell_safety/register_callbacks.py,sha256=W3v664RR48Fdbbbltf_NnX22_Ahw2AvAOtvXvWc7KxQ,7322
|
|
159
160
|
code_puppy/prompts/codex_system_prompt.md,sha256=hEFTCziroLqZmqNle5kG34A8kvTteOWezCiVrAEKhE0,24400
|
|
160
161
|
code_puppy/tools/__init__.py,sha256=BVTZ85jLHgDANwOnUSOz3UDlp8VQDq4DoGF23BRlyWw,6032
|
|
161
|
-
code_puppy/tools/agent_tools.py,sha256=
|
|
162
|
-
code_puppy/tools/command_runner.py,sha256=
|
|
163
|
-
code_puppy/tools/common.py,sha256=
|
|
162
|
+
code_puppy/tools/agent_tools.py,sha256=pRIzGH8jJjlg1XiMrQn_kn0OzUfsCq4EWTuISD2D6hQ,23393
|
|
163
|
+
code_puppy/tools/command_runner.py,sha256=3qXVnVTaBPia6y2D29As47_TRKgpyCj82yMFK-8UUYc,44954
|
|
164
|
+
code_puppy/tools/common.py,sha256=IYf-KOcP5eN2MwTlpULSXNATn7GzloAKl7_M1Uyfe4Y,40360
|
|
164
165
|
code_puppy/tools/file_modifications.py,sha256=vz9n7R0AGDSdLUArZr_55yJLkyI30M8zreAppxIx02M,29380
|
|
165
166
|
code_puppy/tools/file_operations.py,sha256=CqhpuBnOFOcQCIYXOujskxq2VMLWYJhibYrH0YcPSfA,35692
|
|
166
167
|
code_puppy/tools/tools_content.py,sha256=bsBqW-ppd1XNAS_g50B3UHDQBWEALC1UneH6-afz1zo,2365
|
|
@@ -174,10 +175,10 @@ code_puppy/tools/browser/browser_scripts.py,sha256=sNb8eLEyzhasy5hV4B9OjM8yIVMLV
|
|
|
174
175
|
code_puppy/tools/browser/browser_workflows.py,sha256=nitW42vCf0ieTX1gLabozTugNQ8phtoFzZbiAhw1V90,6491
|
|
175
176
|
code_puppy/tools/browser/camoufox_manager.py,sha256=RZjGOEftE5sI_tsercUyXFSZI2wpStXf-q0PdYh2G3I,8680
|
|
176
177
|
code_puppy/tools/browser/vqa_agent.py,sha256=DBn9HKloILqJSTSdNZzH_PYWT0B2h9VwmY6akFQI_uU,2913
|
|
177
|
-
code_puppy-0.0.
|
|
178
|
-
code_puppy-0.0.
|
|
179
|
-
code_puppy-0.0.
|
|
180
|
-
code_puppy-0.0.
|
|
181
|
-
code_puppy-0.0.
|
|
182
|
-
code_puppy-0.0.
|
|
183
|
-
code_puppy-0.0.
|
|
178
|
+
code_puppy-0.0.348.data/data/code_puppy/models.json,sha256=FMQdE_yvP_8y0xxt3K918UkFL9cZMYAqW1SfXcQkU_k,3105
|
|
179
|
+
code_puppy-0.0.348.data/data/code_puppy/models_dev_api.json,sha256=wHjkj-IM_fx1oHki6-GqtOoCrRMR0ScK0f-Iz0UEcy8,548187
|
|
180
|
+
code_puppy-0.0.348.dist-info/METADATA,sha256=jDNlXNr6nSsNNf8O2QJCuRlD9rZWGOV-fU-iZPt4kF0,27550
|
|
181
|
+
code_puppy-0.0.348.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
182
|
+
code_puppy-0.0.348.dist-info/entry_points.txt,sha256=Tp4eQC99WY3HOKd3sdvb22vZODRq0XkZVNpXOag_KdI,91
|
|
183
|
+
code_puppy-0.0.348.dist-info/licenses/LICENSE,sha256=31u8x0SPgdOq3izJX41kgFazWsM43zPEF9eskzqbJMY,1075
|
|
184
|
+
code_puppy-0.0.348.dist-info/RECORD,,
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
MCP Add Command - Adds new MCP servers from JSON configuration or wizard.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import json
|
|
6
|
-
import logging
|
|
7
|
-
import os
|
|
8
|
-
from typing import List, Optional
|
|
9
|
-
|
|
10
|
-
from code_puppy.messaging import emit_error, emit_info
|
|
11
|
-
|
|
12
|
-
from .base import MCPCommandBase
|
|
13
|
-
from .wizard_utils import run_interactive_install_wizard
|
|
14
|
-
|
|
15
|
-
# Configure logging
|
|
16
|
-
logger = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class AddCommand(MCPCommandBase):
|
|
20
|
-
"""
|
|
21
|
-
Command handler for adding MCP servers.
|
|
22
|
-
|
|
23
|
-
Adds new MCP servers from JSON configuration or interactive wizard.
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
def execute(self, args: List[str], group_id: Optional[str] = None) -> None:
|
|
27
|
-
"""
|
|
28
|
-
Add a new MCP server from JSON configuration or launch wizard.
|
|
29
|
-
|
|
30
|
-
Usage:
|
|
31
|
-
/mcp add - Launch interactive wizard
|
|
32
|
-
/mcp add <json> - Add server from JSON config
|
|
33
|
-
|
|
34
|
-
Example JSON:
|
|
35
|
-
/mcp add {"name": "test", "type": "stdio", "command": "echo", "args": ["hello"]}
|
|
36
|
-
|
|
37
|
-
Args:
|
|
38
|
-
args: Command arguments - JSON config or empty for wizard
|
|
39
|
-
group_id: Optional message group ID for grouping related messages
|
|
40
|
-
"""
|
|
41
|
-
if group_id is None:
|
|
42
|
-
group_id = self.generate_group_id()
|
|
43
|
-
|
|
44
|
-
try:
|
|
45
|
-
if args:
|
|
46
|
-
# Parse JSON from arguments
|
|
47
|
-
json_str = " ".join(args)
|
|
48
|
-
|
|
49
|
-
try:
|
|
50
|
-
config_dict = json.loads(json_str)
|
|
51
|
-
except json.JSONDecodeError as e:
|
|
52
|
-
emit_info(f"Invalid JSON: {e}", message_group=group_id)
|
|
53
|
-
emit_info(
|
|
54
|
-
"Usage: /mcp add <json> or /mcp add (for wizard)",
|
|
55
|
-
message_group=group_id,
|
|
56
|
-
)
|
|
57
|
-
emit_info(
|
|
58
|
-
'Example: /mcp add {"name": "test", "type": "stdio", "command": "echo"}',
|
|
59
|
-
message_group=group_id,
|
|
60
|
-
)
|
|
61
|
-
return
|
|
62
|
-
|
|
63
|
-
# Validate required fields
|
|
64
|
-
if "name" not in config_dict:
|
|
65
|
-
emit_info("Missing required field: 'name'", message_group=group_id)
|
|
66
|
-
return
|
|
67
|
-
if "type" not in config_dict:
|
|
68
|
-
emit_info("Missing required field: 'type'", message_group=group_id)
|
|
69
|
-
return
|
|
70
|
-
|
|
71
|
-
# Add the server
|
|
72
|
-
success = self._add_server_from_json(config_dict, group_id)
|
|
73
|
-
|
|
74
|
-
if success:
|
|
75
|
-
# Reload MCP servers
|
|
76
|
-
try:
|
|
77
|
-
from code_puppy.agent import reload_mcp_servers
|
|
78
|
-
|
|
79
|
-
reload_mcp_servers()
|
|
80
|
-
except ImportError:
|
|
81
|
-
pass
|
|
82
|
-
|
|
83
|
-
emit_info(
|
|
84
|
-
"Use '/mcp list' to see all servers", message_group=group_id
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
else:
|
|
88
|
-
# No arguments - launch interactive wizard with server templates
|
|
89
|
-
success = run_interactive_install_wizard(self.manager, group_id)
|
|
90
|
-
|
|
91
|
-
if success:
|
|
92
|
-
# Reload the agent to pick up new server
|
|
93
|
-
try:
|
|
94
|
-
from code_puppy.agent import reload_mcp_servers
|
|
95
|
-
|
|
96
|
-
reload_mcp_servers()
|
|
97
|
-
except ImportError:
|
|
98
|
-
pass
|
|
99
|
-
|
|
100
|
-
except ImportError as e:
|
|
101
|
-
logger.error(f"Failed to import: {e}")
|
|
102
|
-
emit_info("Required module not available", message_group=group_id)
|
|
103
|
-
except Exception as e:
|
|
104
|
-
logger.error(f"Error in add command: {e}")
|
|
105
|
-
emit_error(f"Error adding server: {e}", message_group=group_id)
|
|
106
|
-
|
|
107
|
-
def _add_server_from_json(self, config_dict: dict, group_id: str) -> bool:
|
|
108
|
-
"""
|
|
109
|
-
Add a server from JSON configuration.
|
|
110
|
-
|
|
111
|
-
Args:
|
|
112
|
-
config_dict: Server configuration dictionary
|
|
113
|
-
group_id: Message group ID
|
|
114
|
-
|
|
115
|
-
Returns:
|
|
116
|
-
True if successful, False otherwise
|
|
117
|
-
"""
|
|
118
|
-
try:
|
|
119
|
-
from code_puppy.config import MCP_SERVERS_FILE
|
|
120
|
-
from code_puppy.mcp_.managed_server import ServerConfig
|
|
121
|
-
|
|
122
|
-
# Extract required fields
|
|
123
|
-
name = config_dict.pop("name")
|
|
124
|
-
server_type = config_dict.pop("type")
|
|
125
|
-
enabled = config_dict.pop("enabled", True)
|
|
126
|
-
|
|
127
|
-
# Everything else goes into config
|
|
128
|
-
server_config = ServerConfig(
|
|
129
|
-
id=f"{name}_{hash(name)}",
|
|
130
|
-
name=name,
|
|
131
|
-
type=server_type,
|
|
132
|
-
enabled=enabled,
|
|
133
|
-
config=config_dict, # Remaining fields are server-specific config
|
|
134
|
-
)
|
|
135
|
-
|
|
136
|
-
# Register the server
|
|
137
|
-
server_id = self.manager.register_server(server_config)
|
|
138
|
-
|
|
139
|
-
if not server_id:
|
|
140
|
-
emit_info(f"Failed to add server '{name}'", message_group=group_id)
|
|
141
|
-
return False
|
|
142
|
-
|
|
143
|
-
emit_info(
|
|
144
|
-
f"✅ Added server '{name}' (ID: {server_id})", message_group=group_id
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
# Save to mcp_servers.json for persistence
|
|
148
|
-
if os.path.exists(MCP_SERVERS_FILE):
|
|
149
|
-
with open(MCP_SERVERS_FILE, "r") as f:
|
|
150
|
-
data = json.load(f)
|
|
151
|
-
servers = data.get("mcp_servers", {})
|
|
152
|
-
else:
|
|
153
|
-
servers = {}
|
|
154
|
-
data = {"mcp_servers": servers}
|
|
155
|
-
|
|
156
|
-
# Add new server
|
|
157
|
-
servers[name] = config_dict.copy()
|
|
158
|
-
servers[name]["type"] = server_type
|
|
159
|
-
|
|
160
|
-
# Save back
|
|
161
|
-
os.makedirs(os.path.dirname(MCP_SERVERS_FILE), exist_ok=True)
|
|
162
|
-
with open(MCP_SERVERS_FILE, "w") as f:
|
|
163
|
-
json.dump(data, f, indent=2)
|
|
164
|
-
|
|
165
|
-
return True
|
|
166
|
-
|
|
167
|
-
except Exception as e:
|
|
168
|
-
logger.error(f"Error adding server from JSON: {e}")
|
|
169
|
-
emit_error(f"Failed to add server: {e}", message_group=group_id)
|
|
170
|
-
return False
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|