janito 1.8.1__py3-none-any.whl → 1.10.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 +1 -1
- janito/agent/api_exceptions.py +4 -0
- janito/agent/config.py +1 -1
- janito/agent/config_defaults.py +2 -3
- janito/agent/config_utils.py +0 -9
- janito/agent/conversation.py +177 -114
- janito/agent/conversation_api.py +179 -159
- janito/agent/conversation_tool_calls.py +11 -8
- janito/agent/llm_conversation_history.py +70 -0
- janito/agent/openai_client.py +44 -21
- janito/agent/openai_schema_generator.py +164 -128
- janito/agent/platform_discovery.py +134 -77
- janito/agent/profile_manager.py +5 -5
- janito/agent/rich_message_handler.py +80 -31
- janito/agent/templates/profiles/system_prompt_template_base.txt.j2 +9 -8
- janito/agent/test_openai_schema_generator.py +93 -0
- janito/agent/tool_base.py +7 -2
- janito/agent/tool_executor.py +63 -50
- janito/agent/tool_registry.py +5 -2
- janito/agent/tool_use_tracker.py +42 -5
- janito/agent/tools/__init__.py +13 -12
- janito/agent/tools/create_directory.py +9 -6
- janito/agent/tools/create_file.py +35 -54
- janito/agent/tools/delete_text_in_file.py +97 -0
- janito/agent/tools/fetch_url.py +50 -5
- janito/agent/tools/find_files.py +40 -26
- janito/agent/tools/get_file_outline/__init__.py +1 -0
- janito/agent/tools/{outline_file/__init__.py → get_file_outline/core.py} +14 -18
- janito/agent/tools/get_file_outline/python_outline.py +134 -0
- janito/agent/tools/{search_outline.py → get_file_outline/search_outline.py} +11 -0
- janito/agent/tools/get_lines.py +21 -12
- janito/agent/tools/move_file.py +13 -12
- janito/agent/tools/present_choices.py +3 -1
- janito/agent/tools/python_command_runner.py +150 -0
- janito/agent/tools/python_file_runner.py +148 -0
- janito/agent/tools/python_stdin_runner.py +154 -0
- janito/agent/tools/remove_directory.py +4 -2
- janito/agent/tools/remove_file.py +15 -13
- janito/agent/tools/replace_file.py +72 -0
- janito/agent/tools/replace_text_in_file.py +7 -5
- janito/agent/tools/run_bash_command.py +29 -72
- janito/agent/tools/run_powershell_command.py +142 -102
- janito/agent/tools/search_text.py +177 -131
- janito/agent/tools/validate_file_syntax/__init__.py +1 -0
- janito/agent/tools/validate_file_syntax/core.py +94 -0
- janito/agent/tools/validate_file_syntax/css_validator.py +35 -0
- janito/agent/tools/validate_file_syntax/html_validator.py +77 -0
- janito/agent/tools/validate_file_syntax/js_validator.py +27 -0
- janito/agent/tools/validate_file_syntax/json_validator.py +6 -0
- janito/agent/tools/validate_file_syntax/markdown_validator.py +66 -0
- janito/agent/tools/validate_file_syntax/ps1_validator.py +32 -0
- janito/agent/tools/validate_file_syntax/python_validator.py +5 -0
- janito/agent/tools/validate_file_syntax/xml_validator.py +11 -0
- janito/agent/tools/validate_file_syntax/yaml_validator.py +6 -0
- janito/agent/tools_utils/__init__.py +1 -0
- janito/agent/tools_utils/action_type.py +7 -0
- janito/agent/tools_utils/dir_walk_utils.py +24 -0
- janito/agent/tools_utils/formatting.py +49 -0
- janito/agent/tools_utils/gitignore_utils.py +69 -0
- janito/agent/tools_utils/test_gitignore_utils.py +46 -0
- janito/agent/tools_utils/utils.py +30 -0
- janito/cli/_livereload_log_utils.py +13 -0
- janito/cli/_print_config.py +63 -61
- janito/cli/arg_parser.py +57 -14
- janito/cli/cli_main.py +270 -0
- janito/cli/livereload_starter.py +60 -0
- janito/cli/main.py +166 -99
- janito/cli/one_shot.py +80 -0
- janito/cli/termweb_starter.py +2 -2
- janito/i18n/__init__.py +1 -1
- janito/livereload/app.py +25 -0
- janito/rich_utils.py +41 -25
- janito/{cli_chat_shell → shell}/commands/__init__.py +19 -14
- janito/{cli_chat_shell → shell}/commands/config.py +4 -4
- janito/shell/commands/conversation_restart.py +74 -0
- janito/shell/commands/edit.py +24 -0
- janito/shell/commands/history_view.py +18 -0
- janito/{cli_chat_shell → shell}/commands/lang.py +3 -0
- janito/shell/commands/livelogs.py +42 -0
- janito/{cli_chat_shell → shell}/commands/prompt.py +16 -6
- janito/shell/commands/session.py +35 -0
- janito/{cli_chat_shell → shell}/commands/session_control.py +3 -5
- janito/{cli_chat_shell → shell}/commands/termweb_log.py +18 -10
- janito/shell/commands/tools.py +26 -0
- janito/shell/commands/track.py +36 -0
- janito/shell/commands/utility.py +28 -0
- janito/{cli_chat_shell → shell}/commands/verbose.py +4 -5
- janito/shell/commands.py +40 -0
- janito/shell/input_history.py +62 -0
- janito/shell/main.py +257 -0
- janito/{cli_chat_shell/shell_command_completer.py → shell/prompt/completer.py} +1 -1
- janito/{cli_chat_shell/chat_ui.py → shell/prompt/session_setup.py} +19 -5
- janito/shell/session/manager.py +101 -0
- janito/{cli_chat_shell/ui.py → shell/ui/interactive.py} +23 -17
- janito/termweb/app.py +3 -3
- janito/termweb/static/editor.css +142 -0
- janito/termweb/static/editor.css.bak +27 -0
- janito/termweb/static/editor.html +15 -213
- janito/termweb/static/editor.html.bak +16 -215
- janito/termweb/static/editor.js +209 -0
- janito/termweb/static/editor.js.bak +227 -0
- janito/termweb/static/index.html +2 -3
- janito/termweb/static/index.html.bak +2 -3
- janito/termweb/static/termweb.css.bak +33 -84
- janito/termweb/static/termweb.js +15 -34
- janito/termweb/static/termweb.js.bak +18 -36
- janito/tests/test_rich_utils.py +44 -0
- janito/web/app.py +0 -75
- {janito-1.8.1.dist-info → janito-1.10.0.dist-info}/METADATA +62 -42
- janito-1.10.0.dist-info/RECORD +158 -0
- {janito-1.8.1.dist-info → janito-1.10.0.dist-info}/WHEEL +1 -1
- janito/agent/tools/dir_walk_utils.py +0 -16
- janito/agent/tools/gitignore_utils.py +0 -46
- janito/agent/tools/memory.py +0 -48
- janito/agent/tools/outline_file/formatting.py +0 -20
- janito/agent/tools/outline_file/python_outline.py +0 -71
- janito/agent/tools/present_choices_test.py +0 -18
- janito/agent/tools/rich_live.py +0 -44
- janito/agent/tools/run_python_command.py +0 -163
- janito/agent/tools/tools_utils.py +0 -56
- janito/agent/tools/utils.py +0 -33
- janito/agent/tools/validate_file_syntax.py +0 -163
- janito/cli/runner/cli_main.py +0 -180
- janito/cli_chat_shell/chat_loop.py +0 -163
- janito/cli_chat_shell/chat_state.py +0 -38
- janito/cli_chat_shell/commands/history_start.py +0 -37
- janito/cli_chat_shell/commands/session.py +0 -48
- janito/cli_chat_shell/commands/sum.py +0 -49
- janito/cli_chat_shell/commands/utility.py +0 -32
- janito/cli_chat_shell/session_manager.py +0 -72
- janito-1.8.1.dist-info/RECORD +0 -127
- /janito/agent/tools/{outline_file → get_file_outline}/markdown_outline.py +0 -0
- /janito/cli/{runner/_termweb_log_utils.py → _termweb_log_utils.py} +0 -0
- /janito/cli/{runner/config.py → config_runner.py} +0 -0
- /janito/cli/{runner/formatting.py → formatting_runner.py} +0 -0
- /janito/{cli/runner → shell}/__init__.py +0 -0
- /janito/{cli_chat_shell → shell/prompt}/load_prompt.py +0 -0
- /janito/{cli_chat_shell/config_shell.py → shell/session/config.py} +0 -0
- /janito/{cli_chat_shell/__init__.py → shell/session/history.py} +0 -0
- {janito-1.8.1.dist-info → janito-1.10.0.dist-info}/entry_points.txt +0 -0
- {janito-1.8.1.dist-info → janito-1.10.0.dist-info}/licenses/LICENSE +0 -0
- {janito-1.8.1.dist-info → janito-1.10.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: janito
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.10.0
|
4
4
|
Summary: Natural Language Coding Agent,
|
5
5
|
Author-email: João Pinto <joao.pinto@gmail.com>
|
6
6
|
License-Expression: MIT
|
@@ -22,6 +22,7 @@ Requires-Dist: prompt_toolkit
|
|
22
22
|
Requires-Dist: requests
|
23
23
|
Requires-Dist: rich
|
24
24
|
Requires-Dist: toml
|
25
|
+
Requires-Dist: lxml
|
25
26
|
Provides-Extra: docs
|
26
27
|
Requires-Dist: mkdocs>=1.5.3; extra == "docs"
|
27
28
|
Requires-Dist: mkdocs-material>=9.4.8; extra == "docs"
|
@@ -29,38 +30,12 @@ Dynamic: license-file
|
|
29
30
|
|
30
31
|
# 🚀 Janito: Natural Language Coding Agent
|
31
32
|
|
32
|
-
**Current Version: 1.8.1**
|
33
|
-
See [CHANGELOG.md](./CHANGELOG.md) for details on the latest release.
|
34
|
-
|
35
33
|
Janito is an AI-powered assistant for the command line and web that interprets natural language system_prompt_template to edit code, manage files, and analyze projects using patterns and tools designed by experienced software engineers. It prioritizes transparency, interactive clarification, and precise, reviewable changes.
|
36
34
|
|
37
35
|
For a technical overview, see the [Architecture Guide](docs/reference/architecture.md).
|
38
36
|
|
39
|
-
## 🧪 Experimental Feature: termweb File Viewer
|
40
|
-
|
41
|
-
Janito now includes an experimental lightweight web file viewer for use with the CLI chat shell. This feature allows you to click on file paths in the terminal (when using a Rich-compatible terminal) and instantly preview file contents in your browser—no full IDE required!
|
42
|
-
|
43
|
-
### How to Use
|
44
|
-
|
45
|
-
- Start the CLI chat shell with the `--termweb` flag:
|
46
|
-
```bash
|
47
|
-
janito --termweb
|
48
|
-
```
|
49
|
-
- To disable the termweb file viewer, use the `--no-termweb` flag.
|
50
|
-
- By default, the viewer runs at http://localhost:8088 (or the next available port up to 8100).
|
51
|
-
- To specify a port, use `--termweb-port 8090`.
|
52
|
-
- File paths in CLI output become clickable links that open the file in your browser.
|
53
|
-
|
54
|
-
**Note:** This feature is experimental. It is intended for quick file previews and review, not for editing or production use. Feedback is welcome!
|
55
|
-
|
56
|
-
### Why is this useful?
|
57
|
-
- Enables instant file previews from the CLI without a full IDE.
|
58
|
-
- Works with all Janito file tools and outputs that display file paths.
|
59
|
-
- Uses the Rich library’s link markup for clickable terminal links.
|
60
|
-
|
61
|
-
---
|
62
|
-
|
63
37
|
## 📖 Full Documentation & Overview
|
38
|
+
|
64
39
|
- For structured and in-depth guides, visit the [Janito Documentation Site](https://docs.janito.dev).
|
65
40
|
- For a high-level, user-friendly overview, see [janito.dev](https://janito.dev).
|
66
41
|
|
@@ -79,6 +54,7 @@ This will display a colorful table with the name, description, and parameters of
|
|
79
54
|
## ⚡ Quick Start
|
80
55
|
|
81
56
|
## 🖥️ Supported Human Interfaces
|
57
|
+
|
82
58
|
Janito supports multiple ways for users to interact with the agent:
|
83
59
|
|
84
60
|
- **CLI (Command Line Interface):** Run single prompts or commands directly from your terminal (e.g., `janito "Refactor the data processing module"`).
|
@@ -89,6 +65,7 @@ Janito supports multiple ways for users to interact with the agent:
|
|
89
65
|

|
90
66
|
|
91
67
|
### 🛠️ Common CLI Modifiers
|
68
|
+
|
92
69
|
You can alter Janito's behavior in any interface using these flags:
|
93
70
|
|
94
71
|
- `--system` / `--system-file`: Override or customize the system prompt for the session.
|
@@ -99,13 +76,20 @@ You can alter Janito's behavior in any interface using these flags:
|
|
99
76
|
|
100
77
|
These modifiers can be combined with any interface mode for tailored workflows.
|
101
78
|
|
79
|
+
---
|
80
|
+
|
81
|
+
## 📝 Full CLI Options Reference
|
82
|
+
|
83
|
+
The full list of CLI options has been moved to its own document for clarity. Please see [docs/CLI_OPTIONS.md](docs/CLI_OPTIONS.md) for a comprehensive, up-to-date reference of all supported command-line flags and their descriptions.
|
102
84
|
|
103
85
|
Run a one-off prompt:
|
86
|
+
|
104
87
|
```bash
|
105
88
|
janito "Refactor the data processing module to improve readability."
|
106
89
|
```
|
107
90
|
|
108
91
|
Or start the interactive chat shell:
|
92
|
+
|
109
93
|
```bash
|
110
94
|
janito
|
111
95
|
```
|
@@ -113,6 +97,7 @@ janito
|
|
113
97
|
While in the chat shell, you can use special commands like `/reload` to reload the system prompt from a file without restarting your session. See the documentation for more shell commands.
|
114
98
|
|
115
99
|
Launch the web UI:
|
100
|
+
|
116
101
|
```bash
|
117
102
|
janito --web
|
118
103
|
```
|
@@ -120,25 +105,23 @@ janito --web
|
|
120
105
|
---
|
121
106
|
|
122
107
|
## ✨ Key Features
|
108
|
+
|
123
109
|
- 📝 **Code Editing via Natural Language:** Modify, create, or delete code files simply by describing the changes.
|
124
110
|
- 📁 **File & Directory Management:** Navigate, create, move, or remove files and folders.
|
125
111
|
- 🧠 **Context-Aware:** Understands your project structure for precise edits.
|
126
112
|
- 💬 **Interactive User Prompts:** Asks for clarification when needed.
|
127
113
|
- 🛠️ **Extensible Tooling:** Built-in tools for file operations, shell commands, directory and file management, Python code execution and validation, text replacement, and more.
|
128
|
-
- See [janito/agent/tools/README.md](janito/agent/tools/README.md) for the full list of built-in tools and their usage details. For the message handler model, see [docs/
|
129
|
-
- 🌐 **Web Interface (In Development):** Simple web UI for streaming responses and tool progress.
|
114
|
+
- See [janito/agent/tools/README.md](janito/agent/tools/README.md) for the full list of built-in tools and their usage details. For the message handler model, see [docs/reference/message-handler-model.md](docs/reference/message-handler-model.md).
|
130
115
|
|
131
116
|
## 📦 Installation
|
132
117
|
|
133
118
|
### Requirements
|
134
|
-
- Python 3.10+
|
135
119
|
|
120
|
+
- Python 3.10+
|
136
121
|
|
137
122
|
### Contributing & Developer Guide
|
138
123
|
|
139
|
-
If you want to extend Janito or add new tools, see the [Developer Guide](docs/
|
140
|
-
|
141
|
-
|
124
|
+
If you want to extend Janito or add new tools, see the [Developer Guide](docs/guides/developing.md) for system_prompt_template, tool registration requirements, and code profile guidelines. For the full list of built-in tools and their usage, see the [Tools Reference](janito/agent/tools/README.md).
|
142
125
|
|
143
126
|
For the full changelog, see [CHANGELOG.md](./CHANGELOG.md).
|
144
127
|
|
@@ -148,28 +131,27 @@ For the full changelog, see [CHANGELOG.md](./CHANGELOG.md).
|
|
148
131
|
|
149
132
|
See [docs/CONFIGURATION.md](docs/CONFIGURATION.md) for all configuration parameters, CLI flags, and advanced usage details. All CLI and configuration options have been moved there for clarity and maintainability.
|
150
133
|
|
151
|
-
|
152
134
|
### Obtaining an API Key from OpenRouter
|
153
135
|
|
154
136
|
To use Janito with OpenRouter, you need an API key:
|
155
137
|
|
156
|
-
1. Visit https://
|
138
|
+
1. Visit https://platform.openai.com and sign up for an account.
|
157
139
|
2. After logging in, go to your account dashboard.
|
158
140
|
3. Navigate to the "API Keys" section.
|
159
141
|
4. Click "Create new key" and copy the generated API key.
|
160
142
|
5. Set your API key in Janito using:
|
143
|
+
|
161
144
|
```bash
|
162
145
|
python -m janito --set-api-key YOUR_OPENROUTER_KEY
|
163
146
|
```
|
147
|
+
|
164
148
|
Or add it to your configuration file as `api_key`.
|
165
149
|
|
166
150
|
**Keep your API key secure and do not share it publicly.**
|
167
151
|
|
168
152
|
### Using Azure OpenAI
|
169
153
|
|
170
|
-
For details on using models hosted on Azure OpenAI, see [docs/
|
171
|
-
|
172
|
-
|
154
|
+
For details on using models hosted on Azure OpenAI, see [docs/reference/azure-openai.md](docs/reference/azure-openai.md).
|
173
155
|
|
174
156
|
---
|
175
157
|
|
@@ -178,20 +160,20 @@ For details on using models hosted on Azure OpenAI, see [docs/AZURE_OPENAI.md](d
|
|
178
160
|
Janito operates using a system prompt template that defines its behavior, communication profile, and capabilities. By default, Janito assumes the role of a "software engineer"—this means its responses and actions are tailored to the expectations and best practices of professional software engineering.
|
179
161
|
|
180
162
|
- **Role:** You can customize the agent's role (e.g., "data scientist", "DevOps engineer") using the `--role` flag or config. The default is `software engineer`.
|
181
|
-
- **System Prompt Template:** The system prompt is rendered from a Jinja2 template (see `janito/agent/templates/
|
163
|
+
- **System Prompt Template:** The system prompt is rendered from a Jinja2 template (see `janito/agent/templates/profiles/system_prompt_template_base.txt.j2`). This template governs how the agent interprets system_prompt_template, interacts with files, and communicates with users.
|
182
164
|
- **Customization & Precedence:** Advanced users can override the system prompt with the `--system` flag (raw string), or point to a custom file using `--system-file`. The precedence is: `--system-file` > `--system`/config > default template.
|
183
165
|
|
184
166
|
The default template ensures the agent:
|
167
|
+
|
185
168
|
- Prioritizes safe, reviewable, and minimal changes
|
186
169
|
- Asks for clarification when system_prompt_template are ambiguous
|
187
170
|
- Provides concise plans before taking action
|
188
171
|
- Documents any changes made
|
189
172
|
|
190
|
-
For more details or to customize the prompt, see the template file at `janito/agent/templates/
|
173
|
+
For more details or to customize the prompt, see the template file at `janito/agent/templates/profiles/system_prompt_template_base.txt.j2` and the architecture overview in [docs/reference/architecture.md](docs/reference/architecture.md).
|
191
174
|
|
192
175
|
---
|
193
176
|
|
194
|
-
|
195
177
|
## 🥛 Vanilla Mode
|
196
178
|
|
197
179
|
Janito supports a "vanilla mode" for pure LLM interaction:
|
@@ -213,6 +195,7 @@ python -m janito --vanilla
|
|
213
195
|
```
|
214
196
|
|
215
197
|
Vanilla mode is ideal for:
|
198
|
+
|
216
199
|
- Testing raw model behavior
|
217
200
|
- Comparing LLM output with and without agent guidance
|
218
201
|
- Ensuring no agent-side intervention or context is added
|
@@ -222,12 +205,14 @@ Vanilla mode is ideal for:
|
|
222
205
|
## 👨💻 AgentProfileManager: Profile, Role, and Prompt Management
|
223
206
|
|
224
207
|
Janito now uses a dedicated `AgentProfileManager` class to manage user profiles, roles, interaction profiles, and system prompt selection. This manager:
|
208
|
+
|
225
209
|
- Stores the current role (e.g., "software engineer") and interaction profile (e.g., "default", "technical").
|
226
210
|
- Renders the system prompt from the appropriate template based on interaction profile.
|
227
211
|
- Instantiates and manages the low-level LLM Agent, passing the correct prompt.
|
228
212
|
- Provides methods to update the role, interaction profile, and refresh the prompt at runtime.
|
229
213
|
|
230
214
|
### Multiple System Prompt Templates
|
215
|
+
|
231
216
|
- The system prompt template is now selected based on the interaction profile (e.g., `default` or `technical`).
|
232
217
|
- Templates are located in `janito/agent/templates/` (see `system_prompt_template.j2` and `system_prompt_template_technical.j2`).
|
233
218
|
- You can switch interaction profiles at runtime using the profile manager, enabling different agent behaviors for different user needs.
|
@@ -239,19 +224,24 @@ See `janito/agent/profile_manager.py` for implementation details.
|
|
239
224
|
### Agent Interaction Style
|
240
225
|
|
241
226
|
You can control the agent's behavior and prompt profile globally or per-project using the `profile` config key. See [Prompt Profiles Guide](docs/guides/prompt_profiles.md) for all available styles and combinations.
|
227
|
+
|
242
228
|
- `default`: Concise, general-purpose agent (default)
|
243
229
|
- `technical`: Strict, workflow-oriented for technical/developer use
|
244
230
|
|
245
231
|
Set globally:
|
232
|
+
|
246
233
|
```bash
|
247
234
|
janito --set-global-config profile=technical
|
248
235
|
```
|
236
|
+
|
249
237
|
Or per-project (in your project root):
|
238
|
+
|
250
239
|
```bash
|
251
240
|
janito --set-local-config profile=technical
|
252
241
|
```
|
253
242
|
|
254
243
|
You can also override for a session with the CLI flag:
|
244
|
+
|
255
245
|
```bash
|
256
246
|
janito --profile technical
|
257
247
|
```
|
@@ -267,11 +257,13 @@ Janito now supports combinatorial profiles for system prompts, allowing you to c
|
|
267
257
|
- **Syntax:** Use a hyphen to combine, e.g., `technical-commit_all`.
|
268
258
|
|
269
259
|
**How it works:**
|
260
|
+
|
270
261
|
- The main profile template is loaded first.
|
271
262
|
- Each feature extension template is layered on top, overriding or extending specific blocks in the main template.
|
272
263
|
- Feature templates must use `{% extends parent_template %}` for dynamic inheritance.
|
273
264
|
|
274
265
|
**Example usage:**
|
266
|
+
|
275
267
|
```bash
|
276
268
|
janito --profile technical-commit_all
|
277
269
|
```
|
@@ -280,5 +272,33 @@ This will apply the `technical` profile with the `commit_all` feature enabled in
|
|
280
272
|
|
281
273
|
See `janito/render_prompt.py` and `janito/agent/templates/` for implementation details and to create your own feature extensions.
|
282
274
|
|
275
|
+
---
|
276
|
+
|
277
|
+
## 📂 termweb File Viewer (Web File Preview)
|
278
|
+
|
279
|
+
Janito includes a lightweight web file viewer (termweb) that starts by default when you use the CLI chat shell. This feature allows you to click on file paths in the terminal (when using a Rich-compatible terminal) and instantly preview file contents in your browser—no full IDE required!
|
280
|
+
|
281
|
+
### How to Use
|
282
|
+
|
283
|
+
- Start the CLI chat shell normally:
|
284
|
+
|
285
|
+
```bash
|
286
|
+
janito
|
287
|
+
```
|
288
|
+
|
289
|
+
- The termweb file viewer will start automatically by default.
|
290
|
+
- To disable the termweb file viewer, use the `--no-termweb` flag.
|
291
|
+
- By default, the viewer runs at http://localhost:8088 (or the next available port up to 8100).
|
292
|
+
- To specify a port, use `--termweb-port 8090`.
|
293
|
+
- File paths in CLI output become clickable links that open the file in your browser.
|
294
|
+
|
295
|
+
**Note:** The termweb file viewer is intended for quick file previews and review, not for editing or production use. Feedback is welcome!
|
296
|
+
|
297
|
+
### Why is this useful?
|
298
|
+
|
299
|
+
- Enables instant file previews from the CLI without a full IDE.
|
300
|
+
- Works with all Janito file tools and outputs that display file paths.
|
301
|
+
- Uses the Rich library’s link markup for clickable terminal links.
|
302
|
+
|
283
303
|
---
|
284
304
|
_generated by janito.dev_
|
@@ -0,0 +1,158 @@
|
|
1
|
+
janito/__init__.py,sha256=0Z1bbkzuusGr4X6p3MaoSYDAyNO2Ru3F4GP4ZJ1kBMg,28
|
2
|
+
janito/__main__.py,sha256=KKIoPBE9xPcb54PRYO2UOt0ti04iAwLeJlg8YY36vew,76
|
3
|
+
janito/rich_utils.py,sha256=x7OsZdwtAOtUu_HYbrAMga0LElFMPbQL8GZ62vw5Jh8,1825
|
4
|
+
janito/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
|
+
janito/agent/api_exceptions.py,sha256=TAz3FTE4soqUgKPqei2Jod9LOpA37g3s2-S3G5WGw4E,84
|
6
|
+
janito/agent/config.py,sha256=dO64nxiiHj-tLJLN8sfY10GUuIaOmWu-NX73n9zVHfg,4609
|
7
|
+
janito/agent/config_defaults.py,sha256=22MxI84GF8YL5avIjAWxHlvARxu4A2wD0oou_lqNCeA,460
|
8
|
+
janito/agent/config_utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
|
+
janito/agent/content_handler.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
+
janito/agent/conversation.py,sha256=jxt3DmvuWDQRNObvHwiWkj74qsfrNAjn4Syh-QBXuAA,9564
|
11
|
+
janito/agent/conversation_api.py,sha256=iRixc5Y5fEhdAwHBsLnC5gwzFvxhr1iHj3F8NO8MBSs,8104
|
12
|
+
janito/agent/conversation_exceptions.py,sha256=Aw7PRLb3eUfyDOGynKds5F48dgjyiOrTCEcWSprYC58,381
|
13
|
+
janito/agent/conversation_tool_calls.py,sha256=wz9FFtwNXgnyJQbcLzZfHfCPkiLfItE2vJ1JqjpKucA,1553
|
14
|
+
janito/agent/conversation_ui.py,sha256=y4f0IoJQoWGrFMB3yi7uIwXokuTjhFtJGK_R7zcTv3w,397
|
15
|
+
janito/agent/event.py,sha256=1jcua88NT-T4jA0mGIyIF1LvqXKu2GDT8NMjlelWmCI,517
|
16
|
+
janito/agent/event_dispatcher.py,sha256=eFNDfGY8o63yNLFdMe82LqfmDyGWjrAw9CpyUAcLJAM,856
|
17
|
+
janito/agent/event_handler_protocol.py,sha256=uIIf9u82BWm8pha4sZxydeEwgbxDoiWVSyplBPI0knE,130
|
18
|
+
janito/agent/event_system.py,sha256=QxPSQ2XeTyiWV6ejcmS8kTqTBrs7fLHRVXdhyeVHpas,608
|
19
|
+
janito/agent/llm_conversation_history.py,sha256=ldDGOV4iYqEVNr4DYJUI3ahEs02kZcxQxCoydhv5PEA,2651
|
20
|
+
janito/agent/message_handler.py,sha256=oZJ2u0C7OewHiHwlJslT2o3RPlvY2HhPXPoRcSsBv4M,856
|
21
|
+
janito/agent/message_handler_protocol.py,sha256=E8PLl9ucNvPK_xmhLEkV-vhQzfO_P_BMvzpqDvUkcVY,150
|
22
|
+
janito/agent/openai_client.py,sha256=Hd4Rzq4ZiwVWgT1NgSCs7U_1YrXbdypQ4Wa1A_MK090,5341
|
23
|
+
janito/agent/openai_schema_generator.py,sha256=lxZocrm_HZzyONFrZsOx21FaAodAC63YGtck5TvTQZk,7654
|
24
|
+
janito/agent/platform_discovery.py,sha256=JN3kC7hkxdvuj-AyrJTlbbDJjtNHke3fdlZDqGi_uz0,4621
|
25
|
+
janito/agent/profile_manager.py,sha256=Esm8tewDVHnBdd7P04WeTY3F5p9O_ZB8cGlvC7awn7E,3196
|
26
|
+
janito/agent/queued_message_handler.py,sha256=sjsZneGWkqvfuJNac9QERdHasp9lWZvNcow8dul7tVU,1844
|
27
|
+
janito/agent/rich_live.py,sha256=NKWU89hRakiJ-0N6FPg40bYREOxQizqicbDv9eUfsKs,927
|
28
|
+
janito/agent/rich_message_handler.py,sha256=80-y0FjAmOYUxUqrEN0Sx1tOXS_mRcczrs4t0OUQTpk,4023
|
29
|
+
janito/agent/runtime_config.py,sha256=xSx0-RD-WVA9niSCEmEn2ZPLFbQfRhPwwGIa8tid_v8,901
|
30
|
+
janito/agent/test_handler_protocols.py,sha256=4o1IitFDUN1fdw48oQCRizKWahahumdmEZ4URHrlmiY,1404
|
31
|
+
janito/agent/test_openai_schema_generator.py,sha256=PJ6wrnNpH50MAzbXjuohZpe2rX7LLkQVdlWMcjxyXdk,2431
|
32
|
+
janito/agent/tool_base.py,sha256=KKWmMKyjxpWNukgdImLwZqs9cnS_tVzBt6cpQ532-KM,2025
|
33
|
+
janito/agent/tool_executor.py,sha256=yizyu88QteTHtJ_ktj679IqsaMyS-TQYR7rXnWI6lOg,5114
|
34
|
+
janito/agent/tool_registry.py,sha256=AjxYgQTeG9wUTyi0h128AG7INCyziF0z3zux12BlXnE,1673
|
35
|
+
janito/agent/tool_use_tracker.py,sha256=bEHirQX79u1uHnkmXO7t3JrBt2tHaQhaOzII7Nqiq5A,2874
|
36
|
+
janito/agent/templates/profiles/system_prompt_template_base.txt.j2,sha256=H7KtCXlBizxPUMQ9yGKuD_qpxOkS7-30RqOgl_fCBbA,963
|
37
|
+
janito/agent/templates/profiles/system_prompt_template_base_pt.txt.j2,sha256=FX8piXbR9XNOEKkOSMt4ieZ2wn5fzQlffeQFf8d7gIc,723
|
38
|
+
janito/agent/tests/__init__.py,sha256=QuXHKEzUJ_DooaKqenv_tKuNH-HabuIVZhvW5JNaeIc,52
|
39
|
+
janito/agent/tools/__init__.py,sha256=KtK5WMrtXfxr5NA2XZXDMSV4GdH4tN6KESFnEdv0BaQ,1207
|
40
|
+
janito/agent/tools/ask_user.py,sha256=DL-jBU-njSjwhNSbgi23RZCrRBt5beDgZq_PG4yzbWM,3217
|
41
|
+
janito/agent/tools/create_directory.py,sha256=biCLH3fuwuDdN7rb3VQl14JFhMAH3mk7giXepCD1_gM,2597
|
42
|
+
janito/agent/tools/create_file.py,sha256=O5thLevSXU61NdEi2z3kd9TAoq_dPA6-tvj1Jz6tR3k,2422
|
43
|
+
janito/agent/tools/delete_text_in_file.py,sha256=WIUDPgaaPK2Dk1WzKTPdfyckcoA6p51cwAf0SMiJj8c,3494
|
44
|
+
janito/agent/tools/fetch_url.py,sha256=pBSjh9lXs3ZN_2I_rNGUZDE-VSv3llLKYR3h_TyuQQY,3866
|
45
|
+
janito/agent/tools/find_files.py,sha256=QAUSHH7rlhJ7jkOot7UNCkAP2gsD9FvSVqxxgHGmNNA,4233
|
46
|
+
janito/agent/tools/get_lines.py,sha256=rzOE_MK3fvU76Rw2t2rY-jjJS3DpJiZq5sZq-U9Sz6Q,5262
|
47
|
+
janito/agent/tools/move_file.py,sha256=PX6uIDj91k4hvXl-dtsvDzdIcHLcaQxe7ePqQiqjc-Q,4433
|
48
|
+
janito/agent/tools/present_choices.py,sha256=XVO9jhWOUry7TedGPkOU4CG3COV_YdTUp3YiKyNKo2U,2422
|
49
|
+
janito/agent/tools/python_command_runner.py,sha256=CVQ-j1ZNpCYMJDg1nHELL9cn6GIA1yCmE9IBIbxgTWA,6404
|
50
|
+
janito/agent/tools/python_file_runner.py,sha256=1f43eQVPdetML-mPje0s5onfvPf4AqkbqvSM0AwKeU8,6231
|
51
|
+
janito/agent/tools/python_stdin_runner.py,sha256=X052bc4sHuEAq7KY6B33cyI254792W12jBr9e9nZY8E,6579
|
52
|
+
janito/agent/tools/remove_directory.py,sha256=3fKKbhQZaWHCOD_FW36NLL9jCPqOYWO9CO5vUS-_n04,2502
|
53
|
+
janito/agent/tools/remove_file.py,sha256=MGy5UrSGdyR5eT32XEXDQaFwogxLadrP-CDzXMvFygY,2411
|
54
|
+
janito/agent/tools/replace_file.py,sha256=JJ_9xY20GQaURCbU6yHcpFoyhMkD-TZp3OowWjx5KqY,3279
|
55
|
+
janito/agent/tools/replace_text_in_file.py,sha256=WThFVT7HeG2l93_LaN6jhK95RhPb021uI3s5dIo4WDw,9536
|
56
|
+
janito/agent/tools/run_bash_command.py,sha256=rmX0qwtK7OLEi53xO6yH8hyx6X9awV2RgoI7meemBrc,5881
|
57
|
+
janito/agent/tools/run_powershell_command.py,sha256=ZD9wR7bvNJH6Mepqd5UA1wMjz2WYblmkoWRqlvUSEBk,8913
|
58
|
+
janito/agent/tools/search_text.py,sha256=OHyJ3UTfrJjy7WLM1KXvjMxVVeK6nUYPMV-uzeDjY6E,10321
|
59
|
+
janito/agent/tools/get_file_outline/__init__.py,sha256=OKV_BHnoD9h-vkcVoW6AHmsuDjjauHPCKNK0nVFl4sU,37
|
60
|
+
janito/agent/tools/get_file_outline/core.py,sha256=eT09a_kpyHq60M7Sat73s4u4yfVYVwD1o9sTU4_fpbI,3314
|
61
|
+
janito/agent/tools/get_file_outline/markdown_outline.py,sha256=bXEBg0D93tEBDNy8t-wh4i7WxsxfpQ2C3dX1_rmtj08,434
|
62
|
+
janito/agent/tools/get_file_outline/python_outline.py,sha256=P_GDB3ElMZtrLc5D3pQIueIA_7MxoOiyUbdcQXClyWo,4998
|
63
|
+
janito/agent/tools/get_file_outline/search_outline.py,sha256=_wPdylEFvl-iE3fuwY3MEUlaDKO5cbHxN1_DTJf5x8s,1079
|
64
|
+
janito/agent/tools/validate_file_syntax/__init__.py,sha256=P53RHmas4BbHL90cMxH9m-RpMCJI8JquoJb0rpkPVVk,29
|
65
|
+
janito/agent/tools/validate_file_syntax/core.py,sha256=eO6XliUGS94-ofqsdHY2Rgw2ETzsdmcrnprayOulyq8,3254
|
66
|
+
janito/agent/tools/validate_file_syntax/css_validator.py,sha256=tRnCzNkpiYKQ_X9yvPeDPqZvc59He2T-2CbXmCs8Hjw,1371
|
67
|
+
janito/agent/tools/validate_file_syntax/html_validator.py,sha256=X1sS0-ZJn1d0hlfN-sIPHjCLME_o1PIs_G_YsswNqiA,2739
|
68
|
+
janito/agent/tools/validate_file_syntax/js_validator.py,sha256=oVkGxK9wBbZ3cFqwrV_aF76FDQwKPDvbXxXn1tL4We0,1018
|
69
|
+
janito/agent/tools/validate_file_syntax/json_validator.py,sha256=jfft16AjPqo4opIlv36Yc1QhpwiYVlMOyfeAJuhRZ8U,170
|
70
|
+
janito/agent/tools/validate_file_syntax/markdown_validator.py,sha256=CJBG9ERfXy0Liy2FtbkdnkQS1yNq1hxzMlL8UJx4T6E,2863
|
71
|
+
janito/agent/tools/validate_file_syntax/ps1_validator.py,sha256=DQbsIIC3oaFkbeK7BMjZcIzy-zkPHX1JbhMMS3q_rmc,1172
|
72
|
+
janito/agent/tools/validate_file_syntax/python_validator.py,sha256=SN9eNgk9Uormr_kfyan9hCZClZ1LB5guObOzbZRyo6c,150
|
73
|
+
janito/agent/tools/validate_file_syntax/xml_validator.py,sha256=nDHMnrSdjAyQhbSIJZcDuqEkeiJmjvTALlKdtn_Ny0k,304
|
74
|
+
janito/agent/tools/validate_file_syntax/yaml_validator.py,sha256=zDg0F-7y9WDU5ur75tBEicIreQjZ8pXjc_FYyTUuXmo,175
|
75
|
+
janito/agent/tools_utils/__init__.py,sha256=tMniEJ8rcFeiztKqidRe-sCRJh02gMw_s1OjcQB1Rg4,28
|
76
|
+
janito/agent/tools_utils/action_type.py,sha256=_BzW1VnJB48WiJCyniKWVzk-M9_d14KBK5oV4VAJ30c,119
|
77
|
+
janito/agent/tools_utils/dir_walk_utils.py,sha256=MY0bdKfYhAZ-8bT5S9XfFqWiq2ZOzQl0NAqz0BkyIg4,1127
|
78
|
+
janito/agent/tools_utils/formatting.py,sha256=SMvOmL6bst3KGcI7OLa5D4DE127fQYuHZS3oY8OPsn8,2031
|
79
|
+
janito/agent/tools_utils/gitignore_utils.py,sha256=YG8G_7_z0mbAL_xVbmJ8Aq6wHULfXkEP8WW6nBLh1rc,2977
|
80
|
+
janito/agent/tools_utils/test_gitignore_utils.py,sha256=ydA9mzza7QzgyEPjYsecKzPLyYFk0DGBVBz113LGklY,1891
|
81
|
+
janito/agent/tools_utils/utils.py,sha256=nVFOqaclfs18z4XB2rvr0JlwPa-RH1H-eSs8ejdXR5k,966
|
82
|
+
janito/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
83
|
+
janito/cli/_livereload_log_utils.py,sha256=BGhf1VT3dVR2ZhyTnZeTFg4I8Zj2tAn2UslME-ouxXA,482
|
84
|
+
janito/cli/_print_config.py,sha256=fzrVy23Ppe-Dax97VU759bus-KRe1VycU5MAPbHE72g,3259
|
85
|
+
janito/cli/_termweb_log_utils.py,sha256=QpH40uxPhksrJHWqthW4cR7BhcSSYakpza_qTeFGABs,722
|
86
|
+
janito/cli/_utils.py,sha256=tRAUMDWKczd81ZvKYkwpsHWSeLzQoVlOoQ-lOw9Iujw,291
|
87
|
+
janito/cli/arg_parser.py,sha256=8cE0E6zHWy4VE1jio3E3hyBpULD2AKo8q6QkTjyeWiQ,8345
|
88
|
+
janito/cli/cli_main.py,sha256=egi9Ql8iskSlmP_QU6eGAVqbzRp4lU5dt97K9WrIsn0,10341
|
89
|
+
janito/cli/config_commands.py,sha256=vfU7XciVMRNR5kDvn6tnCo1PLvSEXg0Y0PzLcDEFI9w,8539
|
90
|
+
janito/cli/config_runner.py,sha256=Nzam25C8P55dFlT_f6IlEj2ZvFwS63AAbnkIWe3oNsg,1702
|
91
|
+
janito/cli/formatting_runner.py,sha256=k0mtHoglqR8fKcebSK81iWTT_EL-gDl7eNfjlFZRY6g,287
|
92
|
+
janito/cli/livereload_starter.py,sha256=JivN7PRG9_dCEEOobXETQcJ7Ro9ELczg8AUbI8LHFPI,2285
|
93
|
+
janito/cli/logging_setup.py,sha256=_KLF69xqq1xLPIfkXxy0EIewO-Ef2eYoxNVjqjsC0vc,1361
|
94
|
+
janito/cli/main.py,sha256=6__L7xJS74SDVywpqqU7hw2_KpjTXu58-l-E9DBxiXQ,7296
|
95
|
+
janito/cli/one_shot.py,sha256=CP-05-jPhrKub1sButXytcfkTcfWXD9FWHLFO4pLjbA,3244
|
96
|
+
janito/cli/termweb_starter.py,sha256=lN_MXGr_Glr82kS983caPyCXdKmhwzcEERmpCrfgcDA,2797
|
97
|
+
janito/i18n/__init__.py,sha256=6zCIu6pSQpoMJvIRK9oOD3pkzbNeJik3lFDXse0X6ag,994
|
98
|
+
janito/i18n/messages.py,sha256=fBuwOTFoygyHPkYphm6Y0r1iE8497Z4iryVAmPhMEkg,1851
|
99
|
+
janito/i18n/pt.py,sha256=52-ENCIrPW4A1tXFRT28xA8TwuUFoihs6ezJj-m3-Y4,4260
|
100
|
+
janito/livereload/app.py,sha256=oJTKDN5vpix26d1MA5iQz9mPLDu4VaHisAW8wtOUEhY,666
|
101
|
+
janito/shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
102
|
+
janito/shell/commands.py,sha256=gqMKLvb6MrESPx51O28OP5I9hDZuBkRMaom3hT_ACqA,1586
|
103
|
+
janito/shell/input_history.py,sha256=JedB9TQoRf31l2XGadeQtyx1qAAFPLRyXSvMLltRwZE,2542
|
104
|
+
janito/shell/main.py,sha256=oKmBrCxtTh9vkKH13g9ECR15lkqlueO_KaWl59SJKYA,9863
|
105
|
+
janito/shell/commands/__init__.py,sha256=CJGXhVFEQdbIL214g3vF7vhyvlvtjqjFHjSMMTjXHjM,2016
|
106
|
+
janito/shell/commands/config.py,sha256=UTNbyNOLpIqlAle_JpCiffP7h5IOk7wxih-10_ok62w,959
|
107
|
+
janito/shell/commands/conversation_restart.py,sha256=b32vWa7rm43lA1SrFZ0v-OAB-zf4dTP307rEr52Mt9A,2825
|
108
|
+
janito/shell/commands/edit.py,sha256=l06cigmTSfWmhzCSP7enajHf2EW6HaKlQyr-5QLLEFw,791
|
109
|
+
janito/shell/commands/history_view.py,sha256=SoAR5bPIF6xN85F6HoxQJxAV8BluU_934T-CaMYnN7A,797
|
110
|
+
janito/shell/commands/lang.py,sha256=Ry1OgQmzgR0p6SgjWg-j5sdpHkLRIUCVGtTzkBOhJzg,599
|
111
|
+
janito/shell/commands/livelogs.py,sha256=GDx9UL7bYOfemCBsIWLrKOCgG-PYy7X_VLrl5USqpgE,1758
|
112
|
+
janito/shell/commands/prompt.py,sha256=OpcKg3-Vhy8enFJEc2LS-JrEQzH4Y-nogzVj2-dnGqI,2059
|
113
|
+
janito/shell/commands/session.py,sha256=tYav6GgjAZkvWhlI_rfG6OArNqW6Wn2DTv39Hb20QYc,1262
|
114
|
+
janito/shell/commands/session_control.py,sha256=PAFg00vXQvIhAuCtd4L149hrj8jGguB0EtBJwo-CFLo,1295
|
115
|
+
janito/shell/commands/termweb_log.py,sha256=xxFz2GhFRI7w7jNk0D0Gq6RFBuzIZF1paDMK2MBeNWA,3519
|
116
|
+
janito/shell/commands/tools.py,sha256=Z6kB0Lu87gzWYiUcjNB_kkX-jCNSRpZZh_qgetzhFMU,970
|
117
|
+
janito/shell/commands/track.py,sha256=xOqVHjcnrMWZ_vhP1gpT0-2NUvJqPVT-MGdC38NJatg,1577
|
118
|
+
janito/shell/commands/utility.py,sha256=kuUw1kklQa7c4okSFJ2bRA92NV-YUXqgor5Io7y1zGM,860
|
119
|
+
janito/shell/commands/verbose.py,sha256=mg7BlsWTkNwbUBN2p_GME4ep3zzAp0jMSc6N4BT3Ebg,980
|
120
|
+
janito/shell/prompt/completer.py,sha256=6gNu0DNNSbUUVgjk8Y0hWwJwk-jbN8Lm6Y4u0mRu930,755
|
121
|
+
janito/shell/prompt/load_prompt.py,sha256=gHedc5TtaFBKiGgwRM_u9nVnBuLHDTSa8VPlPOtoMEA,2125
|
122
|
+
janito/shell/prompt/session_setup.py,sha256=ry4TqiXYyw3JmZfGRGIpvAgNMXGeWltCwz56NoiBqSY,1531
|
123
|
+
janito/shell/session/config.py,sha256=sG04S_z27wI7nXKMaVDcwDpBCuo6Cvd4uhutUQesJKo,3807
|
124
|
+
janito/shell/session/history.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
125
|
+
janito/shell/session/manager.py,sha256=LGf2x9mprGOHAJhq7_OfIZM8Z2bmAEJ_KakaZr1XqXc,3116
|
126
|
+
janito/shell/ui/interactive.py,sha256=Uuy7Kr-wUeibO6sCqrOP3YBrAuv1znB3cl9EyHGp-wc,7491
|
127
|
+
janito/termweb/app.py,sha256=co4a7cw6pC2P79dMZaNxjPJrP_B9suTGRIWTgqK5ccw,3322
|
128
|
+
janito/termweb/static/editor.css,sha256=lGUS--FZ7gw8nlm2Apb7Xoa3Wai0V8D789TFxQHat7Q,2799
|
129
|
+
janito/termweb/static/editor.css.bak,sha256=KPjMz7YwryaxOUmyHJNAlOv96KYtcMLj0zfYkUuc9Vs,924
|
130
|
+
janito/termweb/static/editor.html,sha256=XZpNejyIyzc1JVHnLGzc7dfUZO0ID_hX__rHpach9HU,2377
|
131
|
+
janito/termweb/static/editor.html.bak,sha256=X7t-EBYzv5RorkdM_kc0JerD6lXoNes4_ZIF8aFFfzs,2245
|
132
|
+
janito/termweb/static/editor.js,sha256=5FdYuQiWbmn3WUmHoUqkx_FAk6MVr8NXsglWeNl0re0,8331
|
133
|
+
janito/termweb/static/editor.js.bak,sha256=orBXq043dheUYwZP7HSnhkaIlR6cvGCBsoOroK-JaIg,8841
|
134
|
+
janito/termweb/static/explorer.html.bak,sha256=PM1fcbaQJm545WT94mVEekUNW3jduBAHOz6rwJBR1FA,2568
|
135
|
+
janito/termweb/static/favicon.ico,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
136
|
+
janito/termweb/static/favicon.ico.bak,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
137
|
+
janito/termweb/static/index.html,sha256=lwF9j4C0wL56rBEU3f0s3HzdSGOWxf64LbQhBUh5fxU,2934
|
138
|
+
janito/termweb/static/index.html.bak,sha256=PBEA-FxIhIYOGkyGKzefn7tsk8UxDIhSNtVkqPplQbs,2933
|
139
|
+
janito/termweb/static/index.html.bak.bak,sha256=dsKoC2lE0oJCGUUDTWcnIQE3s5Uoqd12WoTkWEwbH_c,6626
|
140
|
+
janito/termweb/static/landing.html.bak,sha256=JGwIcATj0B8MhHXLoXg2clypqsKJwi54NtW-rRDUsMs,1403
|
141
|
+
janito/termweb/static/termicon.svg,sha256=vc2Z3q-ADVK3pLzE3wnw_qpR6vDguWKEdH_pWObPjbw,229
|
142
|
+
janito/termweb/static/termweb.css,sha256=9AxhC2R8CzS82NHg9bk0GD-kxKt_NeRSRFGgTyi-3zI,4870
|
143
|
+
janito/termweb/static/termweb.css.bak,sha256=9AxhC2R8CzS82NHg9bk0GD-kxKt_NeRSRFGgTyi-3zI,4870
|
144
|
+
janito/termweb/static/termweb.js,sha256=hVzFd4gGMPEPvJEicQsXQpePp9mTjKVB_tS29xfWPhs,7720
|
145
|
+
janito/termweb/static/termweb.js.bak,sha256=G1UQJqtWMZOoPFMiSm4MRo-Pm1OqX1oMZ_Jcm4bsDq8,7721
|
146
|
+
janito/termweb/static/termweb.js.bak.bak,sha256=SQeqc9YwdreCmFJ7LtCYlHOjRHi8rsoW_fZ3x5WroWQ,7692
|
147
|
+
janito/termweb/static/termweb_quickopen.js,sha256=HNT85JjWAvjI5ROwukOU-oI4ZVVjCO6yg5IT115pdXI,5379
|
148
|
+
janito/termweb/static/termweb_quickopen.js.bak,sha256=sk_zbEw6HJt1iZSAYlaW0qAhq0to-KcBsOKx0AZqkKA,4814
|
149
|
+
janito/tests/test_rich_utils.py,sha256=S_mGVynekAP0DM4A_ZaY-SseJGtdlBJxOlzc-v8lJX8,1283
|
150
|
+
janito/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
151
|
+
janito/web/__main__.py,sha256=5Ck6okOZmxKYkQ-ir4mxXDH7XWMNR-9szgsm0UyQLE0,734
|
152
|
+
janito/web/app.py,sha256=-zUBA1zlnrZdYbI421CSAgFZXOisLmIznNzUJrkSLQQ,4762
|
153
|
+
janito-1.10.0.dist-info/licenses/LICENSE,sha256=sHBqv0bvtrb29H7WRR-Z603YHm9pLtJIo3nHU_9cmgE,1091
|
154
|
+
janito-1.10.0.dist-info/METADATA,sha256=SYVAEStx_BmbZBWGtORTqaoFLtv5ej9iT730hPX2Tg8,12879
|
155
|
+
janito-1.10.0.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
|
156
|
+
janito-1.10.0.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
|
157
|
+
janito-1.10.0.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
|
158
|
+
janito-1.10.0.dist-info/RECORD,,
|
@@ -1,16 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
from janito.agent.tools.gitignore_utils import filter_ignored
|
3
|
-
|
4
|
-
|
5
|
-
def walk_dir_with_gitignore(root_dir, max_depth=0):
|
6
|
-
"""
|
7
|
-
Walks the directory tree starting at root_dir, yielding (root, dirs, files) tuples,
|
8
|
-
with .gitignore rules applied. If max_depth > 0, limits recursion to that depth.
|
9
|
-
"""
|
10
|
-
for root, dirs, files in os.walk(root_dir):
|
11
|
-
rel_path = os.path.relpath(root, root_dir)
|
12
|
-
depth = 0 if rel_path == "." else rel_path.count(os.sep) + 1
|
13
|
-
if max_depth > 0 and depth > max_depth:
|
14
|
-
continue
|
15
|
-
dirs, files = filter_ignored(root, dirs, files)
|
16
|
-
yield root, dirs, files
|
@@ -1,46 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import pathspec
|
3
|
-
from janito.agent.tools.utils import expand_path
|
4
|
-
|
5
|
-
_spec = None
|
6
|
-
|
7
|
-
|
8
|
-
def load_gitignore_patterns(gitignore_path=".gitignore"):
|
9
|
-
global _spec
|
10
|
-
gitignore_path = expand_path(gitignore_path)
|
11
|
-
if not os.path.exists(gitignore_path):
|
12
|
-
_spec = pathspec.PathSpec.from_lines("gitwildmatch", [])
|
13
|
-
return _spec
|
14
|
-
with open(gitignore_path, "r", encoding="utf-8", errors="replace") as f:
|
15
|
-
lines = f.readlines()
|
16
|
-
_spec = pathspec.PathSpec.from_lines("gitwildmatch", lines)
|
17
|
-
return _spec
|
18
|
-
|
19
|
-
|
20
|
-
def is_ignored(path):
|
21
|
-
global _spec
|
22
|
-
path = expand_path(path)
|
23
|
-
if _spec is None:
|
24
|
-
_spec = load_gitignore_patterns()
|
25
|
-
# Normalize path to be relative and use forward slashes
|
26
|
-
rel_path = os.path.relpath(path).replace(os.sep, "/")
|
27
|
-
return _spec.match_file(rel_path)
|
28
|
-
|
29
|
-
|
30
|
-
def filter_ignored(root, dirs, files, spec=None):
|
31
|
-
if spec is None:
|
32
|
-
global _spec
|
33
|
-
if _spec is None:
|
34
|
-
_spec = load_gitignore_patterns()
|
35
|
-
spec = _spec
|
36
|
-
|
37
|
-
def not_ignored(p):
|
38
|
-
rel_path = os.path.relpath(os.path.join(root, p)).replace(os.sep, "/")
|
39
|
-
# Always ignore .git directory (like git does)
|
40
|
-
if rel_path == ".git" or rel_path.startswith(".git/"):
|
41
|
-
return False
|
42
|
-
return not spec.match_file(rel_path)
|
43
|
-
|
44
|
-
dirs[:] = [d for d in dirs if not_ignored(d)]
|
45
|
-
files = [f for f in files if not_ignored(f)]
|
46
|
-
return dirs, files
|
janito/agent/tools/memory.py
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
from janito.agent.tool_base import ToolBase
|
2
|
-
from janito.agent.tool_registry import register_tool
|
3
|
-
from janito.i18n import tr
|
4
|
-
|
5
|
-
|
6
|
-
@register_tool(name="memory")
|
7
|
-
class MemoryTool(ToolBase):
|
8
|
-
"""
|
9
|
-
Simple in-memory key-value store for demonstration purposes.
|
10
|
-
"""
|
11
|
-
|
12
|
-
def __init__(self):
|
13
|
-
super().__init__()
|
14
|
-
self.memory = {}
|
15
|
-
|
16
|
-
def run(self, action: str, key: str, value: str = None) -> str:
|
17
|
-
if action == "set":
|
18
|
-
self.report_info(tr("ℹ️ Storing value for key: '{key}' ...", key=key))
|
19
|
-
self.memory[key] = value
|
20
|
-
msg = tr("Value stored for key: '{key}'.", key=key)
|
21
|
-
self.report_success(msg)
|
22
|
-
return msg
|
23
|
-
elif action == "get":
|
24
|
-
self.report_info(tr("ℹ️ Retrieving value for key: '{key}' ...", key=key))
|
25
|
-
if key in self.memory:
|
26
|
-
msg = tr(
|
27
|
-
"Value for key '{key}': {value}", key=key, value=self.memory[key]
|
28
|
-
)
|
29
|
-
self.report_success(msg)
|
30
|
-
return msg
|
31
|
-
else:
|
32
|
-
msg = tr("Key '{key}' not found.", key=key)
|
33
|
-
self.report_warning(msg)
|
34
|
-
return msg
|
35
|
-
elif action == "delete":
|
36
|
-
if key in self.memory:
|
37
|
-
del self.memory[key]
|
38
|
-
msg = tr("Key '{key}' deleted.", key=key)
|
39
|
-
self.report_success(msg)
|
40
|
-
return msg
|
41
|
-
else:
|
42
|
-
msg = tr("Key '{key}' not found.", key=key)
|
43
|
-
self.report_error(msg)
|
44
|
-
return msg
|
45
|
-
else:
|
46
|
-
msg = tr("Unknown action: {action}", action=action)
|
47
|
-
self.report_error(msg)
|
48
|
-
return msg
|
@@ -1,20 +0,0 @@
|
|
1
|
-
def format_outline_table(outline_items):
|
2
|
-
if not outline_items:
|
3
|
-
return "No classes, functions, or variables found."
|
4
|
-
header = "| Type | Name | Start | End | Parent |\n|---------|-------------|-------|-----|----------|"
|
5
|
-
rows = []
|
6
|
-
for item in outline_items:
|
7
|
-
rows.append(
|
8
|
-
f"| {item['type']:<7} | {item['name']:<11} | {item['start']:<5} | {item['end']:<3} | {item['parent']:<8} |"
|
9
|
-
)
|
10
|
-
return header + "\n" + "\n".join(rows)
|
11
|
-
|
12
|
-
|
13
|
-
def format_markdown_outline_table(outline_items):
|
14
|
-
if not outline_items:
|
15
|
-
return "No headers found."
|
16
|
-
header = "| Level | Header | Line |\n|-------|----------------------------------|------|"
|
17
|
-
rows = []
|
18
|
-
for item in outline_items:
|
19
|
-
rows.append(f"| {item['level']:<5} | {item['title']:<32} | {item['line']:<4} |")
|
20
|
-
return header + "\n" + "\n".join(rows)
|
@@ -1,71 +0,0 @@
|
|
1
|
-
import re
|
2
|
-
from typing import List
|
3
|
-
|
4
|
-
|
5
|
-
def parse_python_outline(lines: List[str]):
|
6
|
-
class_pat = re.compile(r"^(\s*)class\s+(\w+)")
|
7
|
-
func_pat = re.compile(r"^(\s*)def\s+(\w+)")
|
8
|
-
assign_pat = re.compile(r"^(\s*)([A-Za-z_][A-Za-z0-9_]*)\s*=.*")
|
9
|
-
outline = []
|
10
|
-
stack = [] # (type, name, indent, start, parent)
|
11
|
-
for idx, line in enumerate(lines):
|
12
|
-
class_match = class_pat.match(line)
|
13
|
-
func_match = func_pat.match(line)
|
14
|
-
assign_match = assign_pat.match(line)
|
15
|
-
indent = len(line) - len(line.lstrip())
|
16
|
-
if class_match:
|
17
|
-
name = class_match.group(2)
|
18
|
-
parent = stack[-1][1] if stack and stack[-1][0] == "class" else ""
|
19
|
-
stack.append(("class", name, indent, idx + 1, parent))
|
20
|
-
elif func_match:
|
21
|
-
name = func_match.group(2)
|
22
|
-
parent = (
|
23
|
-
stack[-1][1]
|
24
|
-
if stack
|
25
|
-
and stack[-1][0] in ("class", "function")
|
26
|
-
and indent > stack[-1][2]
|
27
|
-
else ""
|
28
|
-
)
|
29
|
-
stack.append(("function", name, indent, idx + 1, parent))
|
30
|
-
elif assign_match and indent == 0:
|
31
|
-
var_name = assign_match.group(2)
|
32
|
-
var_type = "const" if var_name.isupper() else "var"
|
33
|
-
outline.append(
|
34
|
-
{
|
35
|
-
"type": var_type,
|
36
|
-
"name": var_name,
|
37
|
-
"start": idx + 1,
|
38
|
-
"end": idx + 1,
|
39
|
-
"parent": "",
|
40
|
-
}
|
41
|
-
)
|
42
|
-
while stack and indent < stack[-1][2]:
|
43
|
-
popped = stack.pop()
|
44
|
-
outline.append(
|
45
|
-
{
|
46
|
-
"type": (
|
47
|
-
popped[0]
|
48
|
-
if popped[0] != "function" or popped[3] == 1
|
49
|
-
else ("method" if popped[4] else "function")
|
50
|
-
),
|
51
|
-
"name": popped[1],
|
52
|
-
"start": popped[3],
|
53
|
-
"end": idx,
|
54
|
-
"parent": popped[4],
|
55
|
-
}
|
56
|
-
)
|
57
|
-
for popped in stack:
|
58
|
-
outline.append(
|
59
|
-
{
|
60
|
-
"type": (
|
61
|
-
popped[0]
|
62
|
-
if popped[0] != "function" or popped[3] == 1
|
63
|
-
else ("method" if popped[4] else "function")
|
64
|
-
),
|
65
|
-
"name": popped[1],
|
66
|
-
"start": popped[3],
|
67
|
-
"end": len(lines),
|
68
|
-
"parent": popped[4],
|
69
|
-
}
|
70
|
-
)
|
71
|
-
return outline
|