deepy-cli 0.1.1__tar.gz → 0.1.2__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.
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/PKG-INFO +2 -2
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/README.md +1 -1
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/pyproject.toml +1 -1
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/__init__.py +1 -1
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/update_check.py +5 -86
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/__main__.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/cli.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/config/__init__.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/config/settings.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/data/__init__.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/data/tools/AskUserQuestion.md +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/data/tools/WebFetch.md +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/data/tools/WebSearch.md +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/data/tools/__init__.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/data/tools/bash.md +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/data/tools/edit.md +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/data/tools/modify.md +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/data/tools/read.md +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/data/tools/write.md +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/errors.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/llm/__init__.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/llm/agent.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/llm/context.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/llm/events.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/llm/model_capabilities.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/llm/provider.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/llm/replay.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/llm/runner.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/llm/thinking.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/prompts/__init__.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/prompts/compact.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/prompts/rules.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/prompts/runtime_context.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/prompts/system.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/prompts/tool_docs.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/sessions/__init__.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/sessions/jsonl.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/sessions/manager.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/skills.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/status.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/tools/__init__.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/tools/agents.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/tools/builtin.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/tools/file_state.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/tools/result.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/tools/shell_utils.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/__init__.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/app.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/ask_user_question.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/exit_summary.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/loading_text.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/markdown.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/message_view.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/prompt_buffer.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/prompt_input.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/session_list.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/session_picker.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/slash_commands.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/styles.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/terminal.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/thinking_state.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/ui/welcome.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/usage.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/utils/__init__.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/utils/debug_logger.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/utils/error_logger.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/src/deepy/utils/json.py +0 -0
- {deepy_cli-0.1.1 → deepy_cli-0.1.2}/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.1.
|
|
3
|
+
Version: 0.1.2
|
|
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
|
|
@@ -200,6 +200,6 @@ assets live outside the package directory and are not included in the wheel.
|
|
|
200
200
|
|
|
201
201
|
## Release Status
|
|
202
202
|
|
|
203
|
-
Deepy is preparing its first public `0.1.
|
|
203
|
+
Deepy is preparing its first public `0.1.2` release. The current release path is
|
|
204
204
|
GitHub + PyPI. Standalone binaries and npm wrappers can be added later, but the
|
|
205
205
|
primary distribution is the Python CLI.
|
|
@@ -172,6 +172,6 @@ assets live outside the package directory and are not included in the wheel.
|
|
|
172
172
|
|
|
173
173
|
## Release Status
|
|
174
174
|
|
|
175
|
-
Deepy is preparing its first public `0.1.
|
|
175
|
+
Deepy is preparing its first public `0.1.2` release. The current release path is
|
|
176
176
|
GitHub + PyPI. Standalone binaries and npm wrappers can be added later, but the
|
|
177
177
|
primary distribution is the Python CLI.
|
|
@@ -9,7 +9,6 @@ from typing import Any, Callable
|
|
|
9
9
|
from deepy.utils import json as json_utils
|
|
10
10
|
|
|
11
11
|
DEFAULT_PYPI_PACKAGE = "deepy-cli"
|
|
12
|
-
DEFAULT_GITHUB_REPO = "kirineko/deepy"
|
|
13
12
|
DEFAULT_TIMEOUT_SECONDS = 0.8
|
|
14
13
|
|
|
15
14
|
UrlOpen = Callable[..., Any]
|
|
@@ -35,19 +34,14 @@ def check_for_version_update(
|
|
|
35
34
|
current_version: str,
|
|
36
35
|
*,
|
|
37
36
|
pypi_package: str = DEFAULT_PYPI_PACKAGE,
|
|
38
|
-
github_repo: str = DEFAULT_GITHUB_REPO,
|
|
39
37
|
timeout_seconds: float = DEFAULT_TIMEOUT_SECONDS,
|
|
40
38
|
urlopen: UrlOpen = urllib.request.urlopen,
|
|
41
39
|
) -> VersionUpdate | None:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
)
|
|
48
|
-
if candidate is not None
|
|
49
|
-
]
|
|
50
|
-
latest = _latest_candidate(candidates)
|
|
40
|
+
latest = fetch_latest_pypi_version(
|
|
41
|
+
pypi_package,
|
|
42
|
+
timeout_seconds=timeout_seconds,
|
|
43
|
+
urlopen=urlopen,
|
|
44
|
+
)
|
|
51
45
|
if latest is None or compare_versions(latest.version, current_version) <= 0:
|
|
52
46
|
return None
|
|
53
47
|
return VersionUpdate(
|
|
@@ -78,18 +72,6 @@ def fetch_latest_pypi_version(
|
|
|
78
72
|
return VersionCandidate(version=version.strip(), source="PyPI", url=f"https://pypi.org/project/{package_name}/")
|
|
79
73
|
|
|
80
74
|
|
|
81
|
-
def fetch_latest_github_version(
|
|
82
|
-
repo: str,
|
|
83
|
-
*,
|
|
84
|
-
timeout_seconds: float = DEFAULT_TIMEOUT_SECONDS,
|
|
85
|
-
urlopen: UrlOpen = urllib.request.urlopen,
|
|
86
|
-
) -> VersionCandidate | None:
|
|
87
|
-
release = _fetch_github_release_version(repo, timeout_seconds=timeout_seconds, urlopen=urlopen)
|
|
88
|
-
if release is not None:
|
|
89
|
-
return release
|
|
90
|
-
return _fetch_github_tag_version(repo, timeout_seconds=timeout_seconds, urlopen=urlopen)
|
|
91
|
-
|
|
92
|
-
|
|
93
75
|
def compare_versions(a: str, b: str) -> int:
|
|
94
76
|
left = _version_parts(a)
|
|
95
77
|
right = _version_parts(b)
|
|
@@ -104,60 +86,6 @@ def compare_versions(a: str, b: str) -> int:
|
|
|
104
86
|
return 0
|
|
105
87
|
|
|
106
88
|
|
|
107
|
-
def _fetch_github_release_version(
|
|
108
|
-
repo: str,
|
|
109
|
-
*,
|
|
110
|
-
timeout_seconds: float,
|
|
111
|
-
urlopen: UrlOpen,
|
|
112
|
-
) -> VersionCandidate | None:
|
|
113
|
-
url = f"https://api.github.com/repos/{repo}/releases/latest"
|
|
114
|
-
try:
|
|
115
|
-
with urlopen(_request(url), timeout=timeout_seconds) as response:
|
|
116
|
-
payload = _read_json_response(response)
|
|
117
|
-
except (OSError, urllib.error.URLError, json_utils.JSONDecodeError):
|
|
118
|
-
return None
|
|
119
|
-
tag = payload.get("tag_name") if isinstance(payload, dict) else None
|
|
120
|
-
version = _normalize_tag_version(tag)
|
|
121
|
-
if version is None:
|
|
122
|
-
return None
|
|
123
|
-
html_url = payload.get("html_url") if isinstance(payload, dict) else None
|
|
124
|
-
return VersionCandidate(
|
|
125
|
-
version=version,
|
|
126
|
-
source="GitHub",
|
|
127
|
-
url=html_url if isinstance(html_url, str) and html_url else f"https://github.com/{repo}/releases/latest",
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
def _fetch_github_tag_version(
|
|
132
|
-
repo: str,
|
|
133
|
-
*,
|
|
134
|
-
timeout_seconds: float,
|
|
135
|
-
urlopen: UrlOpen,
|
|
136
|
-
) -> VersionCandidate | None:
|
|
137
|
-
url = f"https://api.github.com/repos/{repo}/tags?per_page=1"
|
|
138
|
-
try:
|
|
139
|
-
with urlopen(_request(url), timeout=timeout_seconds) as response:
|
|
140
|
-
payload = _read_json_response(response)
|
|
141
|
-
except (OSError, urllib.error.URLError, json_utils.JSONDecodeError):
|
|
142
|
-
return None
|
|
143
|
-
if not isinstance(payload, list) or not payload:
|
|
144
|
-
return None
|
|
145
|
-
first = payload[0]
|
|
146
|
-
tag = first.get("name") if isinstance(first, dict) else None
|
|
147
|
-
version = _normalize_tag_version(tag)
|
|
148
|
-
if version is None:
|
|
149
|
-
return None
|
|
150
|
-
return VersionCandidate(version=version, source="GitHub", url=f"https://github.com/{repo}/releases/tag/{tag}")
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
def _latest_candidate(candidates: list[VersionCandidate]) -> VersionCandidate | None:
|
|
154
|
-
latest: VersionCandidate | None = None
|
|
155
|
-
for candidate in candidates:
|
|
156
|
-
if latest is None or compare_versions(candidate.version, latest.version) > 0:
|
|
157
|
-
latest = candidate
|
|
158
|
-
return latest
|
|
159
|
-
|
|
160
|
-
|
|
161
89
|
def _read_json_response(response: Any) -> dict[str, Any] | list[Any]:
|
|
162
90
|
data = response.read()
|
|
163
91
|
if isinstance(data, str):
|
|
@@ -179,15 +107,6 @@ def _request(url: str) -> urllib.request.Request:
|
|
|
179
107
|
)
|
|
180
108
|
|
|
181
109
|
|
|
182
|
-
def _normalize_tag_version(value: object) -> str | None:
|
|
183
|
-
if not isinstance(value, str):
|
|
184
|
-
return None
|
|
185
|
-
stripped = value.strip()
|
|
186
|
-
if stripped.startswith(("v", "V")):
|
|
187
|
-
stripped = stripped[1:]
|
|
188
|
-
return stripped if _version_parts(stripped) else None
|
|
189
|
-
|
|
190
|
-
|
|
191
110
|
def _version_parts(value: str) -> list[int]:
|
|
192
111
|
match = re.match(r"^\s*v?(\d+(?:\.\d+)*)", value, flags=re.IGNORECASE)
|
|
193
112
|
if not match:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|