hanzo-mcp 0.1.34__py3-none-any.whl → 0.1.36__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 hanzo-mcp might be problematic. Click here for more details.

hanzo_mcp/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """Hanzo MCP - Implementation of Hanzo capabilities using MCP."""
2
2
 
3
- __version__ = "0.1.34"
3
+ __version__ = "0.1.36"
hanzo_mcp/cli.py CHANGED
@@ -8,6 +8,7 @@ from pathlib import Path
8
8
  from typing import Any, cast
9
9
 
10
10
  from hanzo_mcp.server import HanzoServer
11
+ from hanzo_mcp.tools.common.path_utils import PathUtils
11
12
 
12
13
 
13
14
  def main() -> None:
@@ -113,21 +114,18 @@ def main() -> None:
113
114
  # If no allowed paths are specified, use the user's home directory
114
115
  if not allowed_paths:
115
116
  allowed_paths = [str(Path.home())]
117
+
118
+ # Normalize all allowed paths
119
+ allowed_paths = [PathUtils.normalize_path(path) for path in allowed_paths]
116
120
 
117
- # If project directory is specified, add it to allowed paths
118
- if project_dir and project_dir not in allowed_paths:
119
- allowed_paths.append(project_dir)
120
-
121
- # Set project directory as initial working directory if provided
121
+ # If project directory is specified, normalize it and add to allowed paths
122
122
  if project_dir:
123
- # Expand user paths
124
- project_dir = os.path.expanduser(project_dir)
125
- # Make absolute
126
- if not os.path.isabs(project_dir):
127
- project_dir = os.path.abspath(project_dir)
123
+ project_dir = PathUtils.normalize_path(project_dir)
124
+ if project_dir not in allowed_paths:
125
+ allowed_paths.append(project_dir)
128
126
 
129
127
  # If no specific project directory, use the first allowed path
130
- elif allowed_paths:
128
+ if not project_dir and allowed_paths:
131
129
  project_dir = allowed_paths[0]
132
130
 
133
131
  # Run the server
hanzo_mcp/server.py CHANGED
@@ -6,6 +6,7 @@ from mcp.server.fastmcp import FastMCP
6
6
 
7
7
  from hanzo_mcp.tools import register_all_tools
8
8
  from hanzo_mcp.tools.common.context import DocumentContext
9
+ from hanzo_mcp.tools.common.path_utils import PathUtils
9
10
  from hanzo_mcp.tools.common.permissions import PermissionManager
10
11
  from hanzo_mcp.tools.project.analysis import ProjectAnalyzer, ProjectManager
11
12
  from hanzo_mcp.tools.shell.command_executor import CommandExecutor
@@ -70,8 +71,10 @@ class HanzoServer:
70
71
  # Add allowed paths
71
72
  if allowed_paths:
72
73
  for path in allowed_paths:
73
- self.permission_manager.add_allowed_path(path)
74
- self.document_context.add_allowed_path(path)
74
+ # Path should already be normalized from CLI, but normalize here for safety
75
+ normalized_path = PathUtils.normalize_path(path)
76
+ self.permission_manager.add_allowed_path(normalized_path)
77
+ self.document_context.add_allowed_path(normalized_path)
75
78
 
76
79
  # Store agent options
77
80
  self.agent_model = agent_model
@@ -104,8 +107,10 @@ class HanzoServer:
104
107
  # Add allowed paths if provided
105
108
  allowed_paths_list = allowed_paths or []
106
109
  for path in allowed_paths_list:
107
- self.permission_manager.add_allowed_path(path)
108
- self.document_context.add_allowed_path(path)
110
+ # Normalize path before adding
111
+ normalized_path = PathUtils.normalize_path(path)
112
+ self.permission_manager.add_allowed_path(normalized_path)
113
+ self.document_context.add_allowed_path(normalized_path)
109
114
 
110
115
  # Run the server
111
116
  transport_type = cast(Literal["stdio", "sse"], transport)
@@ -12,7 +12,7 @@ to delegate tasks to sub-agents for concurrent execution and specialized process
12
12
  from mcp.server.fastmcp import FastMCP
13
13
 
14
14
  from hanzo_mcp.tools.agent import register_agent_tools
15
- from hanzo_mcp.tools.common import register_thinking_tool, register_version_tool
15
+ from hanzo_mcp.tools.common import register_think_tool, register_version_tool
16
16
  from hanzo_mcp.tools.common.context import DocumentContext
17
17
  from hanzo_mcp.tools.common.permissions import PermissionManager
18
18
  from hanzo_mcp.tools.filesystem import register_filesystem_tools
@@ -78,7 +78,7 @@ def register_all_tools(
78
78
  )
79
79
 
80
80
  # Initialize and register thinking tool
81
- register_thinking_tool(mcp_server)
81
+ register_think_tool(mcp_server)
82
82
 
83
83
  # Register version tool
84
84
  register_version_tool(mcp_server)
@@ -3,11 +3,12 @@
3
3
  from mcp.server.fastmcp import FastMCP
4
4
 
5
5
  from hanzo_mcp.tools.common.base import ToolRegistry
6
- from hanzo_mcp.tools.common.thinking_tool import ThinkingTool
6
+ from hanzo_mcp.tools.common.path_utils import PathUtils
7
+ from hanzo_mcp.tools.common.think_tool import ThinkingTool
7
8
  from hanzo_mcp.tools.common.version_tool import VersionTool
8
9
 
9
10
 
10
- def register_thinking_tool(
11
+ def register_think_tool(
11
12
  mcp_server: FastMCP,
12
13
  ) -> None:
13
14
  """Register all thinking tools with the MCP server.
@@ -15,8 +16,8 @@ def register_thinking_tool(
15
16
  Args:
16
17
  mcp_server: The FastMCP server instance
17
18
  """
18
- thinking_tool = ThinkingTool()
19
- ToolRegistry.register_tool(mcp_server, thinking_tool)
19
+ think_tool = ThinkingTool()
20
+ ToolRegistry.register_tool(mcp_server, think_tool)
20
21
 
21
22
 
22
23
  def register_version_tool(
@@ -14,6 +14,8 @@ from typing import Any, ClassVar, final
14
14
  from mcp.server.fastmcp import Context as MCPContext
15
15
  from mcp.server.lowlevel.helper_types import ReadResourceContents
16
16
 
17
+ from hanzo_mcp.tools.common.path_utils import PathUtils
18
+
17
19
 
18
20
  @final
19
21
  class ToolContext:
@@ -179,9 +181,9 @@ class DocumentContext:
179
181
  Args:
180
182
  path: The path to allow
181
183
  """
182
- # Expand user path (e.g., ~/ or $HOME)
183
- expanded_path = os.path.expanduser(path)
184
- resolved_path: Path = Path(expanded_path).resolve()
184
+ # Normalize path (expand user paths and make absolute)
185
+ normalized_path = PathUtils.normalize_path(path)
186
+ resolved_path: Path = Path(normalized_path).resolve()
185
187
  self.allowed_paths.add(resolved_path)
186
188
 
187
189
  def is_path_allowed(self, path: str) -> bool:
@@ -193,9 +195,9 @@ class DocumentContext:
193
195
  Returns:
194
196
  True if the path is allowed, False otherwise
195
197
  """
196
- # Expand user path (e.g., ~/ or $HOME)
197
- expanded_path = os.path.expanduser(path)
198
- resolved_path: Path = Path(expanded_path).resolve()
198
+ # Normalize path (expand user paths and make absolute)
199
+ normalized_path = PathUtils.normalize_path(path)
200
+ resolved_path: Path = Path(normalized_path).resolve()
199
201
 
200
202
  # Check if the path is within any allowed path
201
203
  for allowed_path in self.allowed_paths:
@@ -0,0 +1,51 @@
1
+ """Path utilities for Hanzo MCP.
2
+
3
+ This module provides path normalization and validation utilities.
4
+ """
5
+
6
+ import os
7
+ from pathlib import Path
8
+ from typing import final
9
+
10
+
11
+ @final
12
+ class PathUtils:
13
+ """Utilities for path handling."""
14
+
15
+ @staticmethod
16
+ def normalize_path(path: str) -> str:
17
+ """Normalize a path by expanding user paths and making it absolute.
18
+
19
+ Args:
20
+ path: The path to normalize
21
+
22
+ Returns:
23
+ The normalized path
24
+ """
25
+ # Expand user paths (e.g., ~/ or $HOME)
26
+ expanded_path = os.path.expanduser(path)
27
+
28
+ # Make the path absolute if it isn't already
29
+ if not os.path.isabs(expanded_path):
30
+ expanded_path = os.path.abspath(expanded_path)
31
+
32
+ # Normalize the path (resolve symlinks, etc.)
33
+ try:
34
+ normalized_path = os.path.normpath(expanded_path)
35
+ return normalized_path
36
+ except Exception:
37
+ # Return the expanded path if normalization fails
38
+ return expanded_path
39
+
40
+ @staticmethod
41
+ def is_dot_directory(path: Path) -> bool:
42
+ """Check if a path is a dot directory (e.g., .git, .vscode).
43
+
44
+ Args:
45
+ path: The path to check
46
+
47
+ Returns:
48
+ True if the path is a dot directory, False otherwise
49
+ """
50
+ # Consider any directory starting with "." to be a dot directory
51
+ return path.is_dir() and path.name.startswith(".")
@@ -6,6 +6,8 @@ from collections.abc import Awaitable, Callable
6
6
  from pathlib import Path
7
7
  from typing import Any, TypeVar, final
8
8
 
9
+ from hanzo_mcp.tools.common.path_utils import PathUtils
10
+
9
11
  # Define type variables for better type annotations
10
12
  T = TypeVar("T")
11
13
  P = TypeVar("P")
@@ -69,9 +71,9 @@ class PermissionManager:
69
71
  Args:
70
72
  path: The path to allow
71
73
  """
72
- # Expand user path (e.g., ~/ or $HOME)
73
- expanded_path = os.path.expanduser(path)
74
- resolved_path: Path = Path(expanded_path).resolve()
74
+ # Normalize path (expand user paths and make absolute)
75
+ normalized_path = PathUtils.normalize_path(path)
76
+ resolved_path: Path = Path(normalized_path).resolve()
75
77
  self.allowed_paths.add(resolved_path)
76
78
 
77
79
  def remove_allowed_path(self, path: str) -> None:
@@ -110,9 +112,9 @@ class PermissionManager:
110
112
  Returns:
111
113
  True if the path is allowed, False otherwise
112
114
  """
113
- # Expand user path (e.g., ~/ or $HOME)
114
- expanded_path = os.path.expanduser(path)
115
- resolved_path: Path = Path(expanded_path).resolve()
115
+ # Normalize path (expand user paths and make absolute)
116
+ normalized_path = PathUtils.normalize_path(path)
117
+ resolved_path: Path = Path(normalized_path).resolve()
116
118
 
117
119
  # Check exclusions first
118
120
  if self._is_path_excluded(resolved_path):
@@ -1,9 +1,6 @@
1
1
  """Version tool for displaying project version information."""
2
2
 
3
- import importlib.metadata
4
- import os
5
- import tomllib
6
- from typing import Any, Dict, TypedDict, cast, final, override
3
+ from typing import Any, Dict, TypedDict, final, override
7
4
 
8
5
  from mcp.server.fastmcp import Context as MCPContext
9
6
  from mcp.server.fastmcp import FastMCP
@@ -101,21 +98,10 @@ class VersionTool(BaseTool):
101
98
  Returns:
102
99
  A dictionary containing the package name and version
103
100
  """
104
- try:
105
- version = importlib.metadata.version("hanzo-mcp")
106
- except importlib.metadata.PackageNotFoundError:
107
- # If package not installed, try to read from pyproject.toml
108
- try:
109
- root_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
110
- toml_path = os.path.join(root_dir, "pyproject.toml")
111
-
112
- with open(toml_path, "rb") as f:
113
- pyproject = tomllib.load(f)
114
- version = cast(str, pyproject.get("project", {}).get("version", "unknown"))
115
- except Exception:
116
- version = "unknown"
101
+ # Directly use the __version__ from the hanzo_mcp package
102
+ from hanzo_mcp import __version__
117
103
 
118
- return {"version": version, "package_name": "hanzo-mcp"}
104
+ return {"version": __version__, "package_name": "hanzo-mcp"}
119
105
 
120
106
  @override
121
107
  def register(self, mcp_server: FastMCP) -> None:
@@ -3,12 +3,14 @@
3
3
  This module provides the DirectoryTreeTool for viewing file and directory structures.
4
4
  """
5
5
 
6
+ import os
6
7
  from pathlib import Path
7
8
  from typing import Any, final, override
8
9
 
9
10
  from mcp.server.fastmcp import Context as MCPContext
10
11
  from mcp.server.fastmcp import FastMCP
11
12
 
13
+ from hanzo_mcp.tools.common.path_utils import PathUtils
12
14
  from hanzo_mcp.tools.filesystem.base import FilesystemBaseTool
13
15
 
14
16
 
@@ -137,17 +139,47 @@ requested. Only works within allowed directories."""
137
139
  if not is_dir:
138
140
  return error_msg
139
141
 
140
- # Define filtered directories
142
+ # Define filtered directories based on common patterns and .gitignore
141
143
  FILTERED_DIRECTORIES = {
142
- ".git", "node_modules", ".venv", "venv",
143
- "__pycache__", ".pytest_cache", ".idea",
144
- ".vs", ".vscode", "dist", "build", "target",
145
- ".ruff_cache",".llm-context"
144
+ # Hidden/dot directories
145
+ ".git", ".github", ".gitignore", ".hg", ".svn", ".venv", ".env",
146
+ ".idea", ".vscode", ".vs", ".cache", ".config", ".local",
147
+ ".pytest_cache", ".ruff_cache", ".mypy_cache", ".pytype",
148
+ ".coverage", ".tox", ".nox", ".circleci", ".llm-context",
149
+ # Cache directories
150
+ "__pycache__", ".ipynb_checkpoints", "htmlcov", ".eggs",
151
+ # Build artifacts
152
+ "dist", "build", "target", "out", "site", "coverage",
153
+ # Dependency directories
154
+ "node_modules", "venv", "env", "ENV", "lib", "libs", "vendor",
155
+ "eggs", "sdist", "wheels", "share"
146
156
  }
147
157
 
148
158
  # Log filtering settings
149
159
  await tool_ctx.info(f"Directory tree filtering: include_filtered={include_filtered}")
150
160
 
161
+ # Try to get additional patterns from .gitignore if it exists
162
+ gitignore_patterns = set()
163
+ gitignore_path = dir_path / ".gitignore"
164
+ if gitignore_path.exists() and gitignore_path.is_file():
165
+ try:
166
+ with open(gitignore_path, "r") as f:
167
+ for line in f:
168
+ line = line.strip()
169
+ if line and not line.startswith("#"):
170
+ # Strip trailing slashes for directory patterns
171
+ if line.endswith("/"):
172
+ line = line[:-1]
173
+ # Extract the actual pattern without path
174
+ pattern = line.split("/")[-1]
175
+ if pattern and "*" not in pattern and "?" not in pattern:
176
+ gitignore_patterns.add(pattern)
177
+ except Exception as e:
178
+ await tool_ctx.warning(f"Error reading .gitignore: {str(e)}")
179
+
180
+ # Add gitignore patterns to filtered directories
181
+ FILTERED_DIRECTORIES.update(gitignore_patterns)
182
+
151
183
  # Check if a directory should be filtered
152
184
  def should_filter(current_path: Path) -> bool:
153
185
  # Don't filter if it's the explicitly requested path
@@ -155,8 +187,15 @@ requested. Only works within allowed directories."""
155
187
  # Don't filter explicitly requested paths
156
188
  return False
157
189
 
158
- # Filter based on directory name if filtering is enabled
159
- return current_path.name in FILTERED_DIRECTORIES and not include_filtered
190
+ # First check standard filtered directories
191
+ if current_path.name in FILTERED_DIRECTORIES and not include_filtered:
192
+ return True
193
+
194
+ # Also filter hidden directories (dot directories) unless explicitly included
195
+ if PathUtils.is_dot_directory(current_path) and not include_filtered:
196
+ return True
197
+
198
+ return False
160
199
 
161
200
  # Track stats for summary
162
201
  stats = {
@@ -14,6 +14,8 @@ from collections.abc import Awaitable, Callable
14
14
  from pathlib import Path
15
15
  from typing import Dict, Optional, final
16
16
 
17
+ from hanzo_mcp.tools.common.path_utils import PathUtils
18
+
17
19
  from mcp.server.fastmcp import Context as MCPContext
18
20
  from mcp.server.fastmcp import FastMCP
19
21
 
@@ -134,8 +136,8 @@ class CommandExecutor:
134
136
  path: The path to set as the current working directory
135
137
  """
136
138
  session = self.get_session_manager(session_id)
137
- expanded_path = os.path.expanduser(path)
138
- session.set_working_dir(Path(expanded_path))
139
+ normalized_path = PathUtils.normalize_path(path)
140
+ session.set_working_dir(Path(normalized_path))
139
141
 
140
142
  def get_working_dir(self, session_id: str) -> str:
141
143
  """Get the current working directory for the session.
@@ -249,11 +251,8 @@ class CommandExecutor:
249
251
  session_cwd = self.get_working_dir(session_id)
250
252
  target_dir = os.path.join(session_cwd, target_dir)
251
253
 
252
- # Expand user paths
253
- target_dir = os.path.expanduser(target_dir)
254
-
255
- # Normalize path
256
- target_dir = os.path.normpath(target_dir)
254
+ # Normalize path (expand user and make absolute)
255
+ target_dir = PathUtils.normalize_path(target_dir)
257
256
 
258
257
  if os.path.isdir(target_dir):
259
258
  self.set_working_dir(session_id, target_dir)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hanzo-mcp
3
- Version: 0.1.34
3
+ Version: 0.1.36
4
4
  Summary: MCP implementation of Hanzo capabilities
5
5
  Author-email: Hanzo Industries Inc <dev@hanzo.ai>
6
6
  License: MIT
@@ -146,14 +146,19 @@ make bump-patch # Increment patch version (0.1.x → 0.1.x+1)
146
146
  make bump-minor # Increment minor version (0.x.0 → 0.x+1.0)
147
147
  make bump-major # Increment major version (x.0.0 → x+1.0.0)
148
148
 
149
+ # Manual version bumping (alternative to make commands)
150
+ python -m scripts.bump_version patch # Increment patch version
151
+ python -m scripts.bump_version minor # Increment minor version
152
+ python -m scripts.bump_version major # Increment major version
153
+
149
154
  # Publishing (creates git tag and pushes it to GitHub)
150
155
  make publish # Publish using configured credentials in .pypirc
151
156
  PYPI_TOKEN=your_token make publish # Publish with token from environment variable
152
157
 
153
- # Version bump and publish in one step (with automatic git tagging)
154
- make publish-patch # Bump patch version, publish, and create git tag
155
- make publish-minor # Bump minor version, publish, and create git tag
156
- make publish-major # Bump major version, publish, and create git tag
158
+ # Publishing (creates git tag, pushes to GitHub, and publishes to PyPI)
159
+ make patch # Bump patch version, build, publish, create git tag, and push
160
+ make minor # Bump minor version, build, publish, create git tag, and push
161
+ make major # Bump major version, build, publish, create git tag, and push
157
162
 
158
163
  # Publish to Test PyPI
159
164
  make publish-test
@@ -1,23 +1,24 @@
1
- hanzo_mcp/__init__.py,sha256=VjtQtqG1ncuqgame6m4P0i86rJmzgGEbut9ANo9Qys8,90
2
- hanzo_mcp/cli.py,sha256=G0Klg7RMK9XLehLT9ysWbpii0XRrECglUaxwvCekl7g,7201
3
- hanzo_mcp/server.py,sha256=j2UagHTxwCbZrnhODbMUI0wdZ-7yLFxB9-ZbignZFzg,5671
4
- hanzo_mcp/tools/__init__.py,sha256=3IHzhmSiAbxg2yvqVJn4SH6YP_DSnxYaNk9ccBtk7H0,3339
1
+ hanzo_mcp/__init__.py,sha256=R1BsBtTu0Ll8ASecW2mPKCntuNwFh6Z8vY8U5tjQ6pE,90
2
+ hanzo_mcp/cli.py,sha256=VPGky5w47_7PYYaXnryToaj7By7Sld0vn_bZ2Hxmpy8,7189
3
+ hanzo_mcp/server.py,sha256=OyF-jmPCHXId7DaIk3QcGxnmkSgsnd0GLx3WAtiaOik,6032
4
+ hanzo_mcp/tools/__init__.py,sha256=9bq0emNV_xQk3elWdfIkzgzRU2G1vIsV2k_neV43coc,3333
5
5
  hanzo_mcp/tools/agent/__init__.py,sha256=0eyQqqdAy7WCZEqUfV6xh66bDpQI9neB6iDjWf0_pJI,2189
6
6
  hanzo_mcp/tools/agent/agent_tool.py,sha256=qXu62ZRGM0o9mxOiRVFy-ABIZtEJ8z03DqAXshKAieI,19180
7
7
  hanzo_mcp/tools/agent/prompt.py,sha256=jmYRI4Sm2D3LwEdC2qWakpqupgfGg8CT6grmx4NEDaA,4431
8
8
  hanzo_mcp/tools/agent/tool_adapter.py,sha256=g9NKfIET0WOsm0r28xEXsibsprpI1C6ripcM6QwU-rI,2172
9
- hanzo_mcp/tools/common/__init__.py,sha256=VS_eJP0oJGEgO78stwQWyer1heVfhhHihtt5sctjei8,809
9
+ hanzo_mcp/tools/common/__init__.py,sha256=E0rOalOkyLKsjDcmZNjuvKY4Fu0NTr81rYC1G4r51UM,853
10
10
  hanzo_mcp/tools/common/base.py,sha256=O7Lgft0XiC9Iyi3fYsmoWWrvKDK2Aa-FJLxPgnNJRJY,7341
11
- hanzo_mcp/tools/common/context.py,sha256=ReIfcm37j5qnLQ8G_-d88ad5uC1OKkjQZKG9HdJPybI,13145
12
- hanzo_mcp/tools/common/permissions.py,sha256=4YCfA2PJUOl-z_47n5uaRXO8gAZ_shMaPhpi1dilgRE,7594
11
+ hanzo_mcp/tools/common/context.py,sha256=rXK6FvHFnJ0OAYvAKfJUEjY6TKFn_Dj8ErgvCSvGHh4,13254
12
+ hanzo_mcp/tools/common/path_utils.py,sha256=eLmHxvUQimCZceUNg5W9DbUvlA3uRzU6Stal-3XHRf8,1509
13
+ hanzo_mcp/tools/common/permissions.py,sha256=w_D2bIX5E0PmctmNf0tFASYebU-cUuEFICjOOiAI_WM,7703
13
14
  hanzo_mcp/tools/common/session.py,sha256=csX5ZhgBjO2bdXXXPpsUPzOCc7Tib-apYe01AP8sh8k,2774
14
- hanzo_mcp/tools/common/thinking_tool.py,sha256=I-O6ipM-PUofkNoMMzv37Y_2Yfx9mh7F1upTTsfRN4M,4046
15
+ hanzo_mcp/tools/common/think_tool.py,sha256=I-O6ipM-PUofkNoMMzv37Y_2Yfx9mh7F1upTTsfRN4M,4046
15
16
  hanzo_mcp/tools/common/validation.py,sha256=gB3uM_cbPZsH4Ez0hnTgIcdP-AUlHZU02aRmZEpk_6I,3648
16
- hanzo_mcp/tools/common/version_tool.py,sha256=3QiSCRTc0fgf2vZw0XVCL1V3Gl7T5OMFrAUUJSJqMVE,4018
17
+ hanzo_mcp/tools/common/version_tool.py,sha256=4bJZhqgtvwQMyVSSZ-xU-NQvr1xfnyDi_4FnOpZvuw0,3406
17
18
  hanzo_mcp/tools/filesystem/__init__.py,sha256=-wNhb0IjJgz05n_fRP0wDXfKgJ6fgBp4wrGo62Hpyvc,3265
18
19
  hanzo_mcp/tools/filesystem/base.py,sha256=HAzuMCrS0dKOBZNoLr7y74tdbYyKpi0FGhStuRgkFTU,3917
19
20
  hanzo_mcp/tools/filesystem/content_replace.py,sha256=ZwzxyOTASUmzP-jtEnsSR-MKtNFC4R3kQunpV3KOCyg,11049
20
- hanzo_mcp/tools/filesystem/directory_tree.py,sha256=cx-zpOeKP8DDuMt1ls3QhRk9h3RVmMhpPwpqn4wTfP4,11271
21
+ hanzo_mcp/tools/filesystem/directory_tree.py,sha256=QgMjvBv9rKVNHEumHgrS0chP91IKo5xg3X5JzSiHbOY,13403
21
22
  hanzo_mcp/tools/filesystem/edit_file.py,sha256=03ku1_8X_uAUPfqGlR6fv55VEz-0Pifp9DJtkcOTFHY,10980
22
23
  hanzo_mcp/tools/filesystem/get_file_info.py,sha256=WR7uMqFcpKboS3FX3jF-MD-0-ROJJcppX7M_GtR0yLs,5392
23
24
  hanzo_mcp/tools/filesystem/read_files.py,sha256=0JYJ2kM8FIoksbnnO8V0uY3D2R1uWvR7zb7_oXV0sMM,6968
@@ -34,13 +35,13 @@ hanzo_mcp/tools/project/base.py,sha256=CniLAsjum5vC3cgvF9AqU-_ZY_0Nf9uaF2L_xV2ob
34
35
  hanzo_mcp/tools/project/project_analyze.py,sha256=6GLE_JcSiCy6kKdee0sMI5T2229A-Vpp98s2j_JD6yI,5711
35
36
  hanzo_mcp/tools/shell/__init__.py,sha256=lKgh0WXds4tZJ1tIL9MJbyMSzP6A9uZQALjGGBvyYc4,1679
36
37
  hanzo_mcp/tools/shell/base.py,sha256=OxKNWMp-fB-vozzWOE_hHvr5M_pFKSMIYfOX0dEOWzA,4836
37
- hanzo_mcp/tools/shell/command_executor.py,sha256=5GcJvg54uty9fl_tkGdWTBcHyjxuynQZ_Tv6qOyKgdk,32616
38
+ hanzo_mcp/tools/shell/command_executor.py,sha256=MqGxHoLB_cDOutdTv59BF5ooiLE-_2Xt-J9UOE-ReFo,32610
38
39
  hanzo_mcp/tools/shell/run_command.py,sha256=r7HBw0lqabgkGnVsDXmLnrTo0SU9g8gLvzpa-9n-cmM,6891
39
40
  hanzo_mcp/tools/shell/run_script.py,sha256=CLYnDc0Ze8plkXU6d98RgE4UrBg-fwaMVdcn9Fc6Ixw,7432
40
41
  hanzo_mcp/tools/shell/script_tool.py,sha256=s63tawIZBvwgm_kU9P7A3D4v2ulVw7j4l_rpsa_zGuc,8680
41
- hanzo_mcp-0.1.34.dist-info/licenses/LICENSE,sha256=mf1qZGFsPGskoPgytp9B-RsahfKvXsBpmaAbTLGTt8Y,1063
42
- hanzo_mcp-0.1.34.dist-info/METADATA,sha256=2qzyFMp1jD0QkMId-bLVmOuKW_2hhBDvLMfzRlHLmCU,7277
43
- hanzo_mcp-0.1.34.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
44
- hanzo_mcp-0.1.34.dist-info/entry_points.txt,sha256=aRKOKXtuQr-idSr-yH4efnRl2v8te94AcgN3ysqqSYs,49
45
- hanzo_mcp-0.1.34.dist-info/top_level.txt,sha256=eGFANatA0MHWiVlpS56fTYRIShtibrSom1uXI6XU0GU,10
46
- hanzo_mcp-0.1.34.dist-info/RECORD,,
42
+ hanzo_mcp-0.1.36.dist-info/licenses/LICENSE,sha256=mf1qZGFsPGskoPgytp9B-RsahfKvXsBpmaAbTLGTt8Y,1063
43
+ hanzo_mcp-0.1.36.dist-info/METADATA,sha256=xVd9e-JGD2c0Rs5GdG7ZMoDu4LcsdS2jwgADGdegj30,7551
44
+ hanzo_mcp-0.1.36.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
45
+ hanzo_mcp-0.1.36.dist-info/entry_points.txt,sha256=aRKOKXtuQr-idSr-yH4efnRl2v8te94AcgN3ysqqSYs,49
46
+ hanzo_mcp-0.1.36.dist-info/top_level.txt,sha256=eGFANatA0MHWiVlpS56fTYRIShtibrSom1uXI6XU0GU,10
47
+ hanzo_mcp-0.1.36.dist-info/RECORD,,