janito 0.8.0__py3-none-any.whl → 0.9.0__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 +5 -0
- janito/__main__.py +143 -120
- janito/callbacks.py +130 -0
- janito/cli.py +202 -0
- janito/config.py +63 -100
- janito/data/instructions.txt +6 -0
- janito/test_file.py +4 -0
- janito/token_report.py +73 -0
- janito/tools/__init__.py +10 -0
- janito/tools/decorators.py +84 -0
- janito/tools/delete_file.py +44 -0
- janito/tools/find_files.py +154 -0
- janito/tools/search_text.py +197 -0
- janito/tools/str_replace_editor/__init__.py +6 -0
- janito/tools/str_replace_editor/editor.py +43 -0
- janito/tools/str_replace_editor/handlers.py +338 -0
- janito/tools/str_replace_editor/utils.py +88 -0
- {janito-0.8.0.dist-info/licenses → janito-0.9.0.dist-info}/LICENSE +2 -2
- janito-0.9.0.dist-info/METADATA +9 -0
- janito-0.9.0.dist-info/RECORD +23 -0
- {janito-0.8.0.dist-info → janito-0.9.0.dist-info}/WHEEL +2 -1
- janito-0.9.0.dist-info/entry_points.txt +2 -0
- janito-0.9.0.dist-info/top_level.txt +1 -0
- janito/agents/__init__.py +0 -22
- janito/agents/agent.py +0 -25
- janito/agents/claudeai.py +0 -41
- janito/agents/deepseekai.py +0 -47
- janito/change/applied_blocks.py +0 -34
- janito/change/applier.py +0 -167
- janito/change/edit_blocks.py +0 -148
- janito/change/finder.py +0 -72
- janito/change/request.py +0 -144
- janito/change/validator.py +0 -87
- janito/change/view/content.py +0 -63
- janito/change/view/diff.py +0 -44
- janito/change/view/panels.py +0 -201
- janito/change/view/sections.py +0 -69
- janito/change/view/styling.py +0 -140
- janito/change/view/summary.py +0 -37
- janito/change/view/themes.py +0 -62
- janito/change/view/viewer.py +0 -59
- janito/cli/__init__.py +0 -2
- janito/cli/commands.py +0 -68
- janito/cli/functions.py +0 -66
- janito/common.py +0 -133
- janito/data/change_prompt.txt +0 -81
- janito/data/system_prompt.txt +0 -3
- janito/qa.py +0 -56
- janito/version.py +0 -23
- janito/workspace/__init__.py +0 -8
- janito/workspace/analysis.py +0 -121
- janito/workspace/models.py +0 -97
- janito/workspace/show.py +0 -115
- janito/workspace/stats.py +0 -42
- janito/workspace/workset.py +0 -135
- janito/workspace/workspace.py +0 -335
- janito-0.8.0.dist-info/METADATA +0 -106
- janito-0.8.0.dist-info/RECORD +0 -40
- janito-0.8.0.dist-info/entry_points.txt +0 -2
janito/workspace/workspace.py
DELETED
@@ -1,335 +0,0 @@
|
|
1
|
-
from pathlib import Path
|
2
|
-
from typing import List, Set, Dict, Optional, Tuple
|
3
|
-
import time
|
4
|
-
from rich.console import Console
|
5
|
-
from janito.config import config
|
6
|
-
from .models import WorksetContent, FileInfo, ScanPath # Add ScanPath import
|
7
|
-
import tempfile
|
8
|
-
import shutil
|
9
|
-
import pathspec
|
10
|
-
|
11
|
-
class PathNotRelativeError(Exception):
|
12
|
-
"""Raised when a path is not relative."""
|
13
|
-
pass
|
14
|
-
|
15
|
-
class Workspace:
|
16
|
-
"""Handles workspace scanning and content management."""
|
17
|
-
|
18
|
-
_instance = None
|
19
|
-
|
20
|
-
def __new__(cls):
|
21
|
-
if cls._instance is None:
|
22
|
-
cls._instance = super().__new__(cls)
|
23
|
-
cls._instance._initialized = False
|
24
|
-
return cls._instance
|
25
|
-
|
26
|
-
def __init__(self):
|
27
|
-
if not self._initialized:
|
28
|
-
self._content = WorksetContent()
|
29
|
-
self._root_dirs: Set[Path] = set()
|
30
|
-
self._initialized = True
|
31
|
-
|
32
|
-
def scan_files(self, paths: List[Path], recursive_paths: Set[Path]) -> None:
|
33
|
-
"""Scan files from given paths and update content.
|
34
|
-
|
35
|
-
Args:
|
36
|
-
paths: List of paths to scan
|
37
|
-
recursive_paths: Set of paths to scan recursively
|
38
|
-
"""
|
39
|
-
for path in paths:
|
40
|
-
if path.is_absolute():
|
41
|
-
raise PathNotRelativeError(f"Path must be relative: {path}")
|
42
|
-
|
43
|
-
scan_time = time.time()
|
44
|
-
|
45
|
-
if config.debug:
|
46
|
-
console = Console(stderr=True)
|
47
|
-
console.print(f"\n[cyan]Debug: Starting scan of {len(paths)} paths[/cyan]")
|
48
|
-
|
49
|
-
# Find root directories if scanning workspace root
|
50
|
-
if not config.skip_work and Path(".") in paths:
|
51
|
-
self._root_dirs = {
|
52
|
-
path.relative_to(config.workspace_dir)
|
53
|
-
for path in config.workspace_dir.iterdir()
|
54
|
-
if path.is_dir() and not path.name.startswith('.')
|
55
|
-
}
|
56
|
-
if config.debug:
|
57
|
-
Console(stderr=True).print(f"[cyan]Debug: Found root directories: {self._root_dirs}[/cyan]")
|
58
|
-
|
59
|
-
processed_files: Set[Path] = set()
|
60
|
-
for path in paths:
|
61
|
-
abs_path = config.workspace_dir / path
|
62
|
-
# Skip workspace root if skip_work is enabled
|
63
|
-
if config.skip_work and path == Path("."):
|
64
|
-
if config.debug:
|
65
|
-
Console(stderr=True).print("[cyan]Debug: Skipping workspace root due to skip_work[/cyan]")
|
66
|
-
continue
|
67
|
-
self._scan_path(abs_path, processed_files, scan_time, recursive_paths)
|
68
|
-
|
69
|
-
self._content.scan_completed = True
|
70
|
-
self._content.analyzed = False
|
71
|
-
self._content.scanned_paths = set(paths)
|
72
|
-
|
73
|
-
def _scan_path(self, path: Path, processed_files: Set[Path], scan_time: float,
|
74
|
-
recursive_paths: Set[Path]) -> None:
|
75
|
-
"""Scan a single path and process its contents."""
|
76
|
-
if path in processed_files:
|
77
|
-
return
|
78
|
-
|
79
|
-
# Convert recursive_paths to absolute for comparison
|
80
|
-
abs_recursive_paths = {config.workspace_dir / p for p in recursive_paths}
|
81
|
-
|
82
|
-
path = path.resolve()
|
83
|
-
processed_files.add(path)
|
84
|
-
|
85
|
-
if path.is_dir():
|
86
|
-
try:
|
87
|
-
for item in path.iterdir():
|
88
|
-
if item.name.startswith(('.', '__pycache__')):
|
89
|
-
continue
|
90
|
-
if path in abs_recursive_paths:
|
91
|
-
self._scan_path(item, processed_files, scan_time, recursive_paths)
|
92
|
-
elif item.is_file():
|
93
|
-
self._scan_path(item, processed_files, scan_time, recursive_paths)
|
94
|
-
except PermissionError:
|
95
|
-
if config.debug:
|
96
|
-
Console(stderr=True).print(f"[red]Debug: Permission denied: {path}[/red]")
|
97
|
-
elif path.is_file():
|
98
|
-
self._process_file(path, scan_time)
|
99
|
-
|
100
|
-
def _process_file(self, path: Path, scan_time: float, force_update: bool = False) -> None:
|
101
|
-
"""Process a single file and add it to the content."""
|
102
|
-
try:
|
103
|
-
# Check if file has supported extension or no extension
|
104
|
-
supported_extensions = {
|
105
|
-
'.py', '.md', '.txt', '.json', '.yaml', '.yml', '.toml',
|
106
|
-
'.html', '.htm', '.css', '.js'
|
107
|
-
}
|
108
|
-
if path.suffix.lower() in supported_extensions or not path.suffix:
|
109
|
-
content = path.read_text(encoding='utf-8')
|
110
|
-
rel_path = path.relative_to(config.workspace_dir)
|
111
|
-
|
112
|
-
# Check if file already exists in content
|
113
|
-
existing_files = [f for f in self._content.files if f.name == str(rel_path)]
|
114
|
-
if existing_files and not force_update:
|
115
|
-
if config.debug:
|
116
|
-
Console(stderr=True).print(f"[yellow]Debug: Skipping duplicate file: {rel_path}[/yellow]")
|
117
|
-
return
|
118
|
-
elif existing_files:
|
119
|
-
# Update existing file content
|
120
|
-
existing_files[0].content = content
|
121
|
-
existing_files[0].seconds_ago = int(scan_time - path.stat().st_mtime)
|
122
|
-
if config.debug:
|
123
|
-
Console(stderr=True).print(f"[cyan]Debug: Updated content: {rel_path}[/cyan]")
|
124
|
-
else:
|
125
|
-
# Add new file
|
126
|
-
seconds_ago = int(scan_time - path.stat().st_mtime)
|
127
|
-
file_info = FileInfo(
|
128
|
-
name=str(rel_path),
|
129
|
-
content=content,
|
130
|
-
seconds_ago=seconds_ago
|
131
|
-
)
|
132
|
-
self._content.add_file(file_info)
|
133
|
-
if config.debug:
|
134
|
-
Console(stderr=True).print(f"[cyan]Debug: Added file: {rel_path}[/cyan]")
|
135
|
-
|
136
|
-
except (UnicodeDecodeError, PermissionError) as e:
|
137
|
-
if config.debug:
|
138
|
-
Console(stderr=True).print(f"[red]Debug: Error reading file {path}: {str(e)}[/red]")
|
139
|
-
|
140
|
-
def create_file(self, path: Path, content: str) -> None:
|
141
|
-
"""Create a new file in the workspace.
|
142
|
-
|
143
|
-
Args:
|
144
|
-
path: Relative path to the file to create
|
145
|
-
content: Content to write to the file
|
146
|
-
|
147
|
-
Raises:
|
148
|
-
PathNotRelativeError: If path is absolute
|
149
|
-
FileExistsError: If file already exists
|
150
|
-
OSError: If parent directory creation fails
|
151
|
-
"""
|
152
|
-
if path.is_absolute():
|
153
|
-
raise PathNotRelativeError(f"Path must be relative: {path}")
|
154
|
-
|
155
|
-
abs_path = config.workspace_dir / path
|
156
|
-
|
157
|
-
if abs_path.exists():
|
158
|
-
raise FileExistsError(f"File already exists: {path}")
|
159
|
-
|
160
|
-
# Create parent directories if they don't exist
|
161
|
-
abs_path.parent.mkdir(parents=True, exist_ok=True)
|
162
|
-
|
163
|
-
# Write the file
|
164
|
-
abs_path.write_text(content, encoding='utf-8')
|
165
|
-
|
166
|
-
if config.debug:
|
167
|
-
Console(stderr=True).print(f"[green]Debug: Created file: {path}[/green]")
|
168
|
-
|
169
|
-
# Add to workspace content
|
170
|
-
scan_time = time.time()
|
171
|
-
self._process_file(abs_path, scan_time)
|
172
|
-
|
173
|
-
def clear(self) -> None:
|
174
|
-
"""Clear all workspace content and settings."""
|
175
|
-
self._content = WorksetContent()
|
176
|
-
|
177
|
-
@property
|
178
|
-
def content(self) -> WorksetContent:
|
179
|
-
"""Get the workspace content."""
|
180
|
-
return self._content
|
181
|
-
|
182
|
-
@property
|
183
|
-
def root_directories(self) -> Set[Path]:
|
184
|
-
"""Get the directories found at the workspace root."""
|
185
|
-
return self._root_dirs
|
186
|
-
|
187
|
-
def modify_file(self, path: Path, content: str) -> None:
|
188
|
-
"""Modify an existing file in the workspace.
|
189
|
-
|
190
|
-
Args:
|
191
|
-
path: Relative path to the file to modify
|
192
|
-
content: New content for the file
|
193
|
-
|
194
|
-
Raises:
|
195
|
-
PathNotRelativeError: If path is absolute
|
196
|
-
FileNotFoundError: If file doesn't exist
|
197
|
-
OSError: If write fails
|
198
|
-
"""
|
199
|
-
if path.is_absolute():
|
200
|
-
raise PathNotRelativeError(f"Path must be relative: {path}")
|
201
|
-
|
202
|
-
abs_path = config.workspace_dir / path
|
203
|
-
|
204
|
-
if not abs_path.exists():
|
205
|
-
raise FileNotFoundError(f"File does not exist: {path}")
|
206
|
-
|
207
|
-
# Write the file
|
208
|
-
abs_path.write_text(content, encoding='utf-8')
|
209
|
-
|
210
|
-
if config.debug:
|
211
|
-
Console(stderr=True).print(f"[green]Debug: Modified file: {path}[/green]")
|
212
|
-
|
213
|
-
# Update workspace content
|
214
|
-
scan_time = time.time()
|
215
|
-
self._process_file(abs_path, scan_time, force_update=True)
|
216
|
-
|
217
|
-
def setup_preview_directory(self) -> None:
|
218
|
-
"""Setup the preview directory with workspace contents.
|
219
|
-
|
220
|
-
Creates a copy of the current workspace contents in the preview directory.
|
221
|
-
Respects .gitignore patterns and excludes .git directory.
|
222
|
-
"""
|
223
|
-
self._preview_dir = Path(tempfile.mkdtemp(prefix='janito_preview_'))
|
224
|
-
|
225
|
-
# Read .gitignore if it exists
|
226
|
-
gitignore_path = config.workspace_dir / '.gitignore'
|
227
|
-
if (gitignore_path.exists()):
|
228
|
-
gitignore = gitignore_path.read_text().splitlines()
|
229
|
-
# Always ignore .git directory
|
230
|
-
gitignore.append('.git')
|
231
|
-
spec = pathspec.PathSpec.from_lines('gitwildmatch', gitignore)
|
232
|
-
else:
|
233
|
-
# If no .gitignore exists, only ignore .git
|
234
|
-
spec = pathspec.PathSpec.from_lines('gitwildmatch', ['.git'])
|
235
|
-
|
236
|
-
# Copy workspace contents to preview directory
|
237
|
-
for item in config.workspace_dir.iterdir():
|
238
|
-
# Get relative path for gitignore matching
|
239
|
-
rel_path = item.relative_to(config.workspace_dir)
|
240
|
-
|
241
|
-
# Skip if matches gitignore patterns
|
242
|
-
if spec.match_file(str(rel_path)):
|
243
|
-
continue
|
244
|
-
|
245
|
-
# Skip hidden files/directories except .gitignore
|
246
|
-
if item.name.startswith('.') and item.name != '.gitignore':
|
247
|
-
continue
|
248
|
-
|
249
|
-
if item.is_dir():
|
250
|
-
# For directories, we need to filter contents based on gitignore
|
251
|
-
def copy_filtered(src, dst):
|
252
|
-
shutil.copytree(
|
253
|
-
src,
|
254
|
-
dst,
|
255
|
-
ignore=lambda d, files: [
|
256
|
-
f for f in files
|
257
|
-
if spec.match_file(str(Path(d).relative_to(config.workspace_dir) / f))
|
258
|
-
]
|
259
|
-
)
|
260
|
-
|
261
|
-
copy_filtered(item, self._preview_dir / item.name)
|
262
|
-
else:
|
263
|
-
shutil.copy2(item, self._preview_dir / item.name)
|
264
|
-
|
265
|
-
return self._preview_dir
|
266
|
-
|
267
|
-
|
268
|
-
def preview_create_file(self, path: Path, content: str) -> None:
|
269
|
-
"""Create a new file in the preview directory.
|
270
|
-
|
271
|
-
Args:
|
272
|
-
path: Relative path to the file to create
|
273
|
-
content: Content to write to the file
|
274
|
-
"""
|
275
|
-
preview_path = self.get_preview_path(path)
|
276
|
-
preview_path.parent.mkdir(parents=True, exist_ok=True)
|
277
|
-
preview_path.write_text(content, encoding='utf-8')
|
278
|
-
|
279
|
-
def preview_modify_file(self, path: Path, content: str) -> None:
|
280
|
-
"""Modify a file in the preview directory.
|
281
|
-
|
282
|
-
Args:
|
283
|
-
path: Relative path to the file to modify
|
284
|
-
content: New content for the file
|
285
|
-
"""
|
286
|
-
preview_path = self.get_preview_path(path)
|
287
|
-
if not preview_path.exists():
|
288
|
-
raise FileNotFoundError(f"File does not exist in preview: {path}")
|
289
|
-
preview_path.write_text(content, encoding='utf-8')
|
290
|
-
|
291
|
-
def get_preview_path(self, path: Path) -> Path:
|
292
|
-
"""Get the path to the preview directory."""
|
293
|
-
return self._preview_dir / path
|
294
|
-
|
295
|
-
def delete_file(self, path: Path) -> None:
|
296
|
-
"""Delete a file from the workspace.
|
297
|
-
|
298
|
-
Args:
|
299
|
-
path: Relative path to the file to delete
|
300
|
-
|
301
|
-
Raises:
|
302
|
-
PathNotRelativeError: If path is absolute
|
303
|
-
FileNotFoundError: If file doesn't exist
|
304
|
-
"""
|
305
|
-
if path.is_absolute():
|
306
|
-
raise PathNotRelativeError(f"Path must be relative: {path}")
|
307
|
-
|
308
|
-
abs_path = config.workspace_dir / path
|
309
|
-
|
310
|
-
if not abs_path.exists():
|
311
|
-
raise FileNotFoundError(f"File does not exist: {path}")
|
312
|
-
|
313
|
-
# Delete the file
|
314
|
-
abs_path.unlink()
|
315
|
-
|
316
|
-
if config.debug:
|
317
|
-
Console(stderr=True).print(f"[green]Debug: Deleted file: {path}[/green]")
|
318
|
-
|
319
|
-
def apply_changes(self, preview_dir: Path, created_files: List[Path], modified_files: Set[Path], deleted_files: Set[Path]):
|
320
|
-
"""Apply changes from preview directory to workspace."""
|
321
|
-
for filename in created_files:
|
322
|
-
content = (preview_dir / filename).read_text(encoding='utf-8')
|
323
|
-
self.create_file(filename, content)
|
324
|
-
print("Created workspace file: ", filename)
|
325
|
-
|
326
|
-
for filename in modified_files:
|
327
|
-
content = (preview_dir / filename).read_text(encoding='utf-8')
|
328
|
-
self.modify_file(filename, content)
|
329
|
-
print("Modified workspace file: ", filename) # This will now include cleaned files
|
330
|
-
|
331
|
-
for filename in deleted_files:
|
332
|
-
self.delete_file(filename)
|
333
|
-
print("Deleted workspace file: ", filename)
|
334
|
-
|
335
|
-
|
janito-0.8.0.dist-info/METADATA
DELETED
@@ -1,106 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.4
|
2
|
-
Name: janito
|
3
|
-
Version: 0.8.0
|
4
|
-
Summary: A CLI tool for software development tasks powered by AI
|
5
|
-
Project-URL: Homepage, https://github.com/joaompinto/janito
|
6
|
-
Project-URL: Repository, https://github.com/joaompinto/janito.git
|
7
|
-
Author-email: João Pinto <lamego.pinto@gmail.com>
|
8
|
-
License: MIT
|
9
|
-
License-File: LICENSE
|
10
|
-
Classifier: Development Status :: 4 - Beta
|
11
|
-
Classifier: Environment :: Console
|
12
|
-
Classifier: Intended Audience :: Developers
|
13
|
-
Classifier: License :: OSI Approved :: MIT License
|
14
|
-
Classifier: Programming Language :: Python :: 3.8
|
15
|
-
Classifier: Programming Language :: Python :: 3.9
|
16
|
-
Classifier: Programming Language :: Python :: 3.10
|
17
|
-
Classifier: Topic :: Software Development
|
18
|
-
Requires-Python: >=3.8
|
19
|
-
Requires-Dist: anthropic
|
20
|
-
Requires-Dist: pathspec
|
21
|
-
Requires-Dist: tomli
|
22
|
-
Requires-Dist: typer
|
23
|
-
Description-Content-Type: text/markdown
|
24
|
-
|
25
|
-
# 🤖 Janito
|
26
|
-
|
27
|
-
[](https://badge.fury.io/py/janito)
|
28
|
-
[](https://pypi.org/project/janito/)
|
29
|
-
[](https://opensource.org/licenses/MIT)
|
30
|
-
|
31
|
-
Janito is an AI-powered CLI tool designed to help developers manage and modify their codebase with ease. It leverages advanced AI models to understand and transform your code intelligently.
|
32
|
-
|
33
|
-
## ✨ Features
|
34
|
-
|
35
|
-
### 🔄 Code Modifications
|
36
|
-
- **Smart Code Changes**: Automated code modifications with AI understanding
|
37
|
-
- **Context-Aware**: Considers your entire codebase for accurate changes
|
38
|
-
- **Preview & Validate**: Review changes before applying them
|
39
|
-
|
40
|
-
### 💡 Code Analysis
|
41
|
-
- **Intelligent Queries**: Ask questions about your codebase
|
42
|
-
- **Deep Understanding**: Get detailed explanations about code functionality
|
43
|
-
- **Context-Rich Responses**: Answers based on your actual code
|
44
|
-
|
45
|
-
### ⚙️ Easy Configuration
|
46
|
-
- **Multiple AI Backends**: Support for Claude and DeepSeek AI
|
47
|
-
- **Flexible Setup**: Simple environment variable configuration
|
48
|
-
- **Workspace Control**: Fine-grained control over scanned files
|
49
|
-
|
50
|
-
## 🚀 Installation
|
51
|
-
|
52
|
-
### Prerequisites
|
53
|
-
- Python 3.8 or higher
|
54
|
-
- pip package manager
|
55
|
-
|
56
|
-
### Install from PyPI
|
57
|
-
```bash
|
58
|
-
pip install janito
|
59
|
-
```
|
60
|
-
|
61
|
-
## 🔧 Configuration
|
62
|
-
|
63
|
-
Set up your preferred AI backend using environment variables:
|
64
|
-
|
65
|
-
### For Claude AI
|
66
|
-
```bash
|
67
|
-
export ANTHROPIC_API_KEY=your_api_key
|
68
|
-
export AI_BACKEND=claudeai # Optional, detected from API key
|
69
|
-
```
|
70
|
-
|
71
|
-
### For DeepSeek AI
|
72
|
-
```bash
|
73
|
-
export DEEPSEEK_API_KEY=your_api_key
|
74
|
-
export AI_BACKEND=deepseekai # Optional, detected from API key
|
75
|
-
```
|
76
|
-
|
77
|
-
## 📖 Usage
|
78
|
-
|
79
|
-
### Basic Commands
|
80
|
-
|
81
|
-
1. **Ask Questions**
|
82
|
-
```bash
|
83
|
-
janito --ask "How does the error handling work in this codebase?"
|
84
|
-
```
|
85
|
-
|
86
|
-
2. **Request Changes**
|
87
|
-
```bash
|
88
|
-
janito "Add error handling to the process_data function"
|
89
|
-
```
|
90
|
-
|
91
|
-
3. **Preview Files**
|
92
|
-
```bash
|
93
|
-
janito --scan
|
94
|
-
```
|
95
|
-
|
96
|
-
### Advanced Options
|
97
|
-
|
98
|
-
- **Workspace Directory**: `-w, --workspace_dir PATH`
|
99
|
-
- **Include Paths**: `-i, --include PATH`
|
100
|
-
- **Recursive Scan**: `-r, --recursive PATH`
|
101
|
-
- **Debug Mode**: `--debug`
|
102
|
-
- **Verbose Output**: `--verbose`
|
103
|
-
|
104
|
-
## 📝 License
|
105
|
-
|
106
|
-
This project is licensed under the MIT License - see the LICENSE file for details.
|
janito-0.8.0.dist-info/RECORD
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
janito/__main__.py,sha256=xYzdqkp-7L39F1aS7clcAFmdy_wwN-xFhrMSJJO3LZw,5640
|
2
|
-
janito/common.py,sha256=OiOVIP34cna6i6Kc0kTGKM8jx9pudvOuapmkkDl8bpA,5114
|
3
|
-
janito/config.py,sha256=3HNnlwLC6BxLHSMT-7PpG0rJekaJtZGLS8ZUmC-4hVg,3163
|
4
|
-
janito/qa.py,sha256=iv53YOCtoT0-gUDDStL_WArxh0fqcbq3meZHFtUXOH4,1689
|
5
|
-
janito/version.py,sha256=IEZ9-3cWXfCUmhFoP_LX02zvFfirWvYLDaRWJTHEh0s,761
|
6
|
-
janito/agents/__init__.py,sha256=R4nHZ31OhqanLaHlFFtaz2FMTsFhhW74QvmvGfkdtpo,728
|
7
|
-
janito/agents/agent.py,sha256=EZVtipg5WLbHR8JtwWMZaPWLtMvtlnEF8mY6kTvgg-Y,722
|
8
|
-
janito/agents/claudeai.py,sha256=Cl-9eSDtVNMEW32Lp8XMUHyCKnBqtRYd4jn67drz8w8,1384
|
9
|
-
janito/agents/deepseekai.py,sha256=viPI7xMdl_4tU9JbLtYpWUXZ-03M8rHQlqXN4aC0Xpo,1667
|
10
|
-
janito/change/applied_blocks.py,sha256=IIYM_CBHyjBbG4YfU_g5CAjfSafCQh4J_EyljyByLjM,1040
|
11
|
-
janito/change/applier.py,sha256=ByVfURYq6iFn5BQyPOfEbGvJfLzty6PgiuWZN9quE10,7266
|
12
|
-
janito/change/edit_blocks.py,sha256=i3Ka_zHJRjaV-iInAH0uJV0QAtV0mvzRFDqDmaR7oRw,5483
|
13
|
-
janito/change/finder.py,sha256=PhXA_3dNwDSgseEVdphIpo14n1zgbgqwGw4bD4EiRk4,2786
|
14
|
-
janito/change/request.py,sha256=W1-yuzO385rNPuUozlSh_g8nDToKuwZaRkk7Mxo0TKQ,5904
|
15
|
-
janito/change/validator.py,sha256=2E6kNKzWnu6QYuhYN9SAu4TNKuDJXf3KDQuG4AryTpg,3277
|
16
|
-
janito/change/view/content.py,sha256=Yl_llNnxmnfgaaPGod1Q1sW85Rievhm9d1ZQFpMVSTo,1594
|
17
|
-
janito/change/view/diff.py,sha256=32DPm4e-bt8qljvgV-5hGICrmxBiOCQLE0dhF63vJ9k,1859
|
18
|
-
janito/change/view/panels.py,sha256=-MzpzElAtyObtioloAVGnhJMwEWAHwvh9kjnrR1VF9w,6643
|
19
|
-
janito/change/view/sections.py,sha256=SrqWfmNHWbV4JvW_p7ynEoNvJUpiRg-IGVi4MLU1E-Q,2829
|
20
|
-
janito/change/view/styling.py,sha256=Mze3WCn_6OPhKI6RFtjiqZJFNP3f-W_OPAI4Qwd_zGw,5483
|
21
|
-
janito/change/view/summary.py,sha256=zCxyH_0TN4SPOikXYQEsKasBYX-8ELit62cupbTNCD4,1409
|
22
|
-
janito/change/view/themes.py,sha256=g1VURi51siZrVnN8eE8Dh3lfh4lvoLCDpOHfXZ-4iss,1774
|
23
|
-
janito/change/view/viewer.py,sha256=wAa_2mYS_ihZckpZ2VKFKf4TiXusnRAS6aNbEinqYWk,2165
|
24
|
-
janito/cli/__init__.py,sha256=2tXs98pDDXyU-QTLJ-QpUKpjJJvxObRDGIgRtesVQP4,78
|
25
|
-
janito/cli/commands.py,sha256=-PUmDBRdvOPgwmY9orbWAkUEyW5HgUyINotapG8I3L8,1826
|
26
|
-
janito/cli/functions.py,sha256=c3-HtIKzKpSebewFCWBhaR0BFCttHyvA2xeACSPUgRw,2543
|
27
|
-
janito/data/change_prompt.txt,sha256=iGPjxWvFBkxyCzny_9E6cSUg74c0gHenBNoga6YW7EM,3357
|
28
|
-
janito/data/system_prompt.txt,sha256=ySqjFj9bbJJC6xNaX9gOAEbLp08Jc9ckUEtu7bSQGkA,161
|
29
|
-
janito/workspace/__init__.py,sha256=KlU4uajYszb8qmvAhJDzOT4J9Uf04MoomrePP_wlBgI,188
|
30
|
-
janito/workspace/analysis.py,sha256=pRzYzBm6OqaQ8MTlbZeeDXQkRjEKFLfN-fz3EUw1sQQ,4204
|
31
|
-
janito/workspace/models.py,sha256=A4Hry2N1ZHMsZ60Vmi2ovR1oL7lEUGyiPWhcGxS5fSs,3283
|
32
|
-
janito/workspace/show.py,sha256=ReJ97X6DBLiIcfHpTK6TZ6RLZ5g_U-2y8BIDHHBJGWk,3885
|
33
|
-
janito/workspace/stats.py,sha256=0uOcyjoz_ZdtJK0thcZsvqULxYaZSVSsAtuK8k_57ps,1299
|
34
|
-
janito/workspace/workset.py,sha256=qDtxUwjIbg87VfSmHMXfVfQ28uIeWrpvCC24XtvVNbw,4302
|
35
|
-
janito/workspace/workspace.py,sha256=aXs37H-hfFQEGoAQJzQKB_wH0zCkxqVv2YiE8hPzjdQ,13565
|
36
|
-
janito-0.8.0.dist-info/METADATA,sha256=s1PMT0iTn91rMzCa11ANf-UH2DNmhEoY97l6x6KUz2U,3156
|
37
|
-
janito-0.8.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
38
|
-
janito-0.8.0.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
|
39
|
-
janito-0.8.0.dist-info/licenses/LICENSE,sha256=agBzvmwXtxr2qfxpwmoi8VabRb2AXflZeTZA3AjZeJE,1082
|
40
|
-
janito-0.8.0.dist-info/RECORD,,
|