ace-git-copilot 0.3.7__tar.gz → 0.3.9__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 (129) hide show
  1. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/PKG-INFO +7 -62
  2. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/README.md +6 -61
  3. ace_git_copilot-0.3.9/ace/__init__.py +1 -0
  4. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/history_analyzer.py +2 -1
  5. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/rebase_helper.py +2 -1
  6. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/core/git_ops.py +3 -2
  7. ace_git_copilot-0.3.9/ace/utils/string_utils.py +40 -0
  8. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/pyproject.toml +1 -1
  9. ace_git_copilot-0.3.9/tests/test_string_utils.py +17 -0
  10. ace_git_copilot-0.3.7/ace/__init__.py +0 -1
  11. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/AGENTS.md +0 -0
  12. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/BRIEFING.md +0 -0
  13. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/ORIGINAL_REQUEST.md +0 -0
  14. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/e2e_testing_track/BRIEFING.md +0 -0
  15. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/e2e_testing_track/ORIGINAL_REQUEST.md +0 -0
  16. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/e2e_testing_track/SCOPE.md +0 -0
  17. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/e2e_testing_track/progress.md +0 -0
  18. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/BRIEFING.md +0 -0
  19. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/ORIGINAL_REQUEST.md +0 -0
  20. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/emojis_list.txt +0 -0
  21. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/find_unused_modules.py +0 -0
  22. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/handoff.md +0 -0
  23. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/measure_lazy_startup.py +0 -0
  24. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/measure_startup.py +0 -0
  25. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/profile_imports.py +0 -0
  26. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/progress.md +0 -0
  27. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/run_importtime.py +0 -0
  28. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/search_banner.py +0 -0
  29. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/search_emojis.py +0 -0
  30. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/search_git_usages.py +0 -0
  31. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/search_usages.py +0 -0
  32. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/test_import_profiler.py +0 -0
  33. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/explorer_init/test_mocked_sys.py +0 -0
  34. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/handoff.md +0 -0
  35. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/implementation_track/BRIEFING.md +0 -0
  36. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/implementation_track/ORIGINAL_REQUEST.md +0 -0
  37. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/implementation_track/explorer_initial_report.md +0 -0
  38. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/implementation_track/progress.md +0 -0
  39. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/orchestrator/.gitkeep +0 -0
  40. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/orchestrator/BRIEFING.md +0 -0
  41. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/orchestrator/ORIGINAL_REQUEST.md +0 -0
  42. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/orchestrator/PROJECT.md +0 -0
  43. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/orchestrator/progress.md +0 -0
  44. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/teamwork_preview_explorer_e2e_explore/BRIEFING.md +0 -0
  45. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/teamwork_preview_explorer_e2e_explore/ORIGINAL_REQUEST.md +0 -0
  46. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/teamwork_preview_explorer_e2e_explore/handoff.md +0 -0
  47. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/teamwork_preview_explorer_e2e_explore/progress.md +0 -0
  48. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/worker_e2e_testing/BRIEFING.md +0 -0
  49. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/worker_e2e_testing/ORIGINAL_REQUEST.md +0 -0
  50. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/worker_e2e_testing/progress.md +0 -0
  51. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/worker_m1_startup/BRIEFING.md +0 -0
  52. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/worker_m1_startup/ORIGINAL_REQUEST.md +0 -0
  53. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.agents/worker_m1_startup/progress.md +0 -0
  54. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.env.example +0 -0
  55. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.github/workflows/tests.yml +0 -0
  56. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/.gitignore +0 -0
  57. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/CODE_OF_CONDUCT.md +0 -0
  58. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/CONTRIBUTING.md +0 -0
  59. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/LICENSE +0 -0
  60. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/PROJECT.md +0 -0
  61. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/SECURITY.md +0 -0
  62. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/SUPPORT.md +0 -0
  63. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/TEST_INFRA.md +0 -0
  64. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/TEST_READY.md +0 -0
  65. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/__main__.py +0 -0
  66. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/changelog_generator.py +0 -0
  67. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/code_reviewer.py +0 -0
  68. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/commit_generator.py +0 -0
  69. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/conflict_resolver.py +0 -0
  70. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/gitignore_generator.py +0 -0
  71. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/intent_parser.py +0 -0
  72. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/llm_factory.py +0 -0
  73. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/pr_drafter.py +0 -0
  74. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/changelog.py +0 -0
  75. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/commit.py +0 -0
  76. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/conflict.py +0 -0
  77. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/doctor.py +0 -0
  78. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/explain.py +0 -0
  79. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/ignore.py +0 -0
  80. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/intent.py +0 -0
  81. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/pr.py +0 -0
  82. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/rebase.py +0 -0
  83. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/review.py +0 -0
  84. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/search.py +0 -0
  85. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ai/prompts/undo.py +0 -0
  86. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/cli.py +0 -0
  87. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/core/config.py +0 -0
  88. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/core/context.py +0 -0
  89. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/core/diagnostics.py +0 -0
  90. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/core/hooks.py +0 -0
  91. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/core/safety.py +0 -0
  92. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ui/banner.py +0 -0
  93. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ui/dashboard.py +0 -0
  94. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ui/display.py +0 -0
  95. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ui/prompts.py +0 -0
  96. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/ui/themes.py +0 -0
  97. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/utils/conflict_parser.py +0 -0
  98. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/utils/diff_parser.py +0 -0
  99. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/ace/utils/json_utils.py +0 -0
  100. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/conftest.py +0 -0
  101. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/e2e/conftest.py +0 -0
  102. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/e2e/test_tier1_features.py +0 -0
  103. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/e2e/test_tier2_boundaries.py +0 -0
  104. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/e2e/test_tier3_combinations.py +0 -0
  105. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/e2e/test_tier4_workloads.py +0 -0
  106. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_changelog_generator.py +0 -0
  107. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_code_reviewer.py +0 -0
  108. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_config_atomic_write.py +0 -0
  109. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_conflict_resolver.py +0 -0
  110. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_conflict_resolver_backup.py +0 -0
  111. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_context_gitdir_detection.py +0 -0
  112. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_diagnostics.py +0 -0
  113. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_diff_trimmer.py +0 -0
  114. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_git_ops.py +0 -0
  115. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_git_ops_execute.py +0 -0
  116. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_help.py +0 -0
  117. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_history_analyzer.py +0 -0
  118. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_hooks.py +0 -0
  119. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_ignore.py +0 -0
  120. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_intent_parser.py +0 -0
  121. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_llm_factory.py +0 -0
  122. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_llm_factory_ollama.py +0 -0
  123. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_merge_state.py +0 -0
  124. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_pr_drafter.py +0 -0
  125. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_rebase_helper.py +0 -0
  126. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_safety.py +0 -0
  127. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_search.py +0 -0
  128. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_undo.py +0 -0
  129. {ace_git_copilot-0.3.7 → ace_git_copilot-0.3.9}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ace-git-copilot
3
- Version: 0.3.7
3
+ Version: 0.3.9
4
4
  Summary: AI-powered Git copilot — talk to Git in plain English
5
5
  Project-URL: Homepage, https://github.com/jachinsamuel/Ace
6
6
  Project-URL: Documentation, https://github.com/jachinsamuel/Ace#readme
@@ -143,12 +143,14 @@ Allows using any custom endpoint that supports the OpenAI API schema (e.g. Groq,
143
143
  ## Usage
144
144
 
145
145
  ### Natural Language Mode
146
- Run natural language requests directly in quotes:
146
+
147
+ You can speak to Git in plain English. There is no need to use double quotes — simply write your request directly:
147
148
  ```bash
148
- ace "stage everything and commit with a message about authentication"
149
- ace "undo my last commit but keep the files"
150
- ace "switch to a new branch called design-updates"
149
+ ace stage everything and commit with a message about authentication
150
+ ace undo my last commit but keep the files
151
+ ace switch to a new branch called design-updates
151
152
  ```
153
+ *(Double quotes are optional, e.g. `ace "stage everything and commit"`).*
152
154
 
153
155
  ### Command-Line Toolchain
154
156
  Ace has dedicated subcommands for specific tasks. Here is the complete command list:
@@ -194,60 +196,3 @@ The dashboard features:
194
196
  ## License
195
197
 
196
198
  Distributed under the MIT License. See [LICENSE](LICENSE) for more details.
197
-
198
- ---
199
-
200
- ## Changelog
201
-
202
- ### v0.3.7 — UI Status Icons Modernization (2026-07-14)
203
- * Replaced clunky double-character ASCII status indicators (`>>`, `**`, `!!`, `EE`) with clean, modern Unicode status icons (`›`, `✔`, `⚠`, `✘`).
204
- * Updated confirm prompts, severity warnings, and code review listings to use the new icons for a clean, consistent terminal interface.
205
-
206
- ### v0.3.6 — Merge/Rebase Conflict Planning Fix (2026-07-12)
207
- * Enhanced repository context builder to check for active unmerged files in the index, distinguishing between resolved and unresolved conflict states.
208
- * Updated AI intent guidelines to prevent the planner from incorrectly suggesting `git merge --abort` when conflicts are already resolved and ready to be finalized.
209
-
210
- ### v0.3.5 — Empty Diff Handling (2026-07-11)
211
- * Improved warning panel message and title when committing empty files or mode changes to prevent confusing users when files are already staged.
212
-
213
- ### v0.3.4 — Workspace Management (2026-07-11)
214
- * Added new `workspace` command (alias `ws`) to scan, monitor, and navigate multiple repositories.
215
- * Shows active branch, staged/unstaged/untracked file counts, and local upstream sync offsets in a Rich Table.
216
- * Supports interactive actions to open the TUI dashboard, spawn a nested shell, or run copy-paste commands inside any chosen repository.
217
-
218
- ### v0.3.3 — Stability & Resilience (2026-07-04)
219
- * Implemented streaming progress and download percentages for Ollama model pulls to prevent thread hangs.
220
- * Added atomic file saves and rollback backups for merge conflict resolutions and config modifications to prevent data corruption.
221
- * Fixed merge/rebase detection in git worktrees and submodules by resolving the authoritative `git_dir` dynamically.
222
- * Added `shlex` command splitting to safely parse and execute quoted arguments in Git commands.
223
- * Created python module entry point (`python -m ace`) for nested execution support.
224
-
225
- ### v0.3.2 — Windows Compatibility & E2E Fixes (2026-07-01)
226
- * Resolved Windows-specific UTF-8 encoding issues in E2E tests and log parsers.
227
- * Fixed subprocess natural language command execution paths to execute nested ace commands through Python interpreter contexts.
228
- * Refactored CLI error panel formatting to match expected exception names.
229
-
230
- ### v0.3.1 — Patch (2026-06-30)
231
- * Fixed invisible key labels (`[c]`, `[r]`, etc.) in the dashboard and search menus caused by Rich markup tag conflicts.
232
- * Fixed `[Y/n]` confirmation prompt rendering invisibly.
233
-
234
- ### v0.3.0 — UI Polish (2026-06-30)
235
- * Rewrote all UI output modules (`display.py`, `prompts.py`, `dashboard.py`, `themes.py`) for a polished, professional look.
236
- * Removed all unprofessional emojis; replaced with clean ASCII status symbols (`>>`, `**`, `!!`, `EE`).
237
- * Dashboard panels now use consistent `ROUNDED` borders, colour-coded file lists (`+` staged, `~` unstaged, `?` untracked), and a styled commit history table.
238
- * Execution plan table uses `SIMPLE_HEAD` style with colour-highlighted `git` and `ace` command prefixes.
239
- * Commit message panel shows character count badge coloured green/amber/red relative to the 72-char limit.
240
- * AI code review score rendered as a styled badge based on score range.
241
- * Added `[tool.ruff]` configuration to exclude `.agents/` scratch folder from lint checks.
242
-
243
- ### v0.2.9 — Metadata & Build Fix (2026-06-30)
244
- * Fixed broken `pyproject.toml` TOML syntax (invalid inline `urls` table).
245
- * Added full `authors` and `[project.urls]` metadata visible on PyPI.
246
-
247
- ### v0.2.6 — Startup Optimisation (2026-06-21)
248
- * Implemented lazy-loading for all heavy LangChain imports — CLI startup under 200 ms.
249
- * Added `ace switch` command for switching between sibling repositories from the dashboard.
250
-
251
- ### v0.2.3 — Feature Expansion (2026-06-09)
252
- * Added `ace doctor`, `ace hook`, and `ace squash` commands.
253
- * Comprehensive E2E test suite added under `tests/e2e/`.
@@ -110,12 +110,14 @@ Allows using any custom endpoint that supports the OpenAI API schema (e.g. Groq,
110
110
  ## Usage
111
111
 
112
112
  ### Natural Language Mode
113
- Run natural language requests directly in quotes:
113
+
114
+ You can speak to Git in plain English. There is no need to use double quotes — simply write your request directly:
114
115
  ```bash
115
- ace "stage everything and commit with a message about authentication"
116
- ace "undo my last commit but keep the files"
117
- ace "switch to a new branch called design-updates"
116
+ ace stage everything and commit with a message about authentication
117
+ ace undo my last commit but keep the files
118
+ ace switch to a new branch called design-updates
118
119
  ```
120
+ *(Double quotes are optional, e.g. `ace "stage everything and commit"`).*
119
121
 
120
122
  ### Command-Line Toolchain
121
123
  Ace has dedicated subcommands for specific tasks. Here is the complete command list:
@@ -161,60 +163,3 @@ The dashboard features:
161
163
  ## License
162
164
 
163
165
  Distributed under the MIT License. See [LICENSE](LICENSE) for more details.
164
-
165
- ---
166
-
167
- ## Changelog
168
-
169
- ### v0.3.7 — UI Status Icons Modernization (2026-07-14)
170
- * Replaced clunky double-character ASCII status indicators (`>>`, `**`, `!!`, `EE`) with clean, modern Unicode status icons (`›`, `✔`, `⚠`, `✘`).
171
- * Updated confirm prompts, severity warnings, and code review listings to use the new icons for a clean, consistent terminal interface.
172
-
173
- ### v0.3.6 — Merge/Rebase Conflict Planning Fix (2026-07-12)
174
- * Enhanced repository context builder to check for active unmerged files in the index, distinguishing between resolved and unresolved conflict states.
175
- * Updated AI intent guidelines to prevent the planner from incorrectly suggesting `git merge --abort` when conflicts are already resolved and ready to be finalized.
176
-
177
- ### v0.3.5 — Empty Diff Handling (2026-07-11)
178
- * Improved warning panel message and title when committing empty files or mode changes to prevent confusing users when files are already staged.
179
-
180
- ### v0.3.4 — Workspace Management (2026-07-11)
181
- * Added new `workspace` command (alias `ws`) to scan, monitor, and navigate multiple repositories.
182
- * Shows active branch, staged/unstaged/untracked file counts, and local upstream sync offsets in a Rich Table.
183
- * Supports interactive actions to open the TUI dashboard, spawn a nested shell, or run copy-paste commands inside any chosen repository.
184
-
185
- ### v0.3.3 — Stability & Resilience (2026-07-04)
186
- * Implemented streaming progress and download percentages for Ollama model pulls to prevent thread hangs.
187
- * Added atomic file saves and rollback backups for merge conflict resolutions and config modifications to prevent data corruption.
188
- * Fixed merge/rebase detection in git worktrees and submodules by resolving the authoritative `git_dir` dynamically.
189
- * Added `shlex` command splitting to safely parse and execute quoted arguments in Git commands.
190
- * Created python module entry point (`python -m ace`) for nested execution support.
191
-
192
- ### v0.3.2 — Windows Compatibility & E2E Fixes (2026-07-01)
193
- * Resolved Windows-specific UTF-8 encoding issues in E2E tests and log parsers.
194
- * Fixed subprocess natural language command execution paths to execute nested ace commands through Python interpreter contexts.
195
- * Refactored CLI error panel formatting to match expected exception names.
196
-
197
- ### v0.3.1 — Patch (2026-06-30)
198
- * Fixed invisible key labels (`[c]`, `[r]`, etc.) in the dashboard and search menus caused by Rich markup tag conflicts.
199
- * Fixed `[Y/n]` confirmation prompt rendering invisibly.
200
-
201
- ### v0.3.0 — UI Polish (2026-06-30)
202
- * Rewrote all UI output modules (`display.py`, `prompts.py`, `dashboard.py`, `themes.py`) for a polished, professional look.
203
- * Removed all unprofessional emojis; replaced with clean ASCII status symbols (`>>`, `**`, `!!`, `EE`).
204
- * Dashboard panels now use consistent `ROUNDED` borders, colour-coded file lists (`+` staged, `~` unstaged, `?` untracked), and a styled commit history table.
205
- * Execution plan table uses `SIMPLE_HEAD` style with colour-highlighted `git` and `ace` command prefixes.
206
- * Commit message panel shows character count badge coloured green/amber/red relative to the 72-char limit.
207
- * AI code review score rendered as a styled badge based on score range.
208
- * Added `[tool.ruff]` configuration to exclude `.agents/` scratch folder from lint checks.
209
-
210
- ### v0.2.9 — Metadata & Build Fix (2026-06-30)
211
- * Fixed broken `pyproject.toml` TOML syntax (invalid inline `urls` table).
212
- * Added full `authors` and `[project.urls]` metadata visible on PyPI.
213
-
214
- ### v0.2.6 — Startup Optimisation (2026-06-21)
215
- * Implemented lazy-loading for all heavy LangChain imports — CLI startup under 200 ms.
216
- * Added `ace switch` command for switching between sibling repositories from the dashboard.
217
-
218
- ### v0.2.3 — Feature Expansion (2026-06-09)
219
- * Added `ace doctor`, `ace hook`, and `ace squash` commands.
220
- * Comprehensive E2E test suite added under `tests/e2e/`.
@@ -0,0 +1 @@
1
+ __version__ = "0.3.9"
@@ -38,8 +38,9 @@ class HistoryAnalyzer:
38
38
  HumanMessage(content=user_prompt)
39
39
  ]
40
40
 
41
+ from ace.utils.string_utils import strip_emojis
41
42
  response = llm.invoke(messages)
42
- return response.content.strip()
43
+ return strip_emojis(response.content.strip())
43
44
 
44
45
  def get_repo_stats(self) -> Dict[str, Any]:
45
46
  """
@@ -20,6 +20,7 @@ class RebaseHelper:
20
20
  except Exception:
21
21
  return []
22
22
 
23
+ from ace.utils.string_utils import strip_emojis
23
24
  commits = []
24
25
  for line in log_data.splitlines():
25
26
  if "|" in line:
@@ -28,7 +29,7 @@ class RebaseHelper:
28
29
  commits.append({
29
30
  "hexsha": parts[0],
30
31
  "author": parts[1],
31
- "summary": parts[2].strip()
32
+ "summary": strip_emojis(parts[2].strip())
32
33
  })
33
34
  return commits
34
35
 
@@ -101,12 +101,13 @@ class GitOps:
101
101
  args.append(path)
102
102
 
103
103
  try:
104
+ from ace.utils.string_utils import strip_emojis
104
105
  commits = self.repo.iter_commits(*args, **kwargs)
105
106
  return [
106
107
  {
107
108
  "hexsha": commit.hexsha,
108
- "summary": commit.summary,
109
- "message": commit.message,
109
+ "summary": strip_emojis(commit.summary),
110
+ "message": strip_emojis(commit.message),
110
111
  "author": commit.author.name,
111
112
  "date": commit.committed_datetime.isoformat(),
112
113
  }
@@ -0,0 +1,40 @@
1
+ import re
2
+
3
+ def strip_emojis(text: str) -> str:
4
+ """
5
+ Strip Unicode emojis from text to keep the terminal UI clean.
6
+ """
7
+ if not text:
8
+ return text
9
+
10
+ # Unicode emoji ranges:
11
+ # - \U0001f600-\U0001f64f (emoticons)
12
+ # - \U0001f300-\U0001f5ff (symbols & pictographs)
13
+ # - \U0001f680-\U0001f6ff (transport & map symbols)
14
+ # - \U0001f1e0-\U0001f1ff (flags)
15
+ # - \U00002700-\U000027bf (dingbats)
16
+ # - \U00002600-\U000026ff (miscellaneous symbols)
17
+ # - \U0001f900-\U0001f9ff (supplemental symbols)
18
+ # - \U0001fa00-\U0001faff (symbols and pictographs extended)
19
+ emoji_pattern = re.compile(
20
+ "["
21
+ "\U0001f600-\U0001f64f"
22
+ "\U0001f300-\U0001f5ff"
23
+ "\U0001f680-\U0001f6ff"
24
+ "\U0001f1e0-\U0001f1ff"
25
+ "\U00002700-\U000027bf"
26
+ "\U00002600-\U000026ff"
27
+ "\U0001f900-\U0001f9ff"
28
+ "\U0001fa00-\U0001faff"
29
+ "]+",
30
+ re.UNICODE
31
+ )
32
+
33
+ cleaned = emoji_pattern.sub("", text)
34
+ # Replace multiple spaces/newlines with a single space (while preserving newlines if multi-line)
35
+ # To be safe for markdown summaries, we can just strip emojis and keep other formatting intact.
36
+ # Let's do a simple strip of double spaces that result from removing the emoji.
37
+ cleaned = re.sub(r' +', ' ', cleaned)
38
+ # Also clean up trailing/leading spaces on lines
39
+ lines = [line.strip() for line in cleaned.splitlines()]
40
+ return "\n".join(lines).strip()
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ace-git-copilot"
3
- version = "0.3.7"
3
+ version = "0.3.9"
4
4
  description = "AI-powered Git copilot — talk to Git in plain English"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -0,0 +1,17 @@
1
+ from ace.utils.string_utils import strip_emojis
2
+
3
+ def test_strip_emojis():
4
+ # Test cases with different kinds of emojis and text
5
+ assert strip_emojis("🎨 style(ui): update hover effects") == "style(ui): update hover effects"
6
+ assert strip_emojis("🚀 feat(app): implement loader") == "feat(app): implement loader"
7
+ assert strip_emojis("🤖 feat: implement robot") == "feat: implement robot"
8
+ assert strip_emojis("📝 docs: update readme") == "docs: update readme"
9
+ assert strip_emojis("Normal message without emoji") == "Normal message without emoji"
10
+ assert strip_emojis("Multiple emojis 🎨 🚀 test") == "Multiple emojis test"
11
+ assert strip_emojis("") == ""
12
+ assert strip_emojis(None) is None
13
+
14
+ # Test multi-line text
15
+ multi_line = "🎨 First line\n🚀 Second line"
16
+ expected = "First line\nSecond line"
17
+ assert strip_emojis(multi_line) == expected
@@ -1 +0,0 @@
1
- __version__ = "0.3.7"
File without changes