devin-cli 1.1.5__tar.gz → 1.1.7__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 (53) hide show
  1. {devin_cli-1.1.5 → devin_cli-1.1.7}/.github/workflows/pypi-publish.yml +13 -19
  2. {devin_cli-1.1.5 → devin_cli-1.1.7}/CHANGELOG.md +10 -0
  3. {devin_cli-1.1.5 → devin_cli-1.1.7}/PKG-INFO +1 -1
  4. {devin_cli-1.1.5 → devin_cli-1.1.7}/pyproject.toml +1 -1
  5. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/knowledge.py +0 -2
  6. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/sessions.py +0 -2
  7. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/cli.py +15 -8
  8. {devin_cli-1.1.5 → devin_cli-1.1.7}/.gitignore +0 -0
  9. {devin_cli-1.1.5 → devin_cli-1.1.7}/LICENSE +0 -0
  10. {devin_cli-1.1.5 → devin_cli-1.1.7}/README.md +0 -0
  11. {devin_cli-1.1.5 → devin_cli-1.1.7}/assets/logo.png +0 -0
  12. {devin_cli-1.1.5 → devin_cli-1.1.7}/generate_facades.py +0 -0
  13. {devin_cli-1.1.5 → devin_cli-1.1.7}/setup.py +0 -0
  14. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/__init__.py +0 -0
  15. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/__init__.py +0 -0
  16. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/attachments.py +0 -0
  17. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/client.py +0 -0
  18. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/consumption.py +0 -0
  19. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/knowledge.py +0 -0
  20. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/members.py +0 -0
  21. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/organizations.py +0 -0
  22. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/playbooks.py +0 -0
  23. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/repositories.py +0 -0
  24. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/schedules.py +0 -0
  25. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/secrets.py +0 -0
  26. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/sessions.py +0 -0
  27. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/__init__.py +0 -0
  28. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/attachments.py +0 -0
  29. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/knowledge.py +0 -0
  30. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/playbooks.py +0 -0
  31. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/secrets.py +0 -0
  32. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/sessions.py +0 -0
  33. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/__init__.py +0 -0
  34. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/attachments.py +0 -0
  35. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/consumption.py +0 -0
  36. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/members.py +0 -0
  37. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/organizations.py +0 -0
  38. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/playbooks.py +0 -0
  39. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/repositories.py +0 -0
  40. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/schedules.py +0 -0
  41. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/secrets.py +0 -0
  42. {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/config.py +0 -0
  43. {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/__init__.py +0 -0
  44. {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/conftest.py +0 -0
  45. {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_attachments.py +0 -0
  46. {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_knowledge.py +0 -0
  47. {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_playbooks.py +0 -0
  48. {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_repositories.py +0 -0
  49. {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_schedules.py +0 -0
  50. {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_secrets.py +0 -0
  51. {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_sessions.py +0 -0
  52. {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_cli.py +0 -0
  53. {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_config.py +0 -0
@@ -43,31 +43,24 @@ jobs:
43
43
  - name: Checkout
44
44
  uses: actions/checkout@v4
45
45
 
46
- - name: Set up Python
47
- uses: actions/setup-python@v5
48
- with:
49
- python-version: '3.12'
50
-
51
- - name: Get Version and Hash
46
+ - name: Resolve version and URL
52
47
  run: |
53
48
  VERSION=${GITHUB_REF_NAME#v}
54
49
  if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
55
- VERSION=${{ github.event.inputs.tag_name }}
50
+ VERSION="${{ github.event.inputs.tag_name }}"
56
51
  VERSION=${VERSION#v}
57
52
  fi
58
53
  echo "VERSION=$VERSION" >> $GITHUB_ENV
59
-
60
- # Construct source URL and fetch to get the hash
61
- URL="https://files.pythonhosted.org/packages/source/d/devin-cli/devin_cli-$VERSION.tar.gz"
62
- echo "URL=$URL" >> $GITHUB_ENV
63
-
64
- # Wait a few seconds for PyPI CDN to catch up
65
- echo "Waiting 30 seconds for PyPI CDN to propagate..."
66
- sleep 30
67
-
68
- curl -sL $URL -o devin_cli.tar.gz
69
- HASH=$(sha256sum devin_cli.tar.gz | awk '{print $1}')
70
- echo "HASH=$HASH" >> $GITHUB_ENV
54
+ echo "URL=https://files.pythonhosted.org/packages/source/d/devin-cli/devin_cli-${VERSION}.tar.gz" >> $GITHUB_ENV
55
+
56
+ - name: Wait for PyPI CDN propagation
57
+ run: |
58
+ echo "Waiting 90 seconds for PyPI CDN to propagate..."
59
+ sleep 90
60
+ echo "Verifying tarball is accessible..."
61
+ curl --fail --silent --head "$URL" && echo "Tarball is available." || (echo "ERROR: Tarball not yet available at $URL" && exit 1)
62
+ env:
63
+ URL: ${{ env.URL }}
71
64
 
72
65
  - name: Update Homebrew Formula
73
66
  uses: mislav/bump-homebrew-formula-action@v3
@@ -79,3 +72,4 @@ jobs:
79
72
  commit-message: "Update devin-cli to ${{ env.VERSION }}"
80
73
  env:
81
74
  COMMITTER_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
75
+
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.1.7] - 2026-03-11
9
+ ### Fixed
10
+ - `knowledge list` now correctly reads `notes` key from the v3 `knowledge/notes` endpoint, with `knowledge` as fallback. Also reads `title` in addition to `name` for display.
11
+ - `schedules list` now correctly reads `schedules` key from the v3 response, with `items` as fallback.
12
+
13
+ ## [1.1.6] - 2026-03-11
14
+ ### Fixed
15
+ - `repos list` now correctly reads `repo_path` (the actual v3beta1 API key) and resolves indexed state from `indexing_status.indexing_enabled`.
16
+ - `sessions cost` now reads `acus_consumed` (the real v3 field name) with a fallback to `acu_used` for v1.
17
+
8
18
  ## [1.1.5] - 2026-03-11
9
19
  ### Fixed
10
20
  - `repos list` table now correctly resolves repository paths by handling direct list API responses and trying `repository_path`, `full_name`, `path`, and `name` keys in sequence.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devin-cli
3
- Version: 1.1.5
3
+ Version: 1.1.7
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.5"
3
+ version = "1.1.7"
4
4
  description = "Unofficial CLI for Devin AI - The first AI Software Engineer"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -7,8 +7,6 @@ def list_knowledge():
7
7
  def create_knowledge(
8
8
  title: str,
9
9
  body: str,
10
- # v3 uses title/body, v1 used name/body/trigger_description
11
- # We'll map them for compatibility if possible, but v3 is primary
12
10
  ):
13
11
  data = {
14
12
  "title": title,
@@ -70,11 +70,9 @@ def get_session_tags(session_id: str):
70
70
  return client.get(f"sessions/{session_id}/tags")
71
71
 
72
72
  def update_session_tags(session_id: str, tags: List[str]):
73
- # v3 PUT replaces tags
74
73
  return client.put(f"sessions/{session_id}/tags", json={"tags": tags})
75
74
 
76
75
  def append_session_tags(session_id: str, tags: List[str]):
77
- # v3 POST appends tags
78
76
  return client.post(f"sessions/{session_id}/tags", json={"tags": tags})
79
77
 
80
78
  def terminate_session(session_id: str):
@@ -268,14 +268,14 @@ def session_cost_cmd(
268
268
  if org: config.temporary_org_id = org
269
269
  if session_id:
270
270
  resp = sessions.get_session(session_id)
271
- acu_used = resp.get("acu_used")
271
+ acus = resp.get("acus_consumed") or resp.get("acu_used")
272
272
  cost_data = {
273
273
  "session_id": resp.get("session_id"),
274
274
  "status": resp.get("status_enum"),
275
- "acu_used": acu_used,
275
+ "acus_consumed": acus,
276
276
  }
277
277
  console.print(Panel(json.dumps(cost_data, indent=2), title=f"Session Cost: {session_id}"))
278
- if acu_used is None:
278
+ if acus is None:
279
279
  console.print("[yellow]ACU data unavailable — this may be a v1 API session or a service token without cost visibility.[/yellow]")
280
280
  else:
281
281
  resp = consumption.get_daily_consumption_breakdown()
@@ -331,12 +331,12 @@ def list_knowledge_cmd(org: Optional[str] = typer.Option(None, "--org")):
331
331
  """List knowledge notes."""
332
332
  if org: config.temporary_org_id = org
333
333
  resp = knowledge.list_knowledge()
334
- items = resp.get("knowledge", [])
334
+ items = resp.get("notes", resp.get("knowledge", []))
335
335
  table = Table(title="Knowledge Base")
336
336
  table.add_column("ID", style="cyan")
337
337
  table.add_column("Name")
338
338
  for item in items:
339
- table.add_row(item.get("id"), item.get("name"))
339
+ table.add_row(item.get("id"), item.get("title") or item.get("name"))
340
340
  console.print(table)
341
341
 
342
342
  @knowledge_app.command("create")
@@ -489,7 +489,7 @@ def list_schedules_cmd(org: Optional[str] = typer.Option(None, "--org")):
489
489
  """List recurring schedules."""
490
490
  if org: config.temporary_org_id = org
491
491
  resp = schedules.list_schedules()
492
- items = resp.get("items", [])
492
+ items = resp.get("schedules", resp.get("items", []))
493
493
  table = Table(title="Schedules")
494
494
  table.add_column("ID", style="cyan")
495
495
  table.add_column("Title")
@@ -535,13 +535,20 @@ def list_repos_cmd(
535
535
  table.add_column("Indexed", style="green")
536
536
  for item in items:
537
537
  path = (
538
- item.get("repository_path")
538
+ item.get("repo_path")
539
+ or item.get("repository_path")
540
+ or item.get("repo_name")
539
541
  or item.get("full_name")
540
542
  or item.get("path")
541
543
  or item.get("name")
542
544
  or ""
543
545
  )
544
- indexed = item.get("is_indexed") or item.get("indexed")
546
+ indexing_status = item.get("indexing_status") or {}
547
+ indexed = (
548
+ indexing_status.get("indexing_enabled")
549
+ or item.get("is_indexed")
550
+ or item.get("indexed")
551
+ )
545
552
  table.add_row(path, "Yes" if indexed else "No")
546
553
  console.print(table)
547
554
 
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