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.
Files changed (55) hide show
  1. devin_cli-1.1.2/CHANGELOG.md +39 -0
  2. {devin_cli-1.1.0 → devin_cli-1.1.2}/PKG-INFO +1 -1
  3. {devin_cli-1.1.0 → devin_cli-1.1.2}/pyproject.toml +1 -1
  4. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/client.py +1 -1
  5. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/sessions.py +9 -2
  6. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/cli.py +19 -3
  7. devin_cli-1.1.0/CHANGELOG.md +0 -12
  8. {devin_cli-1.1.0 → devin_cli-1.1.2}/.github/workflows/pypi-publish.yml +0 -0
  9. {devin_cli-1.1.0 → devin_cli-1.1.2}/.gitignore +0 -0
  10. {devin_cli-1.1.0 → devin_cli-1.1.2}/LICENSE +0 -0
  11. {devin_cli-1.1.0 → devin_cli-1.1.2}/README.md +0 -0
  12. {devin_cli-1.1.0 → devin_cli-1.1.2}/assets/logo.png +0 -0
  13. {devin_cli-1.1.0 → devin_cli-1.1.2}/generate_facades.py +0 -0
  14. {devin_cli-1.1.0 → devin_cli-1.1.2}/setup.py +0 -0
  15. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/__init__.py +0 -0
  16. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/__init__.py +0 -0
  17. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/attachments.py +0 -0
  18. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/consumption.py +0 -0
  19. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/knowledge.py +0 -0
  20. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/members.py +0 -0
  21. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/organizations.py +0 -0
  22. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/playbooks.py +0 -0
  23. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/repositories.py +0 -0
  24. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/schedules.py +0 -0
  25. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/secrets.py +0 -0
  26. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/sessions.py +0 -0
  27. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/__init__.py +0 -0
  28. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/attachments.py +0 -0
  29. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/knowledge.py +0 -0
  30. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/playbooks.py +0 -0
  31. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v1/secrets.py +0 -0
  32. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/__init__.py +0 -0
  33. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/attachments.py +0 -0
  34. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/consumption.py +0 -0
  35. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/knowledge.py +0 -0
  36. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/members.py +0 -0
  37. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/organizations.py +0 -0
  38. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/playbooks.py +0 -0
  39. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/repositories.py +0 -0
  40. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/schedules.py +0 -0
  41. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/secrets.py +0 -0
  42. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/api/v3/sessions.py +0 -0
  43. {devin_cli-1.1.0 → devin_cli-1.1.2}/src/devin_cli/config.py +0 -0
  44. {devin_cli-1.1.0 → devin_cli-1.1.2}/test_duplicate.py +0 -0
  45. {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/__init__.py +0 -0
  46. {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/conftest.py +0 -0
  47. {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_attachments.py +0 -0
  48. {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_knowledge.py +0 -0
  49. {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_playbooks.py +0 -0
  50. {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_repositories.py +0 -0
  51. {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_schedules.py +0 -0
  52. {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_secrets.py +0 -0
  53. {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_api/test_sessions.py +0 -0
  54. {devin_cli-1.1.0 → devin_cli-1.1.2}/tests/test_cli.py +0 -0
  55. {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.0
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "devin-cli"
3
- version = "1.1.0"
3
+ version = "1.1.2"
4
4
  description = "Unofficial CLI for Devin AI - The first AI Software Engineer"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -103,7 +103,7 @@ class BaseClient:
103
103
  headers.pop("Content-Type", None)
104
104
 
105
105
  try:
106
- with httpx.Client(follow_redirects=True, verify=False, timeout=httpx.Timeout(120.0)) as client:
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", data={"message": 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", data={"tags": 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("default", "--profile", "-p", help="Configuration profile to use (e.g., service, personal)"),
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
- config.active_profile = profile
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')}")
@@ -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