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.
- {devin_cli-1.1.5 → devin_cli-1.1.7}/.github/workflows/pypi-publish.yml +13 -19
- {devin_cli-1.1.5 → devin_cli-1.1.7}/CHANGELOG.md +10 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/PKG-INFO +1 -1
- {devin_cli-1.1.5 → devin_cli-1.1.7}/pyproject.toml +1 -1
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/knowledge.py +0 -2
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/sessions.py +0 -2
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/cli.py +15 -8
- {devin_cli-1.1.5 → devin_cli-1.1.7}/.gitignore +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/LICENSE +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/README.md +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/assets/logo.png +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/generate_facades.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/setup.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/__init__.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/__init__.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/attachments.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/client.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/consumption.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/knowledge.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/members.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/organizations.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/playbooks.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/repositories.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/schedules.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/secrets.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/sessions.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/__init__.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/attachments.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/knowledge.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/playbooks.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/secrets.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v1/sessions.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/__init__.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/attachments.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/consumption.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/members.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/organizations.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/playbooks.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/repositories.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/schedules.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/api/v3/secrets.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/src/devin_cli/config.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/__init__.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/conftest.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_attachments.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_knowledge.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_playbooks.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_repositories.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_schedules.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_secrets.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_api/test_sessions.py +0 -0
- {devin_cli-1.1.5 → devin_cli-1.1.7}/tests/test_cli.py +0 -0
- {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:
|
|
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
|
|
50
|
+
VERSION="${{ github.event.inputs.tag_name }}"
|
|
56
51
|
VERSION=${VERSION#v}
|
|
57
52
|
fi
|
|
58
53
|
echo "VERSION=$VERSION" >> $GITHUB_ENV
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
echo "
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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.
|
|
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
|
|
@@ -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
|
-
|
|
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
|
-
"
|
|
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
|
|
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("
|
|
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
|
-
|
|
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
|
|
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
|