devin-cli 1.1.0__tar.gz → 1.1.1__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.
- devin_cli-1.1.1/CHANGELOG.md +35 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/PKG-INFO +1 -1
- {devin_cli-1.1.0 → devin_cli-1.1.1}/pyproject.toml +1 -1
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/client.py +1 -1
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v1/sessions.py +9 -2
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/cli.py +16 -1
- devin_cli-1.1.0/CHANGELOG.md +0 -12
- {devin_cli-1.1.0 → devin_cli-1.1.1}/.github/workflows/pypi-publish.yml +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/.gitignore +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/LICENSE +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/README.md +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/assets/logo.png +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/generate_facades.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/setup.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/__init__.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/__init__.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/attachments.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/consumption.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/knowledge.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/members.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/organizations.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/playbooks.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/repositories.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/schedules.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/secrets.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/sessions.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v1/__init__.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v1/attachments.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v1/knowledge.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v1/playbooks.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v1/secrets.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v3/__init__.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v3/attachments.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v3/consumption.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v3/knowledge.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v3/members.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v3/organizations.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v3/playbooks.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v3/repositories.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v3/schedules.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v3/secrets.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/api/v3/sessions.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/src/devin_cli/config.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/test_duplicate.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/tests/__init__.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/tests/conftest.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/tests/test_api/test_attachments.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/tests/test_api/test_knowledge.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/tests/test_api/test_playbooks.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/tests/test_api/test_repositories.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/tests/test_api/test_schedules.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/tests/test_api/test_secrets.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/tests/test_api/test_sessions.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/tests/test_cli.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.1}/tests/test_config.py +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.1.1] - 2026-03-11
|
|
9
|
+
### Fixed
|
|
10
|
+
- Fixed v1 API HTTP redirects stripping authorization headers on org-scoped endpoints (403 errors).
|
|
11
|
+
- Fixed `devin configure` crash due to a missing `Prompt` module import.
|
|
12
|
+
- Fixed v1 `devin sessions messages` command by creating a polyfill data extractor for legacy payloads.
|
|
13
|
+
- Fixed v1 `devin sessions insights` to gracefully exit instead of throwing a generic missing endpoint error.
|
|
14
|
+
- Fixed v1 API payload formats by universally switching from URL-encoded `data=` to strictly typed `json=` bodies.
|
|
15
|
+
- Fixed message display loop to properly fallback between v3 `content` and v1 `message` string definitions.
|
|
16
|
+
|
|
17
|
+
## [1.1.0] - 2026-03-11
|
|
18
|
+
### Added
|
|
19
|
+
- **Dual-Token Profiles**: Support for securely managing Personal (`apk_user_`) and Service Account (`cog_`) tokens via the `--profile` global flag.
|
|
20
|
+
- **Legacy API Proxy**: Native v1 API backward compatibility routing, allowing older legacy scripts to execute gracefully over the new v3 architecture.
|
|
21
|
+
- **Session Deduplication (Anti-Spam)**: Built-in SHA-256 caching of previous prompts to intercept and prevent accidental duplicate session creation loops.
|
|
22
|
+
- **Advanced Mode Auth**: Secure web browser intersection for `advanced_mode_url` requirements when initiating CLI sessions.
|
|
23
|
+
- **Playbook Safeguards**: Implemented strict 500KB payload limit warnings with manual overrides for Playbook creation and updates to prevent 413 HTTP crashes.
|
|
24
|
+
- **Dynamic Help Menus**: Typer help commands successfully dynamically reflect `(V1 Legacy Mode)` tags based on active profile switching.
|
|
25
|
+
- **Global `--version`**: New binary flag reporting accurate package metadata matching PyPI.
|
|
26
|
+
|
|
27
|
+
## [0.1.0] - 2024-05-23
|
|
28
|
+
### Added
|
|
29
|
+
- Initial release
|
|
30
|
+
- Session management (create, list, get, terminate)
|
|
31
|
+
- Message sending and history viewing
|
|
32
|
+
- Watch command for live status polling
|
|
33
|
+
- File attachments
|
|
34
|
+
- Knowledge, Playbook, and Secret management commands
|
|
35
|
+
- Shell completion support
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devin-cli
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.1
|
|
4
4
|
Summary: Unofficial CLI for Devin AI - The first AI Software Engineer
|
|
5
5
|
Project-URL: Homepage, https://github.com/revanthpobala/devin-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/revanthpobala/devin-cli.git
|
|
@@ -103,7 +103,7 @@ class BaseClient:
|
|
|
103
103
|
headers.pop("Content-Type", None)
|
|
104
104
|
|
|
105
105
|
try:
|
|
106
|
-
with httpx.Client(follow_redirects=
|
|
106
|
+
with httpx.Client(follow_redirects=False, verify=False, timeout=httpx.Timeout(120.0)) as client:
|
|
107
107
|
response = client.request(method, url, headers=headers, **kwargs)
|
|
108
108
|
return self._handle_response(response)
|
|
109
109
|
except httpx.RequestError as e:
|
|
@@ -48,11 +48,18 @@ def create_session(
|
|
|
48
48
|
def get_session(session_id: str):
|
|
49
49
|
return client.get(f"sessions/{session_id}")
|
|
50
50
|
|
|
51
|
+
def get_session_messages(session_id: str):
|
|
52
|
+
resp = get_session(session_id)
|
|
53
|
+
return {"messages": resp.get("messages", [])}
|
|
54
|
+
|
|
55
|
+
def get_session_insights(session_id: str):
|
|
56
|
+
return {"error": "Insights are not available in the v1 API. Please upgrade to v3."}
|
|
57
|
+
|
|
51
58
|
def send_message(session_id: str, message: str):
|
|
52
|
-
return client.post(f"sessions/{session_id}/message",
|
|
59
|
+
return client.post(f"sessions/{session_id}/message", json={"message": message})
|
|
53
60
|
|
|
54
61
|
def update_session_tags(session_id: str, tags: List[str]):
|
|
55
|
-
return client.put(f"sessions/{session_id}/tags",
|
|
62
|
+
return client.put(f"sessions/{session_id}/tags", json={"tags": tags})
|
|
56
63
|
|
|
57
64
|
def terminate_session(session_id: str):
|
|
58
65
|
return client.delete(f"sessions/{session_id}")
|
|
@@ -18,6 +18,7 @@ import functools
|
|
|
18
18
|
import sys
|
|
19
19
|
import hashlib
|
|
20
20
|
import importlib.metadata
|
|
21
|
+
from rich.prompt import Prompt
|
|
21
22
|
|
|
22
23
|
try:
|
|
23
24
|
__version__ = importlib.metadata.version("devin-cli")
|
|
@@ -295,7 +296,7 @@ def list_messages_cmd(
|
|
|
295
296
|
msgs = resp.get("messages", [])
|
|
296
297
|
for m in msgs:
|
|
297
298
|
role = m.get("role", "unknown")
|
|
298
|
-
content = m.get("content", "")
|
|
299
|
+
content = m.get("message", "") or m.get("content", "")
|
|
299
300
|
console.print(f"[bold cyan]{role}:[/bold cyan] {content}")
|
|
300
301
|
console.print("---")
|
|
301
302
|
|
|
@@ -377,6 +378,13 @@ def update_playbook_cmd(
|
|
|
377
378
|
org: Optional[str] = typer.Option(None, "--org"),
|
|
378
379
|
):
|
|
379
380
|
"""Update a team playbook."""
|
|
381
|
+
body_bytes = len(body.encode('utf-8')) if body else 0
|
|
382
|
+
if body_bytes > 500 * 1024:
|
|
383
|
+
console.print(f"[bold yellow]Warning:[/bold yellow] Playbook body is {body_bytes / 1024:.1f}KB. Devin API may reject payloads > 500KB.")
|
|
384
|
+
import typer
|
|
385
|
+
if not typer.confirm("Attempt to send anyway?"):
|
|
386
|
+
raise typer.Exit()
|
|
387
|
+
|
|
380
388
|
if org: config.temporary_org_id = org
|
|
381
389
|
resp = playbooks.update_playbook(playbook_id, title=title, body=body, macro=macro)
|
|
382
390
|
console.print(f"[green]Playbook updated:[/green] {playbook_id}")
|
|
@@ -390,6 +398,13 @@ def create_playbook_cmd(
|
|
|
390
398
|
org: Optional[str] = typer.Option(None, "--org"),
|
|
391
399
|
):
|
|
392
400
|
"""Create a new team playbook."""
|
|
401
|
+
body_bytes = len(body.encode('utf-8')) if body else 0
|
|
402
|
+
if body_bytes > 500 * 1024:
|
|
403
|
+
console.print(f"[bold yellow]Warning:[/bold yellow] Playbook body is {body_bytes / 1024:.1f}KB. Devin API may reject payloads > 500KB.")
|
|
404
|
+
import typer
|
|
405
|
+
if not typer.confirm("Attempt to send anyway?"):
|
|
406
|
+
raise typer.Exit()
|
|
407
|
+
|
|
393
408
|
if org: config.temporary_org_id = org
|
|
394
409
|
resp = playbooks.create_playbook(title, body, macro)
|
|
395
410
|
console.print(f"[green]Playbook created:[/green] {resp.get('playbook_id')}")
|
devin_cli-1.1.0/CHANGELOG.md
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
## [0.1.0] - 2024-05-23
|
|
4
|
-
|
|
5
|
-
### Added
|
|
6
|
-
- Initial release
|
|
7
|
-
- Session management (create, list, get, terminate)
|
|
8
|
-
- Message sending and history viewing
|
|
9
|
-
- Watch command for live status polling
|
|
10
|
-
- File attachments
|
|
11
|
-
- Knowledge, Playbook, and Secret management commands
|
|
12
|
-
- Shell completion support
|
|
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
|