aichs 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aichs-0.1.0/LICENSE +21 -0
- aichs-0.1.0/PKG-INFO +122 -0
- aichs-0.1.0/README.md +91 -0
- aichs-0.1.0/aichs.egg-info/PKG-INFO +122 -0
- aichs-0.1.0/aichs.egg-info/SOURCES.txt +162 -0
- aichs-0.1.0/aichs.egg-info/dependency_links.txt +1 -0
- aichs-0.1.0/aichs.egg-info/entry_points.txt +2 -0
- aichs-0.1.0/aichs.egg-info/requires.txt +5 -0
- aichs-0.1.0/aichs.egg-info/top_level.txt +7 -0
- aichs-0.1.0/app.py +1 -0
- aichs-0.1.0/assets/__init__.py +1 -0
- aichs-0.1.0/assets/avatars/agent.svg +15 -0
- aichs-0.1.0/assets/avatars/crew_archivist.svg +8 -0
- aichs-0.1.0/assets/avatars/crew_scout.svg +7 -0
- aichs-0.1.0/assets/avatars/human.svg +8 -0
- aichs-0.1.0/assets/checkmark.svg +3 -0
- aichs-0.1.0/assets/icon.svg +44 -0
- aichs-0.1.0/assets/logo.png +0 -0
- aichs-0.1.0/assets/logo.svg +62 -0
- aichs-0.1.0/assets/png/icon-128.png +0 -0
- aichs-0.1.0/assets/png/icon-16.png +0 -0
- aichs-0.1.0/assets/png/icon-256.png +0 -0
- aichs-0.1.0/assets/png/icon-32.png +0 -0
- aichs-0.1.0/assets/png/icon-512.png +0 -0
- aichs-0.1.0/assets/png/icon-64.png +0 -0
- aichs-0.1.0/config.py +28 -0
- aichs-0.1.0/docs/compact.md +63 -0
- aichs-0.1.0/docs/configuration.md +17 -0
- aichs-0.1.0/docs/custom-models.md +294 -0
- aichs-0.1.0/docs/extensions.md +458 -0
- aichs-0.1.0/docs/skills.md +45 -0
- aichs-0.1.0/main.py +63 -0
- aichs-0.1.0/pyproject.toml +63 -0
- aichs-0.1.0/services/__init__.py +0 -0
- aichs-0.1.0/services/auto_title.py +137 -0
- aichs-0.1.0/services/chat.py +752 -0
- aichs-0.1.0/services/chat_drag.py +143 -0
- aichs-0.1.0/services/compaction.py +356 -0
- aichs-0.1.0/services/content.py +343 -0
- aichs-0.1.0/services/context_budget.py +108 -0
- aichs-0.1.0/services/continuation.py +116 -0
- aichs-0.1.0/services/crew.py +249 -0
- aichs-0.1.0/services/crew_context.py +44 -0
- aichs-0.1.0/services/diff_html.py +100 -0
- aichs-0.1.0/services/export.py +126 -0
- aichs-0.1.0/services/file_ref_clipboard.py +71 -0
- aichs-0.1.0/services/git_diff.py +127 -0
- aichs-0.1.0/services/git_status.py +71 -0
- aichs-0.1.0/services/highlight.py +42 -0
- aichs-0.1.0/services/model_registry.py +361 -0
- aichs-0.1.0/services/palette.py +155 -0
- aichs-0.1.0/services/processes.py +420 -0
- aichs-0.1.0/services/shell_tool.py +11 -0
- aichs-0.1.0/services/skills.py +73 -0
- aichs-0.1.0/services/slash_commands.py +113 -0
- aichs-0.1.0/services/subprocess_utils.py +32 -0
- aichs-0.1.0/services/terminal_refs.py +89 -0
- aichs-0.1.0/services/tool_policy.py +201 -0
- aichs-0.1.0/services/tool_registry.py +766 -0
- aichs-0.1.0/services/tools.py +969 -0
- aichs-0.1.0/services/usage.py +112 -0
- aichs-0.1.0/services/user_terminal.py +118 -0
- aichs-0.1.0/services/workspace.py +120 -0
- aichs-0.1.0/setup.cfg +4 -0
- aichs-0.1.0/storage/__init__.py +0 -0
- aichs-0.1.0/storage/repository.py +157 -0
- aichs-0.1.0/storage/settings.py +67 -0
- aichs-0.1.0/tests/test_auto_title.py +169 -0
- aichs-0.1.0/tests/test_avatars.py +28 -0
- aichs-0.1.0/tests/test_avatars_render.py +23 -0
- aichs-0.1.0/tests/test_bubble_markdown.py +81 -0
- aichs-0.1.0/tests/test_build_package.py +25 -0
- aichs-0.1.0/tests/test_chat.py +237 -0
- aichs-0.1.0/tests/test_chat_loop.py +77 -0
- aichs-0.1.0/tests/test_chat_panel_crew.py +90 -0
- aichs-0.1.0/tests/test_chat_panel_history.py +136 -0
- aichs-0.1.0/tests/test_chat_panel_model.py +39 -0
- aichs-0.1.0/tests/test_chat_panel_runtime_queue.py +165 -0
- aichs-0.1.0/tests/test_chat_panel_title.py +75 -0
- aichs-0.1.0/tests/test_chat_tools.py +202 -0
- aichs-0.1.0/tests/test_compaction.py +205 -0
- aichs-0.1.0/tests/test_compaction_api.py +37 -0
- aichs-0.1.0/tests/test_content.py +267 -0
- aichs-0.1.0/tests/test_context_analyze.py +37 -0
- aichs-0.1.0/tests/test_context_budget.py +62 -0
- aichs-0.1.0/tests/test_continuation.py +83 -0
- aichs-0.1.0/tests/test_conversation_panel.py +81 -0
- aichs-0.1.0/tests/test_crew.py +79 -0
- aichs-0.1.0/tests/test_crew_context.py +32 -0
- aichs-0.1.0/tests/test_decision_memory_extension.py +99 -0
- aichs-0.1.0/tests/test_diff_html.py +56 -0
- aichs-0.1.0/tests/test_docs_dialog.py +49 -0
- aichs-0.1.0/tests/test_drag_refs.py +93 -0
- aichs-0.1.0/tests/test_export.py +152 -0
- aichs-0.1.0/tests/test_extensions_dialog.py +94 -0
- aichs-0.1.0/tests/test_file_mention_picker.py +22 -0
- aichs-0.1.0/tests/test_file_ref_clipboard.py +30 -0
- aichs-0.1.0/tests/test_file_viewer.py +8 -0
- aichs-0.1.0/tests/test_git_diff.py +22 -0
- aichs-0.1.0/tests/test_git_diff_branches.py +29 -0
- aichs-0.1.0/tests/test_git_diff_helpers.py +35 -0
- aichs-0.1.0/tests/test_git_diff_more.py +32 -0
- aichs-0.1.0/tests/test_git_status.py +51 -0
- aichs-0.1.0/tests/test_highlight.py +11 -0
- aichs-0.1.0/tests/test_highlight_edge.py +11 -0
- aichs-0.1.0/tests/test_message_input.py +253 -0
- aichs-0.1.0/tests/test_model_context.py +86 -0
- aichs-0.1.0/tests/test_model_registry.py +140 -0
- aichs-0.1.0/tests/test_palette.py +45 -0
- aichs-0.1.0/tests/test_process_sessions_extension.py +88 -0
- aichs-0.1.0/tests/test_processes.py +152 -0
- aichs-0.1.0/tests/test_registry_ui.py +58 -0
- aichs-0.1.0/tests/test_repository.py +134 -0
- aichs-0.1.0/tests/test_runtime_continue_extension.py +35 -0
- aichs-0.1.0/tests/test_runtime_guard_extension.py +151 -0
- aichs-0.1.0/tests/test_settings.py +45 -0
- aichs-0.1.0/tests/test_settings_dialog.py +233 -0
- aichs-0.1.0/tests/test_skill_picker.py +53 -0
- aichs-0.1.0/tests/test_skills.py +23 -0
- aichs-0.1.0/tests/test_slash_commands.py +111 -0
- aichs-0.1.0/tests/test_subprocess_utils.py +19 -0
- aichs-0.1.0/tests/test_terminal_card.py +80 -0
- aichs-0.1.0/tests/test_theme.py +65 -0
- aichs-0.1.0/tests/test_theme_styles.py +45 -0
- aichs-0.1.0/tests/test_threads.py +46 -0
- aichs-0.1.0/tests/test_tool_policy.py +94 -0
- aichs-0.1.0/tests/test_tool_policy_bus.py +90 -0
- aichs-0.1.0/tests/test_tool_registry.py +471 -0
- aichs-0.1.0/tests/test_tools_coverage.py +492 -0
- aichs-0.1.0/tests/test_tools_execute.py +147 -0
- aichs-0.1.0/tests/test_tools_helpers.py +78 -0
- aichs-0.1.0/tests/test_tools_more.py +54 -0
- aichs-0.1.0/tests/test_usage.py +41 -0
- aichs-0.1.0/tests/test_user_terminal.py +118 -0
- aichs-0.1.0/tests/test_web_fetch_extension.py +50 -0
- aichs-0.1.0/tests/test_win_caption.py +52 -0
- aichs-0.1.0/tests/test_workspace.py +52 -0
- aichs-0.1.0/ui/__init__.py +0 -0
- aichs-0.1.0/ui/avatars.py +123 -0
- aichs-0.1.0/ui/main_window.py +178 -0
- aichs-0.1.0/ui/theme.py +686 -0
- aichs-0.1.0/ui/widgets/__init__.py +0 -0
- aichs-0.1.0/ui/widgets/bubble.py +583 -0
- aichs-0.1.0/ui/widgets/chat_panel.py +2823 -0
- aichs-0.1.0/ui/widgets/code_card.py +138 -0
- aichs-0.1.0/ui/widgets/command_palette.py +161 -0
- aichs-0.1.0/ui/widgets/context_breakdown.py +123 -0
- aichs-0.1.0/ui/widgets/context_ring.py +69 -0
- aichs-0.1.0/ui/widgets/conversation_panel.py +470 -0
- aichs-0.1.0/ui/widgets/docs_dialog.py +170 -0
- aichs-0.1.0/ui/widgets/extension_contributions.py +151 -0
- aichs-0.1.0/ui/widgets/extension_panel_dialog.py +292 -0
- aichs-0.1.0/ui/widgets/extensions_dialog.py +809 -0
- aichs-0.1.0/ui/widgets/file_mention_picker.py +112 -0
- aichs-0.1.0/ui/widgets/file_viewer.py +270 -0
- aichs-0.1.0/ui/widgets/git_changes_list.py +74 -0
- aichs-0.1.0/ui/widgets/git_panel.py +134 -0
- aichs-0.1.0/ui/widgets/left_panel.py +404 -0
- aichs-0.1.0/ui/widgets/message_input.py +681 -0
- aichs-0.1.0/ui/widgets/settings_dialog.py +1438 -0
- aichs-0.1.0/ui/widgets/skill_picker.py +119 -0
- aichs-0.1.0/ui/widgets/terminal_card.py +211 -0
- aichs-0.1.0/ui/widgets/tool_approval_dialog.py +194 -0
- aichs-0.1.0/ui/win_caption.py +82 -0
aichs-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AI Choding Harness Studio
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
aichs-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: aichs
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A minimal desktop agent studio for local repositories.
|
|
5
|
+
Author: AI Choding Harness Studio
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/nadav-yo/aichs
|
|
8
|
+
Project-URL: Repository, https://github.com/nadav-yo/aichs
|
|
9
|
+
Project-URL: Documentation, https://github.com/nadav-yo/aichs/tree/main/docs
|
|
10
|
+
Keywords: ai,agent,desktop,pyqt
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Win32 (MS Windows)
|
|
13
|
+
Classifier: Environment :: X11 Applications :: Qt
|
|
14
|
+
Classifier: Environment :: MacOS X
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
17
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
18
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Topic :: Software Development
|
|
22
|
+
Requires-Python: >=3.11
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Requires-Dist: PyQt6==6.11.0
|
|
26
|
+
Requires-Dist: anthropic==0.104.1
|
|
27
|
+
Requires-Dist: openai==2.38.0
|
|
28
|
+
Requires-Dist: markdown==3.10.2
|
|
29
|
+
Requires-Dist: pygments==2.20.0
|
|
30
|
+
Dynamic: license-file
|
|
31
|
+
|
|
32
|
+
# aichs
|
|
33
|
+
|
|
34
|
+
Local desktop agent workspace for software projects. aichs combines chat,
|
|
35
|
+
approval-gated tools, git context, file references, conversation history,
|
|
36
|
+
compaction, and project-specific extensions in a small PyQt app.
|
|
37
|
+
|
|
38
|
+

|
|
39
|
+

|
|
40
|
+
|
|
41
|
+
## Status
|
|
42
|
+
|
|
43
|
+
aichs is early software. It is intended for developers who are comfortable
|
|
44
|
+
running a local app that can read a workspace and, with approval, edit files or
|
|
45
|
+
run shell commands.
|
|
46
|
+
|
|
47
|
+
## Install From Source
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git clone https://github.com/nadav-yo/aichs
|
|
51
|
+
cd aichs
|
|
52
|
+
python -m venv .venv
|
|
53
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
54
|
+
pip install -r requirements-dev.txt
|
|
55
|
+
python main.py
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
API keys can be configured in **Settings -> Models** or through environment
|
|
59
|
+
variables. Requires Python 3.11+.
|
|
60
|
+
|
|
61
|
+
## Features
|
|
62
|
+
|
|
63
|
+
- Chat with streaming Markdown, vision-capable models, file mentions, edit/resend, and queued messages
|
|
64
|
+
- Approval-gated tools for reading, editing, searching, shell commands, git context, and extension tools
|
|
65
|
+
- Workspace browser with file tree, syntax-highlighted tabs, git status, and diffs
|
|
66
|
+
- Context usage view with auto-compaction and compacted conversation summaries
|
|
67
|
+
- Skills, slash commands, command palette, pinned/exported/searchable conversations
|
|
68
|
+
- Project and user extensions for custom tools, prompt context, hooks, badges, and panels
|
|
69
|
+
|
|
70
|
+
Tool paths are scoped to the workspace. Shell commands and extensions run as the
|
|
71
|
+
current user; only enable extensions you trust.
|
|
72
|
+
|
|
73
|
+
## Documentation
|
|
74
|
+
|
|
75
|
+
| Topic | |
|
|
76
|
+
|---|---|
|
|
77
|
+
| Configuration | [docs/configuration.md](docs/configuration.md) |
|
|
78
|
+
| Custom model providers | [docs/custom-models.md](docs/custom-models.md) |
|
|
79
|
+
| Extensions and custom tools | [docs/extensions.md](docs/extensions.md) |
|
|
80
|
+
| Slash-command skills | [docs/skills.md](docs/skills.md) |
|
|
81
|
+
| Compaction and decision memory | [docs/compact.md](docs/compact.md) |
|
|
82
|
+
|
|
83
|
+
## Development
|
|
84
|
+
|
|
85
|
+
Run the full suite from the repository root:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
pytest -q --cov-fail-under=90
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Single-file test runs are useful while iterating, but they do not represent the
|
|
92
|
+
real coverage number because coverage is measured across the configured package
|
|
93
|
+
set. For a quick local check without coverage:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
pytest --no-cov
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Project agent instructions live in [AGENTS.md](AGENTS.md).
|
|
100
|
+
|
|
101
|
+
## Packaging
|
|
102
|
+
|
|
103
|
+
For local development, use `python main.py`. For a distributable desktop build,
|
|
104
|
+
use PyInstaller:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
python tools/build_package.py
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Outputs are written under `dist/`:
|
|
111
|
+
|
|
112
|
+
| OS | Output |
|
|
113
|
+
|---|---|
|
|
114
|
+
| Windows | `dist/aichs/aichs.exe` |
|
|
115
|
+
| macOS | `dist/aichs.app` and `dist/aichs/` |
|
|
116
|
+
| Linux | `dist/aichs/aichs` |
|
|
117
|
+
|
|
118
|
+
Build on each target OS for that OS; PyInstaller is not a cross-compiler.
|
|
119
|
+
|
|
120
|
+
## License
|
|
121
|
+
|
|
122
|
+
MIT License. See [LICENSE](LICENSE).
|
aichs-0.1.0/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# aichs
|
|
2
|
+
|
|
3
|
+
Local desktop agent workspace for software projects. aichs combines chat,
|
|
4
|
+
approval-gated tools, git context, file references, conversation history,
|
|
5
|
+
compaction, and project-specific extensions in a small PyQt app.
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+

|
|
9
|
+
|
|
10
|
+
## Status
|
|
11
|
+
|
|
12
|
+
aichs is early software. It is intended for developers who are comfortable
|
|
13
|
+
running a local app that can read a workspace and, with approval, edit files or
|
|
14
|
+
run shell commands.
|
|
15
|
+
|
|
16
|
+
## Install From Source
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
git clone https://github.com/nadav-yo/aichs
|
|
20
|
+
cd aichs
|
|
21
|
+
python -m venv .venv
|
|
22
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
23
|
+
pip install -r requirements-dev.txt
|
|
24
|
+
python main.py
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
API keys can be configured in **Settings -> Models** or through environment
|
|
28
|
+
variables. Requires Python 3.11+.
|
|
29
|
+
|
|
30
|
+
## Features
|
|
31
|
+
|
|
32
|
+
- Chat with streaming Markdown, vision-capable models, file mentions, edit/resend, and queued messages
|
|
33
|
+
- Approval-gated tools for reading, editing, searching, shell commands, git context, and extension tools
|
|
34
|
+
- Workspace browser with file tree, syntax-highlighted tabs, git status, and diffs
|
|
35
|
+
- Context usage view with auto-compaction and compacted conversation summaries
|
|
36
|
+
- Skills, slash commands, command palette, pinned/exported/searchable conversations
|
|
37
|
+
- Project and user extensions for custom tools, prompt context, hooks, badges, and panels
|
|
38
|
+
|
|
39
|
+
Tool paths are scoped to the workspace. Shell commands and extensions run as the
|
|
40
|
+
current user; only enable extensions you trust.
|
|
41
|
+
|
|
42
|
+
## Documentation
|
|
43
|
+
|
|
44
|
+
| Topic | |
|
|
45
|
+
|---|---|
|
|
46
|
+
| Configuration | [docs/configuration.md](docs/configuration.md) |
|
|
47
|
+
| Custom model providers | [docs/custom-models.md](docs/custom-models.md) |
|
|
48
|
+
| Extensions and custom tools | [docs/extensions.md](docs/extensions.md) |
|
|
49
|
+
| Slash-command skills | [docs/skills.md](docs/skills.md) |
|
|
50
|
+
| Compaction and decision memory | [docs/compact.md](docs/compact.md) |
|
|
51
|
+
|
|
52
|
+
## Development
|
|
53
|
+
|
|
54
|
+
Run the full suite from the repository root:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pytest -q --cov-fail-under=90
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Single-file test runs are useful while iterating, but they do not represent the
|
|
61
|
+
real coverage number because coverage is measured across the configured package
|
|
62
|
+
set. For a quick local check without coverage:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pytest --no-cov
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Project agent instructions live in [AGENTS.md](AGENTS.md).
|
|
69
|
+
|
|
70
|
+
## Packaging
|
|
71
|
+
|
|
72
|
+
For local development, use `python main.py`. For a distributable desktop build,
|
|
73
|
+
use PyInstaller:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
python tools/build_package.py
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Outputs are written under `dist/`:
|
|
80
|
+
|
|
81
|
+
| OS | Output |
|
|
82
|
+
|---|---|
|
|
83
|
+
| Windows | `dist/aichs/aichs.exe` |
|
|
84
|
+
| macOS | `dist/aichs.app` and `dist/aichs/` |
|
|
85
|
+
| Linux | `dist/aichs/aichs` |
|
|
86
|
+
|
|
87
|
+
Build on each target OS for that OS; PyInstaller is not a cross-compiler.
|
|
88
|
+
|
|
89
|
+
## License
|
|
90
|
+
|
|
91
|
+
MIT License. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: aichs
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A minimal desktop agent studio for local repositories.
|
|
5
|
+
Author: AI Choding Harness Studio
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/nadav-yo/aichs
|
|
8
|
+
Project-URL: Repository, https://github.com/nadav-yo/aichs
|
|
9
|
+
Project-URL: Documentation, https://github.com/nadav-yo/aichs/tree/main/docs
|
|
10
|
+
Keywords: ai,agent,desktop,pyqt
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Win32 (MS Windows)
|
|
13
|
+
Classifier: Environment :: X11 Applications :: Qt
|
|
14
|
+
Classifier: Environment :: MacOS X
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
17
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
18
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Topic :: Software Development
|
|
22
|
+
Requires-Python: >=3.11
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Requires-Dist: PyQt6==6.11.0
|
|
26
|
+
Requires-Dist: anthropic==0.104.1
|
|
27
|
+
Requires-Dist: openai==2.38.0
|
|
28
|
+
Requires-Dist: markdown==3.10.2
|
|
29
|
+
Requires-Dist: pygments==2.20.0
|
|
30
|
+
Dynamic: license-file
|
|
31
|
+
|
|
32
|
+
# aichs
|
|
33
|
+
|
|
34
|
+
Local desktop agent workspace for software projects. aichs combines chat,
|
|
35
|
+
approval-gated tools, git context, file references, conversation history,
|
|
36
|
+
compaction, and project-specific extensions in a small PyQt app.
|
|
37
|
+
|
|
38
|
+

|
|
39
|
+

|
|
40
|
+
|
|
41
|
+
## Status
|
|
42
|
+
|
|
43
|
+
aichs is early software. It is intended for developers who are comfortable
|
|
44
|
+
running a local app that can read a workspace and, with approval, edit files or
|
|
45
|
+
run shell commands.
|
|
46
|
+
|
|
47
|
+
## Install From Source
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git clone https://github.com/nadav-yo/aichs
|
|
51
|
+
cd aichs
|
|
52
|
+
python -m venv .venv
|
|
53
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
54
|
+
pip install -r requirements-dev.txt
|
|
55
|
+
python main.py
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
API keys can be configured in **Settings -> Models** or through environment
|
|
59
|
+
variables. Requires Python 3.11+.
|
|
60
|
+
|
|
61
|
+
## Features
|
|
62
|
+
|
|
63
|
+
- Chat with streaming Markdown, vision-capable models, file mentions, edit/resend, and queued messages
|
|
64
|
+
- Approval-gated tools for reading, editing, searching, shell commands, git context, and extension tools
|
|
65
|
+
- Workspace browser with file tree, syntax-highlighted tabs, git status, and diffs
|
|
66
|
+
- Context usage view with auto-compaction and compacted conversation summaries
|
|
67
|
+
- Skills, slash commands, command palette, pinned/exported/searchable conversations
|
|
68
|
+
- Project and user extensions for custom tools, prompt context, hooks, badges, and panels
|
|
69
|
+
|
|
70
|
+
Tool paths are scoped to the workspace. Shell commands and extensions run as the
|
|
71
|
+
current user; only enable extensions you trust.
|
|
72
|
+
|
|
73
|
+
## Documentation
|
|
74
|
+
|
|
75
|
+
| Topic | |
|
|
76
|
+
|---|---|
|
|
77
|
+
| Configuration | [docs/configuration.md](docs/configuration.md) |
|
|
78
|
+
| Custom model providers | [docs/custom-models.md](docs/custom-models.md) |
|
|
79
|
+
| Extensions and custom tools | [docs/extensions.md](docs/extensions.md) |
|
|
80
|
+
| Slash-command skills | [docs/skills.md](docs/skills.md) |
|
|
81
|
+
| Compaction and decision memory | [docs/compact.md](docs/compact.md) |
|
|
82
|
+
|
|
83
|
+
## Development
|
|
84
|
+
|
|
85
|
+
Run the full suite from the repository root:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
pytest -q --cov-fail-under=90
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Single-file test runs are useful while iterating, but they do not represent the
|
|
92
|
+
real coverage number because coverage is measured across the configured package
|
|
93
|
+
set. For a quick local check without coverage:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
pytest --no-cov
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Project agent instructions live in [AGENTS.md](AGENTS.md).
|
|
100
|
+
|
|
101
|
+
## Packaging
|
|
102
|
+
|
|
103
|
+
For local development, use `python main.py`. For a distributable desktop build,
|
|
104
|
+
use PyInstaller:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
python tools/build_package.py
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Outputs are written under `dist/`:
|
|
111
|
+
|
|
112
|
+
| OS | Output |
|
|
113
|
+
|---|---|
|
|
114
|
+
| Windows | `dist/aichs/aichs.exe` |
|
|
115
|
+
| macOS | `dist/aichs.app` and `dist/aichs/` |
|
|
116
|
+
| Linux | `dist/aichs/aichs` |
|
|
117
|
+
|
|
118
|
+
Build on each target OS for that OS; PyInstaller is not a cross-compiler.
|
|
119
|
+
|
|
120
|
+
## License
|
|
121
|
+
|
|
122
|
+
MIT License. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
app.py
|
|
4
|
+
config.py
|
|
5
|
+
main.py
|
|
6
|
+
pyproject.toml
|
|
7
|
+
aichs.egg-info/PKG-INFO
|
|
8
|
+
aichs.egg-info/SOURCES.txt
|
|
9
|
+
aichs.egg-info/dependency_links.txt
|
|
10
|
+
aichs.egg-info/entry_points.txt
|
|
11
|
+
aichs.egg-info/requires.txt
|
|
12
|
+
aichs.egg-info/top_level.txt
|
|
13
|
+
assets/__init__.py
|
|
14
|
+
assets/checkmark.svg
|
|
15
|
+
assets/icon.svg
|
|
16
|
+
assets/logo.png
|
|
17
|
+
assets/logo.svg
|
|
18
|
+
assets/avatars/agent.svg
|
|
19
|
+
assets/avatars/crew_archivist.svg
|
|
20
|
+
assets/avatars/crew_scout.svg
|
|
21
|
+
assets/avatars/human.svg
|
|
22
|
+
assets/png/icon-128.png
|
|
23
|
+
assets/png/icon-16.png
|
|
24
|
+
assets/png/icon-256.png
|
|
25
|
+
assets/png/icon-32.png
|
|
26
|
+
assets/png/icon-512.png
|
|
27
|
+
assets/png/icon-64.png
|
|
28
|
+
docs/compact.md
|
|
29
|
+
docs/configuration.md
|
|
30
|
+
docs/custom-models.md
|
|
31
|
+
docs/extensions.md
|
|
32
|
+
docs/skills.md
|
|
33
|
+
services/__init__.py
|
|
34
|
+
services/auto_title.py
|
|
35
|
+
services/chat.py
|
|
36
|
+
services/chat_drag.py
|
|
37
|
+
services/compaction.py
|
|
38
|
+
services/content.py
|
|
39
|
+
services/context_budget.py
|
|
40
|
+
services/continuation.py
|
|
41
|
+
services/crew.py
|
|
42
|
+
services/crew_context.py
|
|
43
|
+
services/diff_html.py
|
|
44
|
+
services/export.py
|
|
45
|
+
services/file_ref_clipboard.py
|
|
46
|
+
services/git_diff.py
|
|
47
|
+
services/git_status.py
|
|
48
|
+
services/highlight.py
|
|
49
|
+
services/model_registry.py
|
|
50
|
+
services/palette.py
|
|
51
|
+
services/processes.py
|
|
52
|
+
services/shell_tool.py
|
|
53
|
+
services/skills.py
|
|
54
|
+
services/slash_commands.py
|
|
55
|
+
services/subprocess_utils.py
|
|
56
|
+
services/terminal_refs.py
|
|
57
|
+
services/tool_policy.py
|
|
58
|
+
services/tool_registry.py
|
|
59
|
+
services/tools.py
|
|
60
|
+
services/usage.py
|
|
61
|
+
services/user_terminal.py
|
|
62
|
+
services/workspace.py
|
|
63
|
+
storage/__init__.py
|
|
64
|
+
storage/repository.py
|
|
65
|
+
storage/settings.py
|
|
66
|
+
tests/test_auto_title.py
|
|
67
|
+
tests/test_avatars.py
|
|
68
|
+
tests/test_avatars_render.py
|
|
69
|
+
tests/test_bubble_markdown.py
|
|
70
|
+
tests/test_build_package.py
|
|
71
|
+
tests/test_chat.py
|
|
72
|
+
tests/test_chat_loop.py
|
|
73
|
+
tests/test_chat_panel_crew.py
|
|
74
|
+
tests/test_chat_panel_history.py
|
|
75
|
+
tests/test_chat_panel_model.py
|
|
76
|
+
tests/test_chat_panel_runtime_queue.py
|
|
77
|
+
tests/test_chat_panel_title.py
|
|
78
|
+
tests/test_chat_tools.py
|
|
79
|
+
tests/test_compaction.py
|
|
80
|
+
tests/test_compaction_api.py
|
|
81
|
+
tests/test_content.py
|
|
82
|
+
tests/test_context_analyze.py
|
|
83
|
+
tests/test_context_budget.py
|
|
84
|
+
tests/test_continuation.py
|
|
85
|
+
tests/test_conversation_panel.py
|
|
86
|
+
tests/test_crew.py
|
|
87
|
+
tests/test_crew_context.py
|
|
88
|
+
tests/test_decision_memory_extension.py
|
|
89
|
+
tests/test_diff_html.py
|
|
90
|
+
tests/test_docs_dialog.py
|
|
91
|
+
tests/test_drag_refs.py
|
|
92
|
+
tests/test_export.py
|
|
93
|
+
tests/test_extensions_dialog.py
|
|
94
|
+
tests/test_file_mention_picker.py
|
|
95
|
+
tests/test_file_ref_clipboard.py
|
|
96
|
+
tests/test_file_viewer.py
|
|
97
|
+
tests/test_git_diff.py
|
|
98
|
+
tests/test_git_diff_branches.py
|
|
99
|
+
tests/test_git_diff_helpers.py
|
|
100
|
+
tests/test_git_diff_more.py
|
|
101
|
+
tests/test_git_status.py
|
|
102
|
+
tests/test_highlight.py
|
|
103
|
+
tests/test_highlight_edge.py
|
|
104
|
+
tests/test_message_input.py
|
|
105
|
+
tests/test_model_context.py
|
|
106
|
+
tests/test_model_registry.py
|
|
107
|
+
tests/test_palette.py
|
|
108
|
+
tests/test_process_sessions_extension.py
|
|
109
|
+
tests/test_processes.py
|
|
110
|
+
tests/test_registry_ui.py
|
|
111
|
+
tests/test_repository.py
|
|
112
|
+
tests/test_runtime_continue_extension.py
|
|
113
|
+
tests/test_runtime_guard_extension.py
|
|
114
|
+
tests/test_settings.py
|
|
115
|
+
tests/test_settings_dialog.py
|
|
116
|
+
tests/test_skill_picker.py
|
|
117
|
+
tests/test_skills.py
|
|
118
|
+
tests/test_slash_commands.py
|
|
119
|
+
tests/test_subprocess_utils.py
|
|
120
|
+
tests/test_terminal_card.py
|
|
121
|
+
tests/test_theme.py
|
|
122
|
+
tests/test_theme_styles.py
|
|
123
|
+
tests/test_threads.py
|
|
124
|
+
tests/test_tool_policy.py
|
|
125
|
+
tests/test_tool_policy_bus.py
|
|
126
|
+
tests/test_tool_registry.py
|
|
127
|
+
tests/test_tools_coverage.py
|
|
128
|
+
tests/test_tools_execute.py
|
|
129
|
+
tests/test_tools_helpers.py
|
|
130
|
+
tests/test_tools_more.py
|
|
131
|
+
tests/test_usage.py
|
|
132
|
+
tests/test_user_terminal.py
|
|
133
|
+
tests/test_web_fetch_extension.py
|
|
134
|
+
tests/test_win_caption.py
|
|
135
|
+
tests/test_workspace.py
|
|
136
|
+
ui/__init__.py
|
|
137
|
+
ui/avatars.py
|
|
138
|
+
ui/main_window.py
|
|
139
|
+
ui/theme.py
|
|
140
|
+
ui/win_caption.py
|
|
141
|
+
ui/widgets/__init__.py
|
|
142
|
+
ui/widgets/bubble.py
|
|
143
|
+
ui/widgets/chat_panel.py
|
|
144
|
+
ui/widgets/code_card.py
|
|
145
|
+
ui/widgets/command_palette.py
|
|
146
|
+
ui/widgets/context_breakdown.py
|
|
147
|
+
ui/widgets/context_ring.py
|
|
148
|
+
ui/widgets/conversation_panel.py
|
|
149
|
+
ui/widgets/docs_dialog.py
|
|
150
|
+
ui/widgets/extension_contributions.py
|
|
151
|
+
ui/widgets/extension_panel_dialog.py
|
|
152
|
+
ui/widgets/extensions_dialog.py
|
|
153
|
+
ui/widgets/file_mention_picker.py
|
|
154
|
+
ui/widgets/file_viewer.py
|
|
155
|
+
ui/widgets/git_changes_list.py
|
|
156
|
+
ui/widgets/git_panel.py
|
|
157
|
+
ui/widgets/left_panel.py
|
|
158
|
+
ui/widgets/message_input.py
|
|
159
|
+
ui/widgets/settings_dialog.py
|
|
160
|
+
ui/widgets/skill_picker.py
|
|
161
|
+
ui/widgets/terminal_card.py
|
|
162
|
+
ui/widgets/tool_approval_dialog.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
aichs-0.1.0/app.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from main import main; main()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Packaged aichs visual assets."""
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36" fill="none">
|
|
2
|
+
<circle cx="18" cy="18" r="18" fill="#007AFF"/>
|
|
3
|
+
<path
|
|
4
|
+
d="M18 10l1.8 3.6 4 0.6-2.9 2.8 0.7 3.9-3.6-1.9-3.6 1.9 0.7-3.9-2.9-2.8 4-0.6z"
|
|
5
|
+
fill="#ffffff"
|
|
6
|
+
/>
|
|
7
|
+
<path
|
|
8
|
+
d="M11 24c0-3.9 3.1-7 7-7s7 3.1 7 7"
|
|
9
|
+
stroke="#ffffff"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
fill="none"
|
|
13
|
+
opacity="0.35"
|
|
14
|
+
/>
|
|
15
|
+
</svg>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36" fill="none">
|
|
2
|
+
<circle cx="18" cy="18" r="18" fill="#A16207"/>
|
|
3
|
+
<path d="M11 9h11l3 3v15H11V9z" fill="#ffffff"/>
|
|
4
|
+
<path d="M22 9v4h4" fill="#FDE68A"/>
|
|
5
|
+
<path d="M15 16h7" stroke="#A16207" stroke-width="2" stroke-linecap="round"/>
|
|
6
|
+
<path d="M15 20h7" stroke="#A16207" stroke-width="2" stroke-linecap="round"/>
|
|
7
|
+
<path d="M15 24h4" stroke="#A16207" stroke-width="2" stroke-linecap="round"/>
|
|
8
|
+
</svg>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36" fill="none">
|
|
2
|
+
<circle cx="18" cy="18" r="18" fill="#0369A1"/>
|
|
3
|
+
<circle cx="16" cy="16" r="7" stroke="#ffffff" stroke-width="3"/>
|
|
4
|
+
<path d="M21.2 21.2l5.2 5.2" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
|
|
5
|
+
<path d="M12 16h8" stroke="#ffffff" stroke-width="1.8" stroke-linecap="round" opacity="0.45"/>
|
|
6
|
+
<path d="M16 12v8" stroke="#ffffff" stroke-width="1.8" stroke-linecap="round" opacity="0.45"/>
|
|
7
|
+
</svg>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="none">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="96" y1="64" x2="416" y2="448" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop stop-color="#2d2d2d"/>
|
|
5
|
+
<stop offset="1" stop-color="#1e1e1e"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="glow" x1="256" y1="120" x2="256" y2="392" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop stop-color="#007AFF" stop-opacity="0.35"/>
|
|
9
|
+
<stop offset="1" stop-color="#007AFF" stop-opacity="0"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
</defs>
|
|
12
|
+
|
|
13
|
+
<!-- App icon background -->
|
|
14
|
+
<rect width="512" height="512" rx="112" fill="url(#bg)"/>
|
|
15
|
+
<rect x="8" y="8" width="496" height="496" rx="104" stroke="#3e3e42" stroke-width="4"/>
|
|
16
|
+
|
|
17
|
+
<!-- Soft accent glow -->
|
|
18
|
+
<ellipse cx="320" cy="300" rx="140" ry="120" fill="url(#glow)"/>
|
|
19
|
+
|
|
20
|
+
<!-- Human-side bubble -->
|
|
21
|
+
<path
|
|
22
|
+
d="M112 168c0-26.5 21.5-48 48-48h112c26.5 0 48 21.5 48 48v88c0 26.5-21.5 48-48 48h-56l-36 36v-36h-20c-26.5 0-48-21.5-48-48v-88z"
|
|
23
|
+
fill="#2d2d2d"
|
|
24
|
+
stroke="#858585"
|
|
25
|
+
stroke-width="8"
|
|
26
|
+
stroke-linejoin="round"
|
|
27
|
+
/>
|
|
28
|
+
<circle cx="176" cy="216" r="10" fill="#858585"/>
|
|
29
|
+
<circle cx="216" cy="216" r="10" fill="#858585"/>
|
|
30
|
+
<circle cx="256" cy="216" r="10" fill="#858585"/>
|
|
31
|
+
|
|
32
|
+
<!-- AI companion bubble -->
|
|
33
|
+
<path
|
|
34
|
+
d="M192 248c0-26.5 21.5-48 48-48h112c26.5 0 48 21.5 48 48v88c0 26.5-21.5 48-48 48h-56l-36 36v-36h-20c-26.5 0-48-21.5-48-48v-88z"
|
|
35
|
+
fill="#007AFF"
|
|
36
|
+
/>
|
|
37
|
+
|
|
38
|
+
<!-- Spark / AI mark -->
|
|
39
|
+
<path
|
|
40
|
+
d="M320 276l12 24 26 4-19 18 5 26-24-13-24 13 5-26-19-18 26-4z"
|
|
41
|
+
fill="#ffffff"
|
|
42
|
+
opacity="0.95"
|
|
43
|
+
/>
|
|
44
|
+
</svg>
|
|
Binary file
|