devin-cli 1.1.0__tar.gz → 1.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.
- devin_cli-1.1.2/CHANGELOG.md +39 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/PKG-INFO +1 -1
- {devin_cli-1.1.0 → devin_cli-1.1.2}/pyproject.toml +1 -1
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/client.py +1 -1
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/sessions.py +9 -2
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/cli.py +19 -3
- devin_cli-1.1.0/CHANGELOG.md +0 -12
- {devin_cli-1.1.0 → devin_cli-1.1.2}/.github/workflows/pypi-publish.yml +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/.gitignore +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/LICENSE +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/README.md +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/assets/logo.png +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/generate_facades.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/setup.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/__init__.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/__init__.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/attachments.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/consumption.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/knowledge.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/members.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/organizations.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/playbooks.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/repositories.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/schedules.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/secrets.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/sessions.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/__init__.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/attachments.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/knowledge.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/playbooks.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/secrets.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/__init__.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/attachments.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/consumption.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/knowledge.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/members.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/organizations.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/playbooks.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/repositories.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/schedules.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/secrets.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/sessions.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/config.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/test_duplicate.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/__init__.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/conftest.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_attachments.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_knowledge.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_playbooks.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_repositories.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_schedules.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_secrets.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_sessions.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_cli.py +0 -0
- {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_config.py +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
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.2] - 2026-03-11
|
|
9
|
+
### Fixed
|
|
10
|
+
- **Critical Profile Bug**: Stopped `cli.py` from statically overriding the active user profile back to `"default"` on every boot unless the `--profile` flag is explicitly passed over the terminal.
|
|
11
|
+
|
|
12
|
+
## [1.1.1] - 2026-03-11
|
|
13
|
+
### Fixed
|
|
14
|
+
- Fixed v1 API HTTP redirects stripping authorization headers on org-scoped endpoints (403 errors).
|
|
15
|
+
- Fixed `devin configure` crash due to a missing `Prompt` module import.
|
|
16
|
+
- Fixed v1 `devin sessions messages` command by creating a polyfill data extractor for legacy payloads.
|
|
17
|
+
- Fixed v1 `devin sessions insights` to gracefully exit instead of throwing a generic missing endpoint error.
|
|
18
|
+
- Fixed v1 API payload formats by universally switching from URL-encoded `data=` to strictly typed `json=` bodies.
|
|
19
|
+
- Fixed message display loop to properly fallback between v3 `content` and v1 `message` string definitions.
|
|
20
|
+
|
|
21
|
+
## [1.1.0] - 2026-03-11
|
|
22
|
+
### Added
|
|
23
|
+
- **Dual-Token Profiles**: Support for securely managing Personal (`apk_user_`) and Service Account (`cog_`) tokens via the `--profile` global flag.
|
|
24
|
+
- **Legacy API Proxy**: Native v1 API backward compatibility routing, allowing older legacy scripts to execute gracefully over the new v3 architecture.
|
|
25
|
+
- **Session Deduplication (Anti-Spam)**: Built-in SHA-256 caching of previous prompts to intercept and prevent accidental duplicate session creation loops.
|
|
26
|
+
- **Advanced Mode Auth**: Secure web browser intersection for `advanced_mode_url` requirements when initiating CLI sessions.
|
|
27
|
+
- **Playbook Safeguards**: Implemented strict 500KB payload limit warnings with manual overrides for Playbook creation and updates to prevent 413 HTTP crashes.
|
|
28
|
+
- **Dynamic Help Menus**: Typer help commands successfully dynamically reflect `(V1 Legacy Mode)` tags based on active profile switching.
|
|
29
|
+
- **Global `--version`**: New binary flag reporting accurate package metadata matching PyPI.
|
|
30
|
+
|
|
31
|
+
## [0.1.0] - 2024-05-23
|
|
32
|
+
### Added
|
|
33
|
+
- Initial release
|
|
34
|
+
- Session management (create, list, get, terminate)
|
|
35
|
+
- Message sending and history viewing
|
|
36
|
+
- Watch command for live status polling
|
|
37
|
+
- File attachments
|
|
38
|
+
- Knowledge, Playbook, and Secret management commands
|
|
39
|
+
- 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.2
|
|
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")
|
|
@@ -77,7 +78,7 @@ ASCII_LOGO = r"""
|
|
|
77
78
|
@app.callback(invoke_without_command=True)
|
|
78
79
|
def main(
|
|
79
80
|
ctx: typer.Context,
|
|
80
|
-
profile: str = typer.Option(
|
|
81
|
+
profile: Optional[str] = typer.Option(None, "--profile", "-p", help="Configuration profile to use (e.g., service, personal)"),
|
|
81
82
|
version: Optional[bool] = typer.Option(None, "--version", "-v", help="Show the application's version and exit."),
|
|
82
83
|
):
|
|
83
84
|
"""
|
|
@@ -87,7 +88,8 @@ def main(
|
|
|
87
88
|
console.print(f"devin CLI version: {__version__}")
|
|
88
89
|
raise typer.Exit()
|
|
89
90
|
|
|
90
|
-
|
|
91
|
+
if profile:
|
|
92
|
+
config.active_profile = profile
|
|
91
93
|
if ctx.invoked_subcommand is None:
|
|
92
94
|
console.print(ASCII_LOGO)
|
|
93
95
|
|
|
@@ -295,7 +297,7 @@ def list_messages_cmd(
|
|
|
295
297
|
msgs = resp.get("messages", [])
|
|
296
298
|
for m in msgs:
|
|
297
299
|
role = m.get("role", "unknown")
|
|
298
|
-
content = m.get("content", "")
|
|
300
|
+
content = m.get("message", "") or m.get("content", "")
|
|
299
301
|
console.print(f"[bold cyan]{role}:[/bold cyan] {content}")
|
|
300
302
|
console.print("---")
|
|
301
303
|
|
|
@@ -377,6 +379,13 @@ def update_playbook_cmd(
|
|
|
377
379
|
org: Optional[str] = typer.Option(None, "--org"),
|
|
378
380
|
):
|
|
379
381
|
"""Update a team playbook."""
|
|
382
|
+
body_bytes = len(body.encode('utf-8')) if body else 0
|
|
383
|
+
if body_bytes > 500 * 1024:
|
|
384
|
+
console.print(f"[bold yellow]Warning:[/bold yellow] Playbook body is {body_bytes / 1024:.1f}KB. Devin API may reject payloads > 500KB.")
|
|
385
|
+
import typer
|
|
386
|
+
if not typer.confirm("Attempt to send anyway?"):
|
|
387
|
+
raise typer.Exit()
|
|
388
|
+
|
|
380
389
|
if org: config.temporary_org_id = org
|
|
381
390
|
resp = playbooks.update_playbook(playbook_id, title=title, body=body, macro=macro)
|
|
382
391
|
console.print(f"[green]Playbook updated:[/green] {playbook_id}")
|
|
@@ -390,6 +399,13 @@ def create_playbook_cmd(
|
|
|
390
399
|
org: Optional[str] = typer.Option(None, "--org"),
|
|
391
400
|
):
|
|
392
401
|
"""Create a new team playbook."""
|
|
402
|
+
body_bytes = len(body.encode('utf-8')) if body else 0
|
|
403
|
+
if body_bytes > 500 * 1024:
|
|
404
|
+
console.print(f"[bold yellow]Warning:[/bold yellow] Playbook body is {body_bytes / 1024:.1f}KB. Devin API may reject payloads > 500KB.")
|
|
405
|
+
import typer
|
|
406
|
+
if not typer.confirm("Attempt to send anyway?"):
|
|
407
|
+
raise typer.Exit()
|
|
408
|
+
|
|
393
409
|
if org: config.temporary_org_id = org
|
|
394
410
|
resp = playbooks.create_playbook(title, body, macro)
|
|
395
411
|
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
|