ollama-coding-agent 0.2.0__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/PKG-INFO +31 -26
  2. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/PYPI_README.md +30 -25
  3. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/README.md +36 -26
  4. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/mcp_client.py +17 -1
  5. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/ollama_coding_agent.egg-info/PKG-INFO +31 -26
  6. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/pyproject.toml +1 -1
  7. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/LICENSE +0 -0
  8. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/__init__.py +0 -0
  9. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/__main__.py +0 -0
  10. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/agent.py +0 -0
  11. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/cli.py +0 -0
  12. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/config.py +0 -0
  13. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/intent.py +0 -0
  14. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/mcp_server.py +0 -0
  15. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/ollama_client.py +0 -0
  16. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/session_store.py +0 -0
  17. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/tools.py +0 -0
  18. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/coding_agent/ui.py +0 -0
  19. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/ollama_coding_agent.egg-info/SOURCES.txt +0 -0
  20. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/ollama_coding_agent.egg-info/dependency_links.txt +0 -0
  21. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/ollama_coding_agent.egg-info/entry_points.txt +0 -0
  22. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/ollama_coding_agent.egg-info/requires.txt +0 -0
  23. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/ollama_coding_agent.egg-info/top_level.txt +0 -0
  24. {ollama_coding_agent-0.2.0 → ollama_coding_agent-0.4.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ollama-coding-agent
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: AI coding agent driving Qwen Coder (or any Ollama-compatible model) through a scoped toolset via MCP
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/HarryChen1995/coding_agent
@@ -82,31 +82,36 @@ in-process — the agent is an MCP *client* that talks to a tool server over
82
82
  stdio:
83
83
 
84
84
  ```
85
- ┌───────────┐ ┌────────────┐ ┌──────────────┐
86
- CLI/REPL │ --> │ agent loop │ --> │ intent parser│
87
- └───────────┘ │ (call model│ │ (task -> │
88
- │ approve, │ │ structured │
89
- │ execute, │ │ intent) │
90
- │ persist) │ └──────────────┘
91
- └─────┬──────┘
92
- ┌────────────────┼─────────────────┐
93
- ▼ ▼ ▼
94
- ┌───────────────┐ ┌───────────────┐ ┌───────────────────┐
95
- │ model client │ │ MCP client │ │ session store │
96
- │ (chat calls) │ │ (MCP session) │ │ (SQLite history) │
97
- └───────────────┘ └───────┬───────┘ └───────────────────┘
98
- stdio subprocess
99
-
100
- ┌───────────────┐
101
- │ MCP server │
102
- └───────┬───────┘
103
-
104
- ┌───────────────┐
105
- │ tools │
106
- (read/write/ │
107
- │ edit/search/ │
108
- │ shell) │
109
- └───────────────┘
85
+ +-----------------------------+
86
+ | CLI / REPL |
87
+ +-----------------------------+
88
+ |
89
+ v
90
+ +-----------------------------+
91
+ | Agent loop |
92
+ | parse intent, call model, |
93
+ | approve, execute, persist |
94
+ +-----------------------------+
95
+ |
96
+ v
97
+ +-----------------------------+
98
+ | MCP client |
99
+ | built-in + custom servers |
100
+ | merged into one tool list |
101
+ +-----------------------------+
102
+ |
103
+ stdio / SSE / streamable-http
104
+ v
105
+ +-----------------------------+
106
+ | MCP server(s) |
107
+ +-----------------------------+
108
+ |
109
+ v
110
+ +-----------------------------+
111
+ | Tools |
112
+ | read / write / edit / |
113
+ | search / shell |
114
+ +-----------------------------+
110
115
  ```
111
116
 
112
117
  Because tools are exposed over MCP, any MCP-compatible client — Claude
@@ -61,31 +61,36 @@ in-process — the agent is an MCP *client* that talks to a tool server over
61
61
  stdio:
62
62
 
63
63
  ```
64
- ┌───────────┐ ┌────────────┐ ┌──────────────┐
65
- CLI/REPL │ --> │ agent loop │ --> │ intent parser│
66
- └───────────┘ │ (call model│ │ (task -> │
67
- │ approve, │ │ structured │
68
- │ execute, │ │ intent) │
69
- │ persist) │ └──────────────┘
70
- └─────┬──────┘
71
- ┌────────────────┼─────────────────┐
72
- ▼ ▼ ▼
73
- ┌───────────────┐ ┌───────────────┐ ┌───────────────────┐
74
- │ model client │ │ MCP client │ │ session store │
75
- │ (chat calls) │ │ (MCP session) │ │ (SQLite history) │
76
- └───────────────┘ └───────┬───────┘ └───────────────────┘
77
- stdio subprocess
78
-
79
- ┌───────────────┐
80
- │ MCP server │
81
- └───────┬───────┘
82
-
83
- ┌───────────────┐
84
- │ tools │
85
- (read/write/ │
86
- │ edit/search/ │
87
- │ shell) │
88
- └───────────────┘
64
+ +-----------------------------+
65
+ | CLI / REPL |
66
+ +-----------------------------+
67
+ |
68
+ v
69
+ +-----------------------------+
70
+ | Agent loop |
71
+ | parse intent, call model, |
72
+ | approve, execute, persist |
73
+ +-----------------------------+
74
+ |
75
+ v
76
+ +-----------------------------+
77
+ | MCP client |
78
+ | built-in + custom servers |
79
+ | merged into one tool list |
80
+ +-----------------------------+
81
+ |
82
+ stdio / SSE / streamable-http
83
+ v
84
+ +-----------------------------+
85
+ | MCP server(s) |
86
+ +-----------------------------+
87
+ |
88
+ v
89
+ +-----------------------------+
90
+ | Tools |
91
+ | read / write / edit / |
92
+ | search / shell |
93
+ +-----------------------------+
89
94
  ```
90
95
 
91
96
  Because tools are exposed over MCP, any MCP-compatible client — Claude
@@ -162,32 +162,42 @@ converts it to Ollama's function-calling schema, and calls tools through the
162
162
  MCP session instead of Python function calls directly.
163
163
 
164
164
  ```
165
- ┌───────────┐ ┌────────────┐ ┌──────────────┐
166
- cli.py --> │ agent.py │ --> │ intent.py │
167
- │ (Typer │ │ (call model│ │ (task -> │
168
- │ CLI/REPL)│ │ approve, │ │ structured │
169
- └───────────┘ │ execute, │ │ intent) │
170
- │ persist) │ └──────────────┘
171
- └─────┬──────┘
172
- ┌────────────────┼─────────────────┐
173
- ▼ ▼ ▼
174
- ┌───────────────┐ ┌───────────────┐ ┌───────────────────┐
175
- │ollama_client.py│ │ mcp_client.py │ │ session_store.py │
176
- │ (model calls) │ │ (MCP session) │ │ (SQLite history) │
177
- └───────────────┘ └───────┬───────┘ └───────────────────┘
178
- stdio subprocess
179
-
180
- ┌───────────────┐
181
- │ mcp_server.py │
182
- └───────┬───────┘
183
-
184
- ┌───────────────┐
185
- │ tools.py │
186
- (read/write/ │
187
- │ edit/shell, │
188
- │ scoped to │
189
- project root)
190
- └───────────────┘
165
+ +------------------------------------------+
166
+ | cli.py (Typer CLI / REPL) |
167
+ +------------------------------------------+
168
+ |
169
+ v
170
+ +------------------------------------------+
171
+ | agent.py |
172
+ | call model, parse intent, approve, |
173
+ | execute tools, persist, repeat |
174
+ +------------------------------------------+
175
+ |
176
+ v
177
+ +------------------------------------------+
178
+ | ollama_client.py (model calls) |
179
+ | session_store.py (SQLite history) |
180
+ +------------------------------------------+
181
+ |
182
+ v
183
+ +------------------------------------------+
184
+ | mcp_client.py |
185
+ | built-in + custom servers merged |
186
+ | into one namespaced tool list |
187
+ +------------------------------------------+
188
+ |
189
+ stdio / SSE / streamable-http
190
+ v
191
+ +------------------------------------------+
192
+ | mcp_server.py / custom MCP server(s) |
193
+ +------------------------------------------+
194
+ |
195
+ v
196
+ +------------------------------------------+
197
+ | tools.py |
198
+ | read / write / edit / search / shell, |
199
+ | each scoped to project_root |
200
+ +------------------------------------------+
191
201
  ```
192
202
 
193
203
  What this buys you:
@@ -40,6 +40,22 @@ def save_mcp_config(path: str, servers: dict) -> None:
40
40
  f.write("\n")
41
41
 
42
42
 
43
+ def _split_command(s: str) -> list:
44
+ """Split a command string into tokens, Windows-path-safe. shlex.split()'s
45
+ default POSIX mode treats backslash as an escape character, which
46
+ silently eats every backslash in a Windows path (`C:\\Users\\...` becomes
47
+ `C:Users...`) — so split in non-POSIX mode instead (preserves backslashes
48
+ literally) and manually strip matching quotes non-POSIX mode leaves on
49
+ quoted tokens."""
50
+ tokens = shlex.split(s, posix=False)
51
+ cleaned = []
52
+ for t in tokens:
53
+ if len(t) >= 2 and t[0] == t[-1] and t[0] in ('"', "'"):
54
+ t = t[1:-1]
55
+ cleaned.append(t)
56
+ return cleaned
57
+
58
+
43
59
  def parse_mcp_server_specs(specs: list) -> dict:
44
60
  """Parse repeatable `--mcp-server` CLI values into the same shape
45
61
  load_mcp_config() returns, so both sources can be merged uniformly.
@@ -68,7 +84,7 @@ def parse_mcp_server_specs(specs: list) -> dict:
68
84
  raise ValueError(f"Invalid --mcp-server transport {transport!r} for {name!r} — expected one of {_TRANSPORTS}")
69
85
  servers[name] = {"url": url, "transport": transport}
70
86
  else:
71
- parts = shlex.split(rest)
87
+ parts = _split_command(rest)
72
88
  if not parts:
73
89
  raise ValueError(f'Invalid --mcp-server value {spec!r} — expected "name=command args..."')
74
90
  servers[name] = {"command": parts[0], "args": parts[1:]}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ollama-coding-agent
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: AI coding agent driving Qwen Coder (or any Ollama-compatible model) through a scoped toolset via MCP
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/HarryChen1995/coding_agent
@@ -82,31 +82,36 @@ in-process — the agent is an MCP *client* that talks to a tool server over
82
82
  stdio:
83
83
 
84
84
  ```
85
- ┌───────────┐ ┌────────────┐ ┌──────────────┐
86
- CLI/REPL │ --> │ agent loop │ --> │ intent parser│
87
- └───────────┘ │ (call model│ │ (task -> │
88
- │ approve, │ │ structured │
89
- │ execute, │ │ intent) │
90
- │ persist) │ └──────────────┘
91
- └─────┬──────┘
92
- ┌────────────────┼─────────────────┐
93
- ▼ ▼ ▼
94
- ┌───────────────┐ ┌───────────────┐ ┌───────────────────┐
95
- │ model client │ │ MCP client │ │ session store │
96
- │ (chat calls) │ │ (MCP session) │ │ (SQLite history) │
97
- └───────────────┘ └───────┬───────┘ └───────────────────┘
98
- stdio subprocess
99
-
100
- ┌───────────────┐
101
- │ MCP server │
102
- └───────┬───────┘
103
-
104
- ┌───────────────┐
105
- │ tools │
106
- (read/write/ │
107
- │ edit/search/ │
108
- │ shell) │
109
- └───────────────┘
85
+ +-----------------------------+
86
+ | CLI / REPL |
87
+ +-----------------------------+
88
+ |
89
+ v
90
+ +-----------------------------+
91
+ | Agent loop |
92
+ | parse intent, call model, |
93
+ | approve, execute, persist |
94
+ +-----------------------------+
95
+ |
96
+ v
97
+ +-----------------------------+
98
+ | MCP client |
99
+ | built-in + custom servers |
100
+ | merged into one tool list |
101
+ +-----------------------------+
102
+ |
103
+ stdio / SSE / streamable-http
104
+ v
105
+ +-----------------------------+
106
+ | MCP server(s) |
107
+ +-----------------------------+
108
+ |
109
+ v
110
+ +-----------------------------+
111
+ | Tools |
112
+ | read / write / edit / |
113
+ | search / shell |
114
+ +-----------------------------+
110
115
  ```
111
116
 
112
117
  Because tools are exposed over MCP, any MCP-compatible client — Claude
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ollama-coding-agent"
7
- version = "0.2.0"
7
+ version = "0.4.0"
8
8
  description = "AI coding agent driving Qwen Coder (or any Ollama-compatible model) through a scoped toolset via MCP"
9
9
  readme = "PYPI_README.md"
10
10
  requires-python = ">=3.10"