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.
Files changed (164) hide show
  1. aichs-0.1.0/LICENSE +21 -0
  2. aichs-0.1.0/PKG-INFO +122 -0
  3. aichs-0.1.0/README.md +91 -0
  4. aichs-0.1.0/aichs.egg-info/PKG-INFO +122 -0
  5. aichs-0.1.0/aichs.egg-info/SOURCES.txt +162 -0
  6. aichs-0.1.0/aichs.egg-info/dependency_links.txt +1 -0
  7. aichs-0.1.0/aichs.egg-info/entry_points.txt +2 -0
  8. aichs-0.1.0/aichs.egg-info/requires.txt +5 -0
  9. aichs-0.1.0/aichs.egg-info/top_level.txt +7 -0
  10. aichs-0.1.0/app.py +1 -0
  11. aichs-0.1.0/assets/__init__.py +1 -0
  12. aichs-0.1.0/assets/avatars/agent.svg +15 -0
  13. aichs-0.1.0/assets/avatars/crew_archivist.svg +8 -0
  14. aichs-0.1.0/assets/avatars/crew_scout.svg +7 -0
  15. aichs-0.1.0/assets/avatars/human.svg +8 -0
  16. aichs-0.1.0/assets/checkmark.svg +3 -0
  17. aichs-0.1.0/assets/icon.svg +44 -0
  18. aichs-0.1.0/assets/logo.png +0 -0
  19. aichs-0.1.0/assets/logo.svg +62 -0
  20. aichs-0.1.0/assets/png/icon-128.png +0 -0
  21. aichs-0.1.0/assets/png/icon-16.png +0 -0
  22. aichs-0.1.0/assets/png/icon-256.png +0 -0
  23. aichs-0.1.0/assets/png/icon-32.png +0 -0
  24. aichs-0.1.0/assets/png/icon-512.png +0 -0
  25. aichs-0.1.0/assets/png/icon-64.png +0 -0
  26. aichs-0.1.0/config.py +28 -0
  27. aichs-0.1.0/docs/compact.md +63 -0
  28. aichs-0.1.0/docs/configuration.md +17 -0
  29. aichs-0.1.0/docs/custom-models.md +294 -0
  30. aichs-0.1.0/docs/extensions.md +458 -0
  31. aichs-0.1.0/docs/skills.md +45 -0
  32. aichs-0.1.0/main.py +63 -0
  33. aichs-0.1.0/pyproject.toml +63 -0
  34. aichs-0.1.0/services/__init__.py +0 -0
  35. aichs-0.1.0/services/auto_title.py +137 -0
  36. aichs-0.1.0/services/chat.py +752 -0
  37. aichs-0.1.0/services/chat_drag.py +143 -0
  38. aichs-0.1.0/services/compaction.py +356 -0
  39. aichs-0.1.0/services/content.py +343 -0
  40. aichs-0.1.0/services/context_budget.py +108 -0
  41. aichs-0.1.0/services/continuation.py +116 -0
  42. aichs-0.1.0/services/crew.py +249 -0
  43. aichs-0.1.0/services/crew_context.py +44 -0
  44. aichs-0.1.0/services/diff_html.py +100 -0
  45. aichs-0.1.0/services/export.py +126 -0
  46. aichs-0.1.0/services/file_ref_clipboard.py +71 -0
  47. aichs-0.1.0/services/git_diff.py +127 -0
  48. aichs-0.1.0/services/git_status.py +71 -0
  49. aichs-0.1.0/services/highlight.py +42 -0
  50. aichs-0.1.0/services/model_registry.py +361 -0
  51. aichs-0.1.0/services/palette.py +155 -0
  52. aichs-0.1.0/services/processes.py +420 -0
  53. aichs-0.1.0/services/shell_tool.py +11 -0
  54. aichs-0.1.0/services/skills.py +73 -0
  55. aichs-0.1.0/services/slash_commands.py +113 -0
  56. aichs-0.1.0/services/subprocess_utils.py +32 -0
  57. aichs-0.1.0/services/terminal_refs.py +89 -0
  58. aichs-0.1.0/services/tool_policy.py +201 -0
  59. aichs-0.1.0/services/tool_registry.py +766 -0
  60. aichs-0.1.0/services/tools.py +969 -0
  61. aichs-0.1.0/services/usage.py +112 -0
  62. aichs-0.1.0/services/user_terminal.py +118 -0
  63. aichs-0.1.0/services/workspace.py +120 -0
  64. aichs-0.1.0/setup.cfg +4 -0
  65. aichs-0.1.0/storage/__init__.py +0 -0
  66. aichs-0.1.0/storage/repository.py +157 -0
  67. aichs-0.1.0/storage/settings.py +67 -0
  68. aichs-0.1.0/tests/test_auto_title.py +169 -0
  69. aichs-0.1.0/tests/test_avatars.py +28 -0
  70. aichs-0.1.0/tests/test_avatars_render.py +23 -0
  71. aichs-0.1.0/tests/test_bubble_markdown.py +81 -0
  72. aichs-0.1.0/tests/test_build_package.py +25 -0
  73. aichs-0.1.0/tests/test_chat.py +237 -0
  74. aichs-0.1.0/tests/test_chat_loop.py +77 -0
  75. aichs-0.1.0/tests/test_chat_panel_crew.py +90 -0
  76. aichs-0.1.0/tests/test_chat_panel_history.py +136 -0
  77. aichs-0.1.0/tests/test_chat_panel_model.py +39 -0
  78. aichs-0.1.0/tests/test_chat_panel_runtime_queue.py +165 -0
  79. aichs-0.1.0/tests/test_chat_panel_title.py +75 -0
  80. aichs-0.1.0/tests/test_chat_tools.py +202 -0
  81. aichs-0.1.0/tests/test_compaction.py +205 -0
  82. aichs-0.1.0/tests/test_compaction_api.py +37 -0
  83. aichs-0.1.0/tests/test_content.py +267 -0
  84. aichs-0.1.0/tests/test_context_analyze.py +37 -0
  85. aichs-0.1.0/tests/test_context_budget.py +62 -0
  86. aichs-0.1.0/tests/test_continuation.py +83 -0
  87. aichs-0.1.0/tests/test_conversation_panel.py +81 -0
  88. aichs-0.1.0/tests/test_crew.py +79 -0
  89. aichs-0.1.0/tests/test_crew_context.py +32 -0
  90. aichs-0.1.0/tests/test_decision_memory_extension.py +99 -0
  91. aichs-0.1.0/tests/test_diff_html.py +56 -0
  92. aichs-0.1.0/tests/test_docs_dialog.py +49 -0
  93. aichs-0.1.0/tests/test_drag_refs.py +93 -0
  94. aichs-0.1.0/tests/test_export.py +152 -0
  95. aichs-0.1.0/tests/test_extensions_dialog.py +94 -0
  96. aichs-0.1.0/tests/test_file_mention_picker.py +22 -0
  97. aichs-0.1.0/tests/test_file_ref_clipboard.py +30 -0
  98. aichs-0.1.0/tests/test_file_viewer.py +8 -0
  99. aichs-0.1.0/tests/test_git_diff.py +22 -0
  100. aichs-0.1.0/tests/test_git_diff_branches.py +29 -0
  101. aichs-0.1.0/tests/test_git_diff_helpers.py +35 -0
  102. aichs-0.1.0/tests/test_git_diff_more.py +32 -0
  103. aichs-0.1.0/tests/test_git_status.py +51 -0
  104. aichs-0.1.0/tests/test_highlight.py +11 -0
  105. aichs-0.1.0/tests/test_highlight_edge.py +11 -0
  106. aichs-0.1.0/tests/test_message_input.py +253 -0
  107. aichs-0.1.0/tests/test_model_context.py +86 -0
  108. aichs-0.1.0/tests/test_model_registry.py +140 -0
  109. aichs-0.1.0/tests/test_palette.py +45 -0
  110. aichs-0.1.0/tests/test_process_sessions_extension.py +88 -0
  111. aichs-0.1.0/tests/test_processes.py +152 -0
  112. aichs-0.1.0/tests/test_registry_ui.py +58 -0
  113. aichs-0.1.0/tests/test_repository.py +134 -0
  114. aichs-0.1.0/tests/test_runtime_continue_extension.py +35 -0
  115. aichs-0.1.0/tests/test_runtime_guard_extension.py +151 -0
  116. aichs-0.1.0/tests/test_settings.py +45 -0
  117. aichs-0.1.0/tests/test_settings_dialog.py +233 -0
  118. aichs-0.1.0/tests/test_skill_picker.py +53 -0
  119. aichs-0.1.0/tests/test_skills.py +23 -0
  120. aichs-0.1.0/tests/test_slash_commands.py +111 -0
  121. aichs-0.1.0/tests/test_subprocess_utils.py +19 -0
  122. aichs-0.1.0/tests/test_terminal_card.py +80 -0
  123. aichs-0.1.0/tests/test_theme.py +65 -0
  124. aichs-0.1.0/tests/test_theme_styles.py +45 -0
  125. aichs-0.1.0/tests/test_threads.py +46 -0
  126. aichs-0.1.0/tests/test_tool_policy.py +94 -0
  127. aichs-0.1.0/tests/test_tool_policy_bus.py +90 -0
  128. aichs-0.1.0/tests/test_tool_registry.py +471 -0
  129. aichs-0.1.0/tests/test_tools_coverage.py +492 -0
  130. aichs-0.1.0/tests/test_tools_execute.py +147 -0
  131. aichs-0.1.0/tests/test_tools_helpers.py +78 -0
  132. aichs-0.1.0/tests/test_tools_more.py +54 -0
  133. aichs-0.1.0/tests/test_usage.py +41 -0
  134. aichs-0.1.0/tests/test_user_terminal.py +118 -0
  135. aichs-0.1.0/tests/test_web_fetch_extension.py +50 -0
  136. aichs-0.1.0/tests/test_win_caption.py +52 -0
  137. aichs-0.1.0/tests/test_workspace.py +52 -0
  138. aichs-0.1.0/ui/__init__.py +0 -0
  139. aichs-0.1.0/ui/avatars.py +123 -0
  140. aichs-0.1.0/ui/main_window.py +178 -0
  141. aichs-0.1.0/ui/theme.py +686 -0
  142. aichs-0.1.0/ui/widgets/__init__.py +0 -0
  143. aichs-0.1.0/ui/widgets/bubble.py +583 -0
  144. aichs-0.1.0/ui/widgets/chat_panel.py +2823 -0
  145. aichs-0.1.0/ui/widgets/code_card.py +138 -0
  146. aichs-0.1.0/ui/widgets/command_palette.py +161 -0
  147. aichs-0.1.0/ui/widgets/context_breakdown.py +123 -0
  148. aichs-0.1.0/ui/widgets/context_ring.py +69 -0
  149. aichs-0.1.0/ui/widgets/conversation_panel.py +470 -0
  150. aichs-0.1.0/ui/widgets/docs_dialog.py +170 -0
  151. aichs-0.1.0/ui/widgets/extension_contributions.py +151 -0
  152. aichs-0.1.0/ui/widgets/extension_panel_dialog.py +292 -0
  153. aichs-0.1.0/ui/widgets/extensions_dialog.py +809 -0
  154. aichs-0.1.0/ui/widgets/file_mention_picker.py +112 -0
  155. aichs-0.1.0/ui/widgets/file_viewer.py +270 -0
  156. aichs-0.1.0/ui/widgets/git_changes_list.py +74 -0
  157. aichs-0.1.0/ui/widgets/git_panel.py +134 -0
  158. aichs-0.1.0/ui/widgets/left_panel.py +404 -0
  159. aichs-0.1.0/ui/widgets/message_input.py +681 -0
  160. aichs-0.1.0/ui/widgets/settings_dialog.py +1438 -0
  161. aichs-0.1.0/ui/widgets/skill_picker.py +119 -0
  162. aichs-0.1.0/ui/widgets/terminal_card.py +211 -0
  163. aichs-0.1.0/ui/widgets/tool_approval_dialog.py +194 -0
  164. 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
+ ![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue)
39
+ ![Tests](https://github.com/nadav-yo/aichs/actions/workflows/tests.yml/badge.svg)
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
+ ![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue)
8
+ ![Tests](https://github.com/nadav-yo/aichs/actions/workflows/tests.yml/badge.svg)
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
+ ![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue)
39
+ ![Tests](https://github.com/nadav-yo/aichs/actions/workflows/tests.yml/badge.svg)
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,2 @@
1
+ [console_scripts]
2
+ aichs = main:main
@@ -0,0 +1,5 @@
1
+ PyQt6==6.11.0
2
+ anthropic==0.104.1
3
+ openai==2.38.0
4
+ markdown==3.10.2
5
+ pygments==2.20.0
@@ -0,0 +1,7 @@
1
+ app
2
+ assets
3
+ config
4
+ main
5
+ services
6
+ storage
7
+ ui
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,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="#34C759"/>
3
+ <circle cx="18" cy="14" r="5.5" fill="#ffffff"/>
4
+ <path
5
+ d="M9 30c0-5.5 4-9 9-9s9 3.5 9 9"
6
+ fill="#ffffff"
7
+ />
8
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
2
+ <path d="M3.2 8.1 6.5 11.3 12.8 4.7" fill="none" stroke="#528bff" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
3
+ </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