janito 0.10.0__py3-none-any.whl → 0.10.1__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.
janito/__init__.py CHANGED
@@ -2,4 +2,4 @@
2
2
  Janito package.
3
3
  """
4
4
 
5
- __version__ = "0.10.0"
5
+ __version__ = "0.11.0"
@@ -1,6 +1,4 @@
1
- You are a helpful AI assistant, working in a repository.
2
- Answer the user's questions accurately and concisely.
3
-
1
+ You are an expert software engineer, working in a project.
4
2
  When using str_replace_editor be aware that our files starting path is "." .
5
3
 
6
4
  Before performing any action, always check the structure of the project for paths that might be related to the request.
@@ -1,197 +1,227 @@
1
- import os
2
- import fnmatch
3
- import re
4
- import pathlib
5
- from typing import List, Dict, Any, Tuple
6
- from janito.tools.decorators import tool_meta
7
-
8
-
9
- @tool_meta(label="Searching for '{text_pattern}' in files matching '{file_pattern}'")
10
- def search_text(text_pattern: str, file_pattern: str = "*", root_dir: str = ".", recursive: bool = True, respect_gitignore: bool = True) -> Tuple[str, bool]:
11
- """
12
- Search for text patterns within files matching a filename pattern.
13
-
14
- Args:
15
- text_pattern: Text pattern to search for within files
16
- file_pattern: Pattern to match file names against (default: "*" - all files)
17
- root_dir: Root directory to start search from (default: current directory)
18
- recursive: Whether to search recursively in subdirectories (default: True)
19
- respect_gitignore: Whether to respect .gitignore files (default: True)
20
-
21
- Returns:
22
- A tuple containing (message, is_error)
23
- """
24
- try:
25
- # Convert to absolute path if relative
26
- abs_root = os.path.abspath(root_dir)
27
-
28
- if not os.path.isdir(abs_root):
29
- return f"Error: Directory '{root_dir}' does not exist", True
30
-
31
- # Compile the regex pattern for better performance
32
- try:
33
- regex = re.compile(text_pattern)
34
- except re.error as e:
35
- return f"Error: Invalid regex pattern '{text_pattern}': {str(e)}", True
36
-
37
- matching_files = []
38
- match_count = 0
39
- results = []
40
-
41
- # Get gitignore patterns if needed
42
- ignored_patterns = []
43
- if respect_gitignore:
44
- ignored_patterns = _get_gitignore_patterns(abs_root)
45
-
46
- # Use os.walk for recursive behavior
47
- if recursive:
48
- for dirpath, dirnames, filenames in os.walk(abs_root):
49
- # Skip ignored directories
50
- if respect_gitignore:
51
- dirnames[:] = [d for d in dirnames if not _is_ignored(os.path.join(dirpath, d), ignored_patterns, abs_root)]
52
-
53
- for filename in fnmatch.filter(filenames, file_pattern):
54
- file_path = os.path.join(dirpath, filename)
55
-
56
- # Skip ignored files
57
- if respect_gitignore and _is_ignored(file_path, ignored_patterns, abs_root):
58
- continue
59
-
60
- file_matches = _search_file(file_path, regex, abs_root)
61
- if file_matches:
62
- matching_files.append(file_path)
63
- match_count += len(file_matches)
64
- results.append(f"\n{os.path.relpath(file_path, abs_root)} ({len(file_matches)} matches):")
65
- results.extend(file_matches)
66
- else:
67
- # Non-recursive mode - only search in the specified directory
68
- for filename in fnmatch.filter(os.listdir(abs_root), file_pattern):
69
- file_path = os.path.join(abs_root, filename)
70
-
71
- # Skip ignored files
72
- if respect_gitignore and _is_ignored(file_path, ignored_patterns, abs_root):
73
- continue
74
-
75
- if os.path.isfile(file_path):
76
- file_matches = _search_file(file_path, regex, abs_root)
77
- if file_matches:
78
- matching_files.append(file_path)
79
- match_count += len(file_matches)
80
- results.append(f"\n{os.path.relpath(file_path, abs_root)} ({len(file_matches)} matches):")
81
- results.extend(file_matches)
82
-
83
- if matching_files:
84
- result_text = "\n".join(results)
85
- summary = f"\n{match_count} matches in {len(matching_files)} files"
86
- return f"Searching for '{text_pattern}' in files matching '{file_pattern}':{result_text}\n{summary}", False
87
- else:
88
- return f"No matches found for '{text_pattern}' in files matching '{file_pattern}' in '{root_dir}'", False
89
-
90
- except Exception as e:
91
- return f"Error searching text: {str(e)}", True
92
-
93
-
94
- def _search_file(file_path: str, pattern: re.Pattern, root_dir: str) -> List[str]:
95
- """
96
- Search for regex pattern in a file and return matching lines with line numbers.
97
-
98
- Args:
99
- file_path: Path to the file to search
100
- pattern: Compiled regex pattern to search for
101
- root_dir: Root directory (for path display)
102
-
103
- Returns:
104
- List of formatted matches with line numbers and content
105
- """
106
- matches = []
107
- try:
108
- with open(file_path, 'r', encoding='utf-8', errors='replace') as f:
109
- for i, line in enumerate(f, 1):
110
- if pattern.search(line):
111
- # Truncate long lines for display
112
- display_line = line.strip()
113
- if len(display_line) > 100:
114
- display_line = display_line[:97] + "..."
115
- matches.append(f" Line {i}: {display_line}")
116
- except (UnicodeDecodeError, IOError) as e:
117
- # Skip binary files or files with encoding issues
118
- pass
119
- return matches
120
-
121
-
122
- def _get_gitignore_patterns(root_dir: str) -> List[str]:
123
- """
124
- Get patterns from .gitignore files.
125
-
126
- Args:
127
- root_dir: Root directory to start from
128
-
129
- Returns:
130
- List of gitignore patterns
131
- """
132
- patterns = []
133
-
134
- # Check for .gitignore in the root directory
135
- gitignore_path = os.path.join(root_dir, '.gitignore')
136
- if os.path.isfile(gitignore_path):
137
- try:
138
- with open(gitignore_path, 'r', encoding='utf-8') as f:
139
- for line in f:
140
- line = line.strip()
141
- # Skip empty lines and comments
142
- if line and not line.startswith('#'):
143
- patterns.append(line)
144
- except Exception:
145
- pass
146
-
147
- # Add common patterns that are always ignored
148
- common_patterns = [
149
- '.git/', '.venv/', 'venv/', '__pycache__/', '*.pyc',
150
- '*.pyo', '*.pyd', '.DS_Store', '*.so', '*.egg-info/'
151
- ]
152
- patterns.extend(common_patterns)
153
-
154
- return patterns
155
-
156
-
157
- def _is_ignored(path: str, patterns: List[str], root_dir: str) -> bool:
158
- """
159
- Check if a path should be ignored based on gitignore patterns.
160
-
161
- Args:
162
- path: Path to check
163
- patterns: List of gitignore patterns
164
- root_dir: Root directory for relative paths
165
-
166
- Returns:
167
- True if the path should be ignored, False otherwise
168
- """
169
- # Get the relative path from the root directory
170
- rel_path = os.path.relpath(path, root_dir)
171
-
172
- # Convert to forward slashes for consistency with gitignore patterns
173
- rel_path = rel_path.replace(os.sep, '/')
174
-
175
- # Add trailing slash for directories
176
- if os.path.isdir(path) and not rel_path.endswith('/'):
177
- rel_path += '/'
178
-
179
- for pattern in patterns:
180
- # Handle negation patterns (those starting with !)
181
- if pattern.startswith('!'):
182
- continue # Skip negation patterns for simplicity
183
-
184
- # Handle directory-specific patterns (those ending with /)
185
- if pattern.endswith('/'):
186
- if os.path.isdir(path) and fnmatch.fnmatch(rel_path, pattern + '*'):
187
- return True
188
-
189
- # Handle file patterns
190
- if fnmatch.fnmatch(rel_path, pattern):
191
- return True
192
-
193
- # Handle patterns without wildcards as path prefixes
194
- if '*' not in pattern and '?' not in pattern and rel_path.startswith(pattern):
195
- return True
196
-
1
+ import os
2
+ import fnmatch
3
+ import re
4
+ import pathlib
5
+ from typing import List, Dict, Any, Tuple
6
+ from janito.tools.decorators import tool_meta
7
+
8
+
9
+ @tool_meta(label="Searching for '{text_pattern}' in files matching '{file_pattern}'")
10
+ def search_text(text_pattern: str, file_pattern: str = "*", root_dir: str = ".", recursive: bool = True, respect_gitignore: bool = True) -> Tuple[str, bool]:
11
+ """
12
+ Search for text patterns within files matching a filename pattern.
13
+
14
+ Args:
15
+ text_pattern: Text pattern to search for within files
16
+ file_pattern: Pattern to match file names against (default: "*")
17
+ Multiple patterns can be specified using semicolons or spaces as separators
18
+ Examples: "*.py *.toml *.sh *.md test*"
19
+ root_dir: Root directory to start search from (default: current directory)
20
+ recursive: Whether to search recursively in subdirectories (default: True)
21
+ respect_gitignore: Whether to respect .gitignore files (default: True)
22
+
23
+ Returns:
24
+ A tuple containing (message, is_error)
25
+ """
26
+ try:
27
+ # Convert to absolute path if relative
28
+ abs_root = os.path.abspath(root_dir)
29
+
30
+ if not os.path.isdir(abs_root):
31
+ return f"Error: Directory '{root_dir}' does not exist", True
32
+
33
+ # Compile the regex pattern for better performance
34
+ try:
35
+ regex = re.compile(text_pattern)
36
+ except re.error as e:
37
+ return f"Error: Invalid regex pattern '{text_pattern}': {str(e)}", True
38
+
39
+ matching_files = []
40
+ match_count = 0
41
+ results = []
42
+
43
+ # Get gitignore patterns if needed
44
+ ignored_patterns = []
45
+ if respect_gitignore:
46
+ ignored_patterns = _get_gitignore_patterns(abs_root)
47
+
48
+ # Use os.walk for recursive behavior
49
+ if recursive:
50
+ for dirpath, dirnames, filenames in os.walk(abs_root):
51
+ # Skip ignored directories
52
+ if respect_gitignore:
53
+ dirnames[:] = [d for d in dirnames if not _is_ignored(os.path.join(dirpath, d), ignored_patterns, abs_root)]
54
+
55
+ # Handle multiple patterns separated by semicolons or spaces
56
+ patterns = []
57
+ if ';' in file_pattern:
58
+ patterns = file_pattern.split(';')
59
+ elif ' ' in file_pattern:
60
+ patterns = file_pattern.split()
61
+ else:
62
+ patterns = [file_pattern]
63
+
64
+ for pattern in patterns:
65
+ for filename in fnmatch.filter(filenames, pattern):
66
+ file_path = os.path.join(dirpath, filename)
67
+
68
+ # Skip ignored files
69
+ if respect_gitignore and _is_ignored(file_path, ignored_patterns, abs_root):
70
+ continue
71
+
72
+ # Skip if already processed this file
73
+ if file_path in matching_files:
74
+ continue
75
+
76
+ file_matches = _search_file(file_path, regex, abs_root)
77
+ if file_matches:
78
+ matching_files.append(file_path)
79
+ match_count += len(file_matches)
80
+ results.append(f"\n{os.path.relpath(file_path, abs_root)} ({len(file_matches)} matches):")
81
+ results.extend(file_matches)
82
+ else:
83
+ # Non-recursive mode - only search in the specified directory
84
+ # Handle multiple patterns separated by semicolons or spaces
85
+ patterns = []
86
+ if ';' in file_pattern:
87
+ patterns = file_pattern.split(';')
88
+ elif ' ' in file_pattern:
89
+ patterns = file_pattern.split()
90
+ else:
91
+ patterns = [file_pattern]
92
+
93
+ for pattern in patterns:
94
+ for filename in fnmatch.filter(os.listdir(abs_root), pattern):
95
+ file_path = os.path.join(abs_root, filename)
96
+
97
+ # Skip ignored files
98
+ if respect_gitignore and _is_ignored(file_path, ignored_patterns, abs_root):
99
+ continue
100
+
101
+ # Skip if already processed this file
102
+ if file_path in matching_files:
103
+ continue
104
+
105
+ if os.path.isfile(file_path):
106
+ file_matches = _search_file(file_path, regex, abs_root)
107
+ if file_matches:
108
+ matching_files.append(file_path)
109
+ match_count += len(file_matches)
110
+ results.append(f"\n{os.path.relpath(file_path, abs_root)} ({len(file_matches)} matches):")
111
+ results.extend(file_matches)
112
+
113
+ if matching_files:
114
+ result_text = "\n".join(results)
115
+ summary = f"\n{match_count} matches in {len(matching_files)} files"
116
+ return f"Searching for '{text_pattern}' in files matching '{file_pattern}':{result_text}\n{summary}", False
117
+ else:
118
+ return f"No matches found for '{text_pattern}' in files matching '{file_pattern}' in '{root_dir}'", False
119
+
120
+ except Exception as e:
121
+ return f"Error searching text: {str(e)}", True
122
+
123
+
124
+ def _search_file(file_path: str, pattern: re.Pattern, root_dir: str) -> List[str]:
125
+ """
126
+ Search for regex pattern in a file and return matching lines with line numbers.
127
+
128
+ Args:
129
+ file_path: Path to the file to search
130
+ pattern: Compiled regex pattern to search for
131
+ root_dir: Root directory (for path display)
132
+
133
+ Returns:
134
+ List of formatted matches with line numbers and content
135
+ """
136
+ matches = []
137
+ try:
138
+ with open(file_path, 'r', encoding='utf-8', errors='replace') as f:
139
+ for i, line in enumerate(f, 1):
140
+ if pattern.search(line):
141
+ # Truncate long lines for display
142
+ display_line = line.strip()
143
+ if len(display_line) > 100:
144
+ display_line = display_line[:97] + "..."
145
+ matches.append(f" Line {i}: {display_line}")
146
+ except (UnicodeDecodeError, IOError) as e:
147
+ # Skip binary files or files with encoding issues
148
+ pass
149
+ return matches
150
+
151
+
152
+ def _get_gitignore_patterns(root_dir: str) -> List[str]:
153
+ """
154
+ Get patterns from .gitignore files.
155
+
156
+ Args:
157
+ root_dir: Root directory to start from
158
+
159
+ Returns:
160
+ List of gitignore patterns
161
+ """
162
+ patterns = []
163
+
164
+ # Check for .gitignore in the root directory
165
+ gitignore_path = os.path.join(root_dir, '.gitignore')
166
+ if os.path.isfile(gitignore_path):
167
+ try:
168
+ with open(gitignore_path, 'r', encoding='utf-8') as f:
169
+ for line in f:
170
+ line = line.strip()
171
+ # Skip empty lines and comments
172
+ if line and not line.startswith('#'):
173
+ patterns.append(line)
174
+ except Exception:
175
+ pass
176
+
177
+ # Add common patterns that are always ignored
178
+ common_patterns = [
179
+ '.git/', '.venv/', 'venv/', '__pycache__/', '*.pyc',
180
+ '*.pyo', '*.pyd', '.DS_Store', '*.so', '*.egg-info/'
181
+ ]
182
+ patterns.extend(common_patterns)
183
+
184
+ return patterns
185
+
186
+
187
+ def _is_ignored(path: str, patterns: List[str], root_dir: str) -> bool:
188
+ """
189
+ Check if a path should be ignored based on gitignore patterns.
190
+
191
+ Args:
192
+ path: Path to check
193
+ patterns: List of gitignore patterns
194
+ root_dir: Root directory for relative paths
195
+
196
+ Returns:
197
+ True if the path should be ignored, False otherwise
198
+ """
199
+ # Get the relative path from the root directory
200
+ rel_path = os.path.relpath(path, root_dir)
201
+
202
+ # Convert to forward slashes for consistency with gitignore patterns
203
+ rel_path = rel_path.replace(os.sep, '/')
204
+
205
+ # Add trailing slash for directories
206
+ if os.path.isdir(path) and not rel_path.endswith('/'):
207
+ rel_path += '/'
208
+
209
+ for pattern in patterns:
210
+ # Handle negation patterns (those starting with !)
211
+ if pattern.startswith('!'):
212
+ continue # Skip negation patterns for simplicity
213
+
214
+ # Handle directory-specific patterns (those ending with /)
215
+ if pattern.endswith('/'):
216
+ if os.path.isdir(path) and fnmatch.fnmatch(rel_path, pattern + '*'):
217
+ return True
218
+
219
+ # Handle file patterns
220
+ if fnmatch.fnmatch(rel_path, pattern):
221
+ return True
222
+
223
+ # Handle patterns without wildcards as path prefixes
224
+ if '*' not in pattern and '?' not in pattern and rel_path.startswith(pattern):
225
+ return True
226
+
197
227
  return False
@@ -1,88 +1,86 @@
1
- Metadata-Version: 2.2
2
- Name: janito
3
- Version: 0.10.0
4
- Summary: Janito CLI tool
5
- Author-email: João Pinto <lamego.pinto@gmail.com>
6
- Project-URL: Homepage, https://github.com/joaompinto/janito
7
- Requires-Python: >=3.8
8
- Description-Content-Type: text/markdown
9
- License-File: LICENSE
10
- Requires-Dist: typer>=0.9.0
11
- Requires-Dist: rich>=13.0.0
12
- Requires-Dist: claudine>=0.1.0
13
-
14
- # 🤖 Janito
15
-
16
- Janito is a powerful AI-assisted command-line interface (CLI) tool built with Python, leveraging Anthropic's Claude for intelligent code and file management.
17
-
18
- ## ✨ Features
19
-
20
- - 🧠 Intelligent AI assistant powered by Claude
21
- - 📁 File management capabilities
22
- - 🔍 Smart code search and editing
23
- - 💻 Interactive terminal interface with rich formatting
24
- - 📊 Token usage tracking and cost reporting
25
-
26
- ## 🛠️ Installation
27
-
28
- ```bash
29
- # Clone the repository
30
- git clone https://github.com/joaompinto/janito.git
31
- cd janito
32
-
33
- # Install the package
34
- pip install -e .
35
- ```
36
-
37
- ## 🚀 Usage
38
-
39
- After installation, you can use the `janito` command in your terminal:
40
-
41
- ```bash
42
- # Get help
43
- janito --help
44
-
45
-
46
- # Ask the AI assistant a question
47
- janito "Suggest improvements to this project"
48
-
49
- janito "Add a --version to the cli to report he version"
50
-
51
- ```
52
-
53
- ## 🔧 Available Tools
54
-
55
- Janito comes with several built-in tools:
56
- - 📄 `str_replace_editor` - View, create, and edit files
57
- - 🔎 `find_files` - Find files matching patterns
58
- - 🗑️ `delete_file` - Delete files
59
- - 🔍 `search_text` - Search for text patterns in files
60
-
61
- ## ⚙️ Requirements
62
-
63
- - Python 3.8 or higher
64
- - Dependencies:
65
- - typer (>=0.9.0)
66
- - rich (>=13.0.0)
67
- - claudine (for Claude AI integration)
68
-
69
- ## 🔑 API Key
70
-
71
- Janito requires an Anthropic API key to function. You can:
72
- 1. Set it as an environment variable: `export ANTHROPIC_API_KEY=your_api_key`
73
- 2. Or enter it when prompted
74
-
75
- ## 💻 Development
76
-
77
- ```bash
78
- # Create a virtual environment
79
- python -m venv .venv
80
- source .venv/bin/activate # On Windows: .venv\Scripts\activate
81
-
82
- # Install development dependencies
83
- pip install -e ".[dev]"
84
- ```
85
-
86
- ## 📜 License
87
-
88
- [Add your license information here]
1
+ Metadata-Version: 2.4
2
+ Name: janito
3
+ Version: 0.10.1
4
+ Summary: Janito CLI tool
5
+ Project-URL: Homepage, https://github.com/joaompinto/janito
6
+ Author-email: João Pinto <lamego.pinto@gmail.com>
7
+ License-File: LICENSE
8
+ Requires-Python: >=3.8
9
+ Requires-Dist: claudine>=0.1.0
10
+ Requires-Dist: rich>=13.0.0
11
+ Requires-Dist: typer>=0.9.0
12
+ Description-Content-Type: text/markdown
13
+
14
+ # 🤖 Janito
15
+
16
+ Janito is a powerful AI-assisted command-line interface (CLI) tool built with Python, leveraging Anthropic's Claude for intelligent code and file management.
17
+
18
+ ## ✨ Features
19
+
20
+ - 🧠 Intelligent AI assistant powered by Claude
21
+ - 📁 File management capabilities
22
+ - 🔍 Smart code search and editing
23
+ - 💻 Interactive terminal interface with rich formatting
24
+ - 📊 Token usage tracking and cost reporting
25
+
26
+ ## 🛠️ Installation
27
+
28
+ ```bash
29
+ # Install directly from PyPI
30
+ pip install janito
31
+ ```
32
+
33
+ For development or installation from source, please see [README_DEV.md](README_DEV.md).
34
+
35
+ ## 🚀 Usage
36
+
37
+ After installation, you can use the `janito` command in your terminal:
38
+
39
+ ```bash
40
+ # Get help
41
+ janito --help
42
+
43
+
44
+ # Ask the AI assistant a question
45
+ janito "Suggest improvements to this project"
46
+
47
+ janito "Add a --version to the cli to report he version"
48
+
49
+ ```
50
+
51
+ ## 🔧 Available Tools
52
+
53
+ Janito comes with several built-in tools:
54
+ - 📄 `str_replace_editor` - View, create, and edit files
55
+ - 🔎 `find_files` - Find files matching patterns
56
+ - 🗑️ `delete_file` - Delete files
57
+ - 🔍 `search_text` - Search for text patterns in files
58
+
59
+ ## ⚙️ Requirements
60
+
61
+ - Python 3.8 or higher
62
+ - Dependencies:
63
+ - typer (>=0.9.0)
64
+ - rich (>=13.0.0)
65
+ - claudine (for Claude AI integration)
66
+
67
+ ## 🔑 API Key
68
+
69
+ Janito requires an Anthropic API key to function. You can:
70
+ 1. Set it as an environment variable: `export ANTHROPIC_API_KEY=your_api_key`
71
+ 2. Or enter it when prompted
72
+
73
+ ## 💻 Development
74
+
75
+ ```bash
76
+ # Create a virtual environment
77
+ python -m venv .venv
78
+ source .venv/bin/activate # On Windows: .venv\Scripts\activate
79
+
80
+ # Install development dependencies
81
+ pip install -e ".[dev]"
82
+ ```
83
+
84
+ ## 📜 License
85
+
86
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
@@ -1,23 +1,23 @@
1
- janito/__init__.py,sha256=IZCdvdMRsovsijH7ahMc57anBJCZ7P_ZvPuYfAqSjx0,53
1
+ janito/__init__.py,sha256=Ral9Ev43UBuUjoDGLTUMJ62fAiWUC6zMMkOKTkzAQmo,53
2
2
  janito/__main__.py,sha256=gskP0c2f1Zu9VwZ9V5QjdGf20wginiuGWa33qeZVDyY,6867
3
3
  janito/callbacks.py,sha256=_kmoRR2lDPQzNLfWPPibilbna4W-abj6hMO1VFICmwY,5288
4
4
  janito/cli.py,sha256=Vbg8W79d-LEB2b4cc58a2HE-8jmZrTvaNoEg2J2543k,9381
5
5
  janito/config.py,sha256=SYaMg3sqWroTaByfxGASleMLxux3s6b-fYZnT-ggqFw,2097
6
6
  janito/test_file.py,sha256=c6GWGdTYG3z-Y5XBao9Tmhmq3G-v0L37OfwLgBo8zIU,126
7
7
  janito/token_report.py,sha256=qLCAPce90Pgh_Q5qssA7irRB1C9e9pOfBC01Wi-ZUug,4006
8
- janito/data/instructions.txt,sha256=WkPubK1wPnLG2PpsPikEf7lWQrRW8t1C5p65PV-1qC8,311
8
+ janito/data/instructions.txt,sha256=aJDhPv_iJa0s6KrwG9JSsRFpjSzJiWJSPGWhAJpsagA,257
9
9
  janito/tools/__init__.py,sha256=izLbyETR5piuFjQZ6ZY6zRgS7Tlx0yXk_wzhPn_CVYc,279
10
10
  janito/tools/decorators.py,sha256=VzUHsoxtxmsd5ic1KAW42eCOT56gjjSzWbEZTcv0RZs,2617
11
11
  janito/tools/delete_file.py,sha256=5JgSFtiF8bpfo0Z15ifj_RFHEHkl9cto1BES9TxIBIA,1245
12
12
  janito/tools/find_files.py,sha256=bN97u3VbFBA78ssXCaEo_cFloni5PE1UW6cSDP9kvjw,5993
13
- janito/tools/search_text.py,sha256=nABJJM_vEnMpVPfuLd_tIlVwCfXHTfo1e-K31a8IyJE,7674
13
+ janito/tools/search_text.py,sha256=d3iYMGHS7ZeMJxek4A_7DwMrnsWkp_XOtp3bkyNor0M,9292
14
14
  janito/tools/str_replace_editor/__init__.py,sha256=kYmscmQgft3Jzt3oCNz7k2FiRbJvku6OFDDC3Q_zoAA,144
15
15
  janito/tools/str_replace_editor/editor.py,sha256=XGrBADTlKwlcXat38T5th_KOPrspb9CBCP0g9KRuqmg,1345
16
16
  janito/tools/str_replace_editor/handlers.py,sha256=-7HJinfiJP2s-XHHVAS6TtrNwoNtTH8IJHxuLlYH2pA,12423
17
17
  janito/tools/str_replace_editor/utils.py,sha256=WOkos4bZ5Pe9U_UES6bS_QNISob0GvGN8TQVaRi6RbM,2670
18
- janito-0.10.0.dist-info/LICENSE,sha256=6-H8LXExbBIAuT4cyiE-Qy8Bad1K4pagQRVTWr6wkhk,1096
19
- janito-0.10.0.dist-info/METADATA,sha256=uCsbgd9tXAWPxt_1WDhRfnk3caPzpfIMVxVDUGaLqUI,2164
20
- janito-0.10.0.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
21
- janito-0.10.0.dist-info/entry_points.txt,sha256=JMbF_1jg-xQddidpAYkzjOKdw70fy_ymJfcmerY2wIY,47
22
- janito-0.10.0.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
23
- janito-0.10.0.dist-info/RECORD,,
18
+ janito/data/instructions.txt,sha256=aJDhPv_iJa0s6KrwG9JSsRFpjSzJiWJSPGWhAJpsagA,257
19
+ janito-0.10.1.dist-info/METADATA,sha256=UDGs3sAXllO6svDIUnTGwWoaDhziWBxSmlRV6cVmo6w,2146
20
+ janito-0.10.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
21
+ janito-0.10.1.dist-info/entry_points.txt,sha256=JMbF_1jg-xQddidpAYkzjOKdw70fy_ymJfcmerY2wIY,47
22
+ janito-0.10.1.dist-info/licenses/LICENSE,sha256=6-H8LXExbBIAuT4cyiE-Qy8Bad1K4pagQRVTWr6wkhk,1096
23
+ janito-0.10.1.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.0.0)
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
-
@@ -1 +0,0 @@
1
- janito