ace-git-copilot 0.3.6__tar.gz → 0.3.8__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.6 → ace_git_copilot-0.3.8}/PKG-INFO +9 -1
  2. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/README.md +8 -0
  3. ace_git_copilot-0.3.8/ace/__init__.py +1 -0
  4. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/history_analyzer.py +2 -1
  5. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/rebase_helper.py +2 -1
  6. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/core/git_ops.py +3 -2
  7. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ui/display.py +7 -7
  8. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ui/prompts.py +1 -1
  9. ace_git_copilot-0.3.8/ace/utils/string_utils.py +40 -0
  10. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/pyproject.toml +1 -1
  11. ace_git_copilot-0.3.8/tests/test_string_utils.py +17 -0
  12. ace_git_copilot-0.3.6/ace/__init__.py +0 -1
  13. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/AGENTS.md +0 -0
  14. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/BRIEFING.md +0 -0
  15. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/ORIGINAL_REQUEST.md +0 -0
  16. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/e2e_testing_track/BRIEFING.md +0 -0
  17. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/e2e_testing_track/ORIGINAL_REQUEST.md +0 -0
  18. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/e2e_testing_track/SCOPE.md +0 -0
  19. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/e2e_testing_track/progress.md +0 -0
  20. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/BRIEFING.md +0 -0
  21. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/ORIGINAL_REQUEST.md +0 -0
  22. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/emojis_list.txt +0 -0
  23. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/find_unused_modules.py +0 -0
  24. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/handoff.md +0 -0
  25. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/measure_lazy_startup.py +0 -0
  26. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/measure_startup.py +0 -0
  27. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/profile_imports.py +0 -0
  28. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/progress.md +0 -0
  29. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/run_importtime.py +0 -0
  30. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/search_banner.py +0 -0
  31. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/search_emojis.py +0 -0
  32. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/search_git_usages.py +0 -0
  33. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/search_usages.py +0 -0
  34. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/test_import_profiler.py +0 -0
  35. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/explorer_init/test_mocked_sys.py +0 -0
  36. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/handoff.md +0 -0
  37. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/implementation_track/BRIEFING.md +0 -0
  38. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/implementation_track/ORIGINAL_REQUEST.md +0 -0
  39. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/implementation_track/explorer_initial_report.md +0 -0
  40. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/implementation_track/progress.md +0 -0
  41. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/orchestrator/.gitkeep +0 -0
  42. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/orchestrator/BRIEFING.md +0 -0
  43. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/orchestrator/ORIGINAL_REQUEST.md +0 -0
  44. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/orchestrator/PROJECT.md +0 -0
  45. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/orchestrator/progress.md +0 -0
  46. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/teamwork_preview_explorer_e2e_explore/BRIEFING.md +0 -0
  47. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/teamwork_preview_explorer_e2e_explore/ORIGINAL_REQUEST.md +0 -0
  48. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/teamwork_preview_explorer_e2e_explore/handoff.md +0 -0
  49. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/teamwork_preview_explorer_e2e_explore/progress.md +0 -0
  50. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/worker_e2e_testing/BRIEFING.md +0 -0
  51. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/worker_e2e_testing/ORIGINAL_REQUEST.md +0 -0
  52. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/worker_e2e_testing/progress.md +0 -0
  53. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/worker_m1_startup/BRIEFING.md +0 -0
  54. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/worker_m1_startup/ORIGINAL_REQUEST.md +0 -0
  55. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.agents/worker_m1_startup/progress.md +0 -0
  56. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.env.example +0 -0
  57. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.github/workflows/tests.yml +0 -0
  58. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/.gitignore +0 -0
  59. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/CODE_OF_CONDUCT.md +0 -0
  60. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/CONTRIBUTING.md +0 -0
  61. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/LICENSE +0 -0
  62. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/PROJECT.md +0 -0
  63. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/SECURITY.md +0 -0
  64. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/SUPPORT.md +0 -0
  65. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/TEST_INFRA.md +0 -0
  66. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/TEST_READY.md +0 -0
  67. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/__main__.py +0 -0
  68. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/changelog_generator.py +0 -0
  69. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/code_reviewer.py +0 -0
  70. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/commit_generator.py +0 -0
  71. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/conflict_resolver.py +0 -0
  72. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/gitignore_generator.py +0 -0
  73. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/intent_parser.py +0 -0
  74. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/llm_factory.py +0 -0
  75. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/pr_drafter.py +0 -0
  76. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/changelog.py +0 -0
  77. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/commit.py +0 -0
  78. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/conflict.py +0 -0
  79. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/doctor.py +0 -0
  80. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/explain.py +0 -0
  81. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/ignore.py +0 -0
  82. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/intent.py +0 -0
  83. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/pr.py +0 -0
  84. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/rebase.py +0 -0
  85. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/review.py +0 -0
  86. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/search.py +0 -0
  87. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ai/prompts/undo.py +0 -0
  88. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/cli.py +0 -0
  89. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/core/config.py +0 -0
  90. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/core/context.py +0 -0
  91. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/core/diagnostics.py +0 -0
  92. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/core/hooks.py +0 -0
  93. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/core/safety.py +0 -0
  94. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ui/banner.py +0 -0
  95. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ui/dashboard.py +0 -0
  96. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/ui/themes.py +0 -0
  97. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/utils/conflict_parser.py +0 -0
  98. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/utils/diff_parser.py +0 -0
  99. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/ace/utils/json_utils.py +0 -0
  100. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/conftest.py +0 -0
  101. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/e2e/conftest.py +0 -0
  102. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/e2e/test_tier1_features.py +0 -0
  103. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/e2e/test_tier2_boundaries.py +0 -0
  104. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/e2e/test_tier3_combinations.py +0 -0
  105. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/e2e/test_tier4_workloads.py +0 -0
  106. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_changelog_generator.py +0 -0
  107. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_code_reviewer.py +0 -0
  108. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_config_atomic_write.py +0 -0
  109. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_conflict_resolver.py +0 -0
  110. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_conflict_resolver_backup.py +0 -0
  111. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_context_gitdir_detection.py +0 -0
  112. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_diagnostics.py +0 -0
  113. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_diff_trimmer.py +0 -0
  114. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_git_ops.py +0 -0
  115. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_git_ops_execute.py +0 -0
  116. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_help.py +0 -0
  117. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_history_analyzer.py +0 -0
  118. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_hooks.py +0 -0
  119. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_ignore.py +0 -0
  120. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_intent_parser.py +0 -0
  121. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_llm_factory.py +0 -0
  122. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_llm_factory_ollama.py +0 -0
  123. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_merge_state.py +0 -0
  124. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_pr_drafter.py +0 -0
  125. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_rebase_helper.py +0 -0
  126. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_safety.py +0 -0
  127. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_search.py +0 -0
  128. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/tests/test_undo.py +0 -0
  129. {ace_git_copilot-0.3.6 → ace_git_copilot-0.3.8}/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.6
3
+ Version: 0.3.8
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
@@ -199,6 +199,14 @@ Distributed under the MIT License. See [LICENSE](LICENSE) for more details.
199
199
 
200
200
  ## Changelog
201
201
 
202
+ ### v0.3.8 — Emoji Stripping from Git History (2026-07-14)
203
+ * Implemented automatic Unicode emoji stripping for all Git commit messages retrieved via `GitOps.get_log`.
204
+ * Ensured history query summaries, rebase lists, and dashboard commit tables are completely clean and emoji-free.
205
+
206
+ ### v0.3.7 — UI Status Icons Modernization (2026-07-14)
207
+ * Replaced clunky double-character ASCII status indicators (`>>`, `**`, `!!`, `EE`) with clean, modern Unicode status icons (`›`, `✔`, `⚠`, `✘`).
208
+ * Updated confirm prompts, severity warnings, and code review listings to use the new icons for a clean, consistent terminal interface.
209
+
202
210
  ### v0.3.6 — Merge/Rebase Conflict Planning Fix (2026-07-12)
203
211
  * Enhanced repository context builder to check for active unmerged files in the index, distinguishing between resolved and unresolved conflict states.
204
212
  * Updated AI intent guidelines to prevent the planner from incorrectly suggesting `git merge --abort` when conflicts are already resolved and ready to be finalized.
@@ -166,6 +166,14 @@ Distributed under the MIT License. See [LICENSE](LICENSE) for more details.
166
166
 
167
167
  ## Changelog
168
168
 
169
+ ### v0.3.8 — Emoji Stripping from Git History (2026-07-14)
170
+ * Implemented automatic Unicode emoji stripping for all Git commit messages retrieved via `GitOps.get_log`.
171
+ * Ensured history query summaries, rebase lists, and dashboard commit tables are completely clean and emoji-free.
172
+
173
+ ### v0.3.7 — UI Status Icons Modernization (2026-07-14)
174
+ * Replaced clunky double-character ASCII status indicators (`>>`, `**`, `!!`, `EE`) with clean, modern Unicode status icons (`›`, `✔`, `⚠`, `✘`).
175
+ * Updated confirm prompts, severity warnings, and code review listings to use the new icons for a clean, consistent terminal interface.
176
+
169
177
  ### v0.3.6 — Merge/Rebase Conflict Planning Fix (2026-07-12)
170
178
  * Enhanced repository context builder to check for active unmerged files in the index, distinguishing between resolved and unresolved conflict states.
171
179
  * Updated AI intent guidelines to prevent the planner from incorrectly suggesting `git merge --abort` when conflicts are already resolved and ready to be finalized.
@@ -0,0 +1 @@
1
+ __version__ = "0.3.8"
@@ -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
  }
@@ -10,10 +10,10 @@ console = Console(theme=get_rich_theme(), force_terminal=True)
10
10
  err_console = Console(theme=get_rich_theme(), force_terminal=True, stderr=True)
11
11
 
12
12
  # Status symbols — safe subset that renders in all modern Windows terminals
13
- _SYM_INFO = ">>" # informational
14
- _SYM_SUCCESS = "**" # success
15
- _SYM_WARNING = "!!" # warning
16
- _SYM_ERROR = "EE" # error
13
+ _SYM_INFO = "›" # informational
14
+ _SYM_SUCCESS = "✔" # success
15
+ _SYM_WARNING = "⚠" # warning
16
+ _SYM_ERROR = "✘" # error
17
17
 
18
18
 
19
19
  # ─── Inline status printers ──────────────────────────────────────────────────
@@ -277,9 +277,9 @@ def show_review(findings: List[Dict[str, Any]], score: float) -> None:
277
277
  return
278
278
 
279
279
  sev_sym = {
280
- "critical": ("EE", "bold #FF1744"),
281
- "warning": ("!!", "bold #FFD600"),
282
- "info": (">>", "bold #00D5FF"),
280
+ "critical": ("✘", "bold #FF1744"),
281
+ "warning": ("⚠", "bold #FFD600"),
282
+ "info": ("›", "bold #00D5FF"),
283
283
  }
284
284
 
285
285
  for item in findings:
@@ -13,7 +13,7 @@ def confirm(question: str, default: bool = True) -> bool:
13
13
  hint = "[Y/n]" if default else "[y/N]"
14
14
  console.print(
15
15
  Text.assemble(
16
- (" >> ", "bold #00D5FF"),
16
+ (" › ", "bold #00D5FF"),
17
17
  (question + " ", "bold white"),
18
18
  (hint, "bold #666666"),
19
19
  (" ", ""),
@@ -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.6"
3
+ version = "0.3.8"
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.6"
File without changes