deepy-cli 0.2.19__tar.gz → 0.2.20__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 (106) hide show
  1. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/PKG-INFO +2 -2
  2. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/README.md +1 -1
  3. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/pyproject.toml +1 -1
  4. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/__init__.py +1 -1
  5. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/cli.py +5 -6
  6. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/config/settings.py +11 -5
  7. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tui/app.py +2 -3
  8. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tui/screens.py +1 -1
  9. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/status_footer.py +1 -1
  10. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/terminal.py +493 -356
  11. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/theme_picker.py +1 -2
  12. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/__main__.py +0 -0
  13. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/background_tasks.py +0 -0
  14. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/config/__init__.py +0 -0
  15. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/__init__.py +0 -0
  16. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/skills/skill-creator/SKILL.md +0 -0
  17. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/skills/skill-installer/SKILL.md +0 -0
  18. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/AskUserQuestion.md +0 -0
  19. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/Search.md +0 -0
  20. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/WebFetch.md +0 -0
  21. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/WebSearch.md +0 -0
  22. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/__init__.py +0 -0
  23. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/apply_patch.md +0 -0
  24. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/edit_text.md +0 -0
  25. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/read_file.md +0 -0
  26. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/shell.md +0 -0
  27. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/task_list.md +0 -0
  28. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/task_output.md +0 -0
  29. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/task_stop.md +0 -0
  30. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/test_shell.md +0 -0
  31. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/todo_write.md +0 -0
  32. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/data/tools/write_file.md +0 -0
  33. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/errors.py +0 -0
  34. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/input_suggestions.py +0 -0
  35. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/llm/__init__.py +0 -0
  36. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/llm/agent.py +0 -0
  37. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/llm/compaction.py +0 -0
  38. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/llm/context.py +0 -0
  39. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/llm/events.py +0 -0
  40. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/llm/model_capabilities.py +0 -0
  41. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/llm/provider.py +0 -0
  42. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/llm/replay.py +0 -0
  43. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/llm/runner.py +0 -0
  44. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/llm/thinking.py +0 -0
  45. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/mcp.py +0 -0
  46. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/prompts/__init__.py +0 -0
  47. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/prompts/compact.py +0 -0
  48. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/prompts/init_agents.py +0 -0
  49. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/prompts/rules.py +0 -0
  50. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/prompts/runtime_context.py +0 -0
  51. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/prompts/system.py +0 -0
  52. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/prompts/tool_docs.py +0 -0
  53. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/session_cost.py +0 -0
  54. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/sessions/__init__.py +0 -0
  55. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/sessions/jsonl.py +0 -0
  56. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/sessions/manager.py +0 -0
  57. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/skill_market.py +0 -0
  58. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/skills.py +0 -0
  59. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/status.py +0 -0
  60. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/subagents.py +0 -0
  61. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/todos.py +0 -0
  62. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tools/__init__.py +0 -0
  63. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tools/agents.py +0 -0
  64. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tools/builtin.py +0 -0
  65. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tools/file_state.py +0 -0
  66. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tools/result.py +0 -0
  67. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tools/search.py +0 -0
  68. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tools/shell_output.py +0 -0
  69. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tools/shell_utils.py +0 -0
  70. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tools/test_shell.py +0 -0
  71. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tui/__init__.py +0 -0
  72. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tui/commands.py +0 -0
  73. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tui/compat.py +0 -0
  74. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tui/diff.py +0 -0
  75. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tui/runner.py +0 -0
  76. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tui/state.py +0 -0
  77. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/tui/widgets.py +0 -0
  78. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/types/__init__.py +0 -0
  79. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/types/sdk.py +0 -0
  80. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/types/tool_payloads.py +0 -0
  81. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/__init__.py +0 -0
  82. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/app.py +0 -0
  83. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/ask_user_question.py +0 -0
  84. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/exit_summary.py +0 -0
  85. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/file_mentions.py +0 -0
  86. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/loading_text.py +0 -0
  87. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/local_command.py +0 -0
  88. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/markdown.py +0 -0
  89. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/message_view.py +0 -0
  90. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/model_picker.py +0 -0
  91. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/prompt_buffer.py +0 -0
  92. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/prompt_input.py +0 -0
  93. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/session_list.py +0 -0
  94. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/session_picker.py +0 -0
  95. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/skill_picker.py +0 -0
  96. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/slash_commands.py +0 -0
  97. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/styles.py +0 -0
  98. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/thinking_state.py +0 -0
  99. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/ui/welcome.py +0 -0
  100. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/update_check.py +0 -0
  101. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/usage.py +0 -0
  102. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/utils/__init__.py +0 -0
  103. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/utils/debug_logger.py +0 -0
  104. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/utils/error_logger.py +0 -0
  105. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/utils/json.py +0 -0
  106. {deepy_cli-0.2.19 → deepy_cli-0.2.20}/src/deepy/utils/notify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: deepy-cli
3
- Version: 0.2.19
3
+ Version: 0.2.20
4
4
  Summary: Deepy - Vibe coding for DeepSeek models in your terminal
5
5
  Keywords: deepseek,coding-agent,terminal,cli,agents
6
6
  Author: kirineko
@@ -306,7 +306,7 @@ reserved_context_tokens = 50000
306
306
  compact_preserve_recent_messages = 2
307
307
 
308
308
  [ui]
309
- theme = "auto" # auto, dark, or light
309
+ theme = "dark" # dark or light
310
310
  ```
311
311
 
312
312
  Set config without the interactive wizard:
@@ -274,7 +274,7 @@ reserved_context_tokens = 50000
274
274
  compact_preserve_recent_messages = 2
275
275
 
276
276
  [ui]
277
- theme = "auto" # auto, dark, or light
277
+ theme = "dark" # dark or light
278
278
  ```
279
279
 
280
280
  Set config without the interactive wizard:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "deepy-cli"
3
- version = "0.2.19"
3
+ version = "0.2.20"
4
4
  description = "Deepy - Vibe coding for DeepSeek models in your terminal"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.2.19"
3
+ __version__ = "0.2.20"
4
4
 
5
5
 
6
6
  def main() -> None:
@@ -61,13 +61,13 @@ def _build_parser() -> argparse.ArgumentParser:
61
61
  init_parser.add_argument("--model", help="Model name.")
62
62
  init_parser.add_argument("--base-url", help="OpenAI-compatible base URL.")
63
63
  init_parser.add_argument("--thinking", help="Thinking mode for the provider.")
64
- init_parser.add_argument("--theme", default=DEFAULT_UI_THEME, help="UI theme: auto, dark, or light.")
64
+ init_parser.add_argument("--theme", default=DEFAULT_UI_THEME, help="UI theme: dark or light.")
65
65
  init_parser.add_argument("--force", action="store_true", help="Overwrite existing config.")
66
66
  setup_parser = config_sub.add_parser("setup", help="Interactively configure Deepy.")
67
67
  setup_parser.add_argument("--force", action="store_true", help="Overwrite existing config.")
68
68
  config_sub.add_parser("reset", help="Delete local config and run interactive setup again.")
69
69
  theme_parser = config_sub.add_parser("theme", help="Show or update terminal UI theme.")
70
- theme_parser.add_argument("theme", nargs="?", help="Theme to save: auto, dark, or light.")
70
+ theme_parser.add_argument("theme", nargs="?", help="Theme to save: dark or light.")
71
71
 
72
72
  doctor_parser = subparsers.add_parser("doctor", help="Validate local Deepy setup.")
73
73
  doctor_parser.add_argument("--json", action="store_true", help="Print JSON diagnostics.")
@@ -381,9 +381,8 @@ def _thinking_mode_from_selection(provider: str, value: str, *, default: str) ->
381
381
 
382
382
  def _prompt_theme_value(*, default: str = DEFAULT_UI_THEME) -> str:
383
383
  print("UI theme:")
384
- print("1. auto Detect when possible; falls back to dark")
385
- print("2. dark Optimized for dark terminal backgrounds")
386
- print("3. light Optimized for light terminal backgrounds")
384
+ print("1. dark Optimized for dark terminal backgrounds")
385
+ print("2. light Optimized for light terminal backgrounds")
387
386
  value = _prompt_config_value("UI theme number", default=ui_theme_number(default))
388
387
  return ui_theme_from_selection(value, default=default)
389
388
 
@@ -417,7 +416,7 @@ def _cmd_config_theme(args: argparse.Namespace) -> int:
417
416
  print(f"resolved: {palette.name}")
418
417
  return 0
419
418
  if args.theme not in UI_THEMES:
420
- print("Invalid theme. Usage: deepy config theme [auto|dark|light]", file=sys.stderr)
419
+ print("Invalid theme. Usage: deepy config theme [dark|light]", file=sys.stderr)
421
420
  return 1
422
421
  config_path = settings.path or (args.config.expanduser() if args.config else Path.home() / ".deepy" / "config.toml")
423
422
  update_config_theme(config_path, args.theme)
@@ -16,7 +16,7 @@ DEFAULT_COMPACT_TRIGGER_RATIO = 0.8
16
16
  DEFAULT_RESERVED_CONTEXT_TOKENS = 50_000
17
17
  DEFAULT_COMPACT_PRESERVE_RECENT_MESSAGES = 2
18
18
  DEFAULT_WEB_SEARCH_SEARXNG_URL = "https://s.kirineko.tech/"
19
- DEFAULT_UI_THEME = "auto"
19
+ DEFAULT_UI_THEME = "dark"
20
20
  DEFAULT_MCP_ENABLED = True
21
21
  DEFAULT_MCP_CONNECT_TIMEOUT_SECONDS = 10.0
22
22
  DEFAULT_MCP_CLEANUP_TIMEOUT_SECONDS = 10.0
@@ -45,8 +45,8 @@ SWITCH_ONLY_THINKING_MODES = ("disabled", "enabled")
45
45
  REASONING_MODES = set(DEEPSEEK_REASONING_MODES)
46
46
  THINKING_MODES = set(DEEPSEEK_REASONING_MODES) | set(SWITCH_ONLY_THINKING_MODES) | OPENROUTER_REASONING_EFFORTS
47
47
  PROVIDERS = {"deepseek", "openrouter", "xiaomi"}
48
- UI_THEMES = {"auto", "dark", "light"}
49
- UI_THEME_OPTIONS = (("1", "auto"), ("2", "dark"), ("3", "light"))
48
+ UI_THEMES = {"dark", "light"}
49
+ UI_THEME_OPTIONS = (("1", "dark"), ("2", "light"))
50
50
 
51
51
 
52
52
  @dataclass(frozen=True)
@@ -570,6 +570,12 @@ class UiConfig:
570
570
  raw.get("input_suggestions_enabled"),
571
571
  DEFAULT_INPUT_SUGGESTIONS_ENABLED,
572
572
  )
573
+ if isinstance(theme, str) and theme.strip() == "auto":
574
+ return cls(
575
+ theme=DEFAULT_UI_THEME,
576
+ theme_configured=True,
577
+ input_suggestions_enabled=input_suggestions_enabled,
578
+ )
573
579
  if isinstance(theme, str) and theme.strip() in UI_THEMES:
574
580
  return cls(
575
581
  theme=theme.strip(),
@@ -690,7 +696,7 @@ def write_config(
690
696
  thinking_mode: str | None = None,
691
697
  ) -> None:
692
698
  if not is_valid_ui_theme(theme):
693
- raise ValueError("UI theme must be one of: auto, dark, light.")
699
+ raise ValueError("UI theme must be one of: dark, light.")
694
700
  if not is_supported_provider(provider):
695
701
  raise ValueError("Provider must be one of: deepseek, openrouter, xiaomi.")
696
702
  provider_info = provider_info_for(provider)
@@ -816,7 +822,7 @@ def update_config_model_settings(
816
822
 
817
823
  def update_config_theme(config_path: Path, theme: str) -> None:
818
824
  if not is_valid_ui_theme(theme):
819
- raise ValueError("UI theme must be one of: auto, dark, light.")
825
+ raise ValueError("UI theme must be one of: dark, light.")
820
826
  path = config_path.expanduser()
821
827
  if path.suffix == ".json":
822
828
  raise ValueError("Deepy only supports TOML config files; JSON config is not supported.")
@@ -823,7 +823,6 @@ class DeepyTuiApp(App[None]):
823
823
  ChoiceScreen(
824
824
  "Select theme",
825
825
  [
826
- Choice("auto", "auto", "Follow saved/default theme behavior"),
827
826
  Choice("dark", "dark", "Use Textual dark theme"),
828
827
  Choice("light", "light", "Use Textual light theme"),
829
828
  ],
@@ -833,7 +832,7 @@ class DeepyTuiApp(App[None]):
833
832
  self._update_status("Theme unchanged")
834
833
  return
835
834
  if not is_valid_ui_theme(theme):
836
- await self._append_block(ErrorBlock("Usage: /theme auto|dark|light"))
835
+ await self._append_block(ErrorBlock("Usage: /theme dark|light"))
837
836
  return
838
837
  if self.settings.path is None:
839
838
  await self._append_block(ErrorBlock("Cannot persist theme: config path is unknown."))
@@ -2040,7 +2039,7 @@ def _reset_config_validation_error(result: ResetConfigResult) -> str:
2040
2039
  if not result.theme:
2041
2040
  return "Theme is required."
2042
2041
  if not is_valid_ui_theme(result.theme):
2043
- return "Usage: theme must be auto|dark|light"
2042
+ return "Usage: theme must be dark|light"
2044
2043
  return ""
2045
2044
 
2046
2045
 
@@ -191,7 +191,7 @@ class ResetConfigScreen(ModalScreen[ResetConfigResult | None]):
191
191
  yield Input(value=self.model, placeholder="Model", id="reset-model")
192
192
  yield Input(value=self.base_url, placeholder="Base URL", id="reset-base-url")
193
193
  yield Input(value=self.thinking, placeholder="Thinking", id="reset-thinking")
194
- yield Input(value=self.theme, placeholder="Theme: auto|dark|light", id="reset-theme")
194
+ yield Input(value=self.theme, placeholder="Theme: dark|light", id="reset-theme")
195
195
  yield Footer()
196
196
 
197
197
  def on_mount(self) -> None:
@@ -83,7 +83,7 @@ def _help_parts(help_text: str) -> list[tuple[FooterPartRole, str]]:
83
83
 
84
84
 
85
85
  def _known_title(text: str) -> str | None:
86
- for title in ("provider", "model", "cwd", "mcp", "bg", "ctx", "newline"):
86
+ for title in ("provider", "model", "cwd", "mcp", "update", "bg", "ctx", "newline"):
87
87
  if text == title or text.startswith(f"{title} ") or text.startswith(f"{title}:"):
88
88
  return title
89
89
  return None