Skip to content

Commit cec2026

Browse files
Revanth PobalaRevanth Pobala
authored andcommitted
fix: resolve all 6 API param bugs from user report
1 parent b92accb commit cec2026

6 files changed

Lines changed: 45 additions & 20 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "devin-cli"
3-
version = "1.2.3"
3+
version = "1.2.4"
44
description = "Unofficial CLI for Devin AI - The first AI Software Engineer"
55
readme = "README.md"
66
authors = [

src/devin_cli/api/v1/knowledge.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,19 @@ def list_knowledge():
55
return client.get("knowledge")
66

77
def create_knowledge(
8-
name: str,
9-
body: str,
10-
trigger_description: str,
8+
name: str = None,
9+
body: str = None,
10+
trigger_description: str = None,
1111
parent_folder_id: str = None,
1212
pinned_repo: str = None,
1313
title: str = None, # v3 fallback
14+
trigger: str = None, # v3 fallback
1415
**kwargs
1516
):
1617
data = {
1718
"name": name or title,
1819
"body": body,
19-
"trigger_description": trigger_description or ""
20+
"trigger_description": trigger_description or trigger or ""
2021
}
2122
if parent_folder_id:
2223
data["parent_folder_id"] = parent_folder_id
@@ -31,15 +32,16 @@ def update_knowledge(
3132
body: str = None,
3233
trigger_description: str = None,
3334
title: str = None, # v3 fallback
35+
trigger: str = None, # v3 fallback
3436
**kwargs
3537
):
3638
data = {}
3739
if name or title:
3840
data["name"] = name or title
3941
if body:
4042
data["body"] = body
41-
if trigger_description:
42-
data["trigger_description"] = trigger_description
43+
if trigger_description or trigger:
44+
data["trigger_description"] = trigger_description or trigger
4345

4446
return client.put(f"knowledge/{knowledge_id}", json=data)
4547

src/devin_cli/api/v3/knowledge.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@ def list_knowledge():
55
return client.get("knowledge/notes")
66

77
def create_knowledge(
8-
title: str,
9-
body: str,
8+
title: str = None,
9+
body: str = None,
10+
name: str = None,
11+
trigger: str = "",
12+
trigger_description: str = "",
13+
**kwargs
1014
):
1115
data = {
12-
"title": title,
16+
"name": name or title,
1317
"body": body,
18+
"trigger": trigger or trigger_description or ""
1419
}
1520
return client.post("knowledge/notes", json=data)
1621

@@ -21,12 +26,18 @@ def update_knowledge(
2126
note_id: str,
2227
title: Optional[str] = None,
2328
body: Optional[str] = None,
29+
trigger: Optional[str] = None,
30+
name: Optional[str] = None,
31+
trigger_description: Optional[str] = None,
32+
**kwargs
2433
):
2534
data = {}
26-
if title:
27-
data["title"] = title
35+
if title or name:
36+
data["name"] = title or name
2837
if body:
2938
data["body"] = body
39+
if trigger or trigger_description:
40+
data["trigger"] = trigger or trigger_description
3041

3142
return client.put(f"knowledge/notes/{note_id}", json=data)
3243

src/devin_cli/api/v3/sessions.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ def create_session(
2727
):
2828
data = {
2929
"prompt": prompt,
30-
"bypass_approval": bypass_approval,
3130
}
31+
if bypass_approval:
32+
data["bypass_approval"] = bypass_approval
3233
if advanced_mode:
3334
data["advanced_mode"] = advanced_mode
3435
if attachment_urls:

src/devin_cli/cli.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -413,11 +413,12 @@ def list_knowledge_cmd(org: Optional[str] = typer.Option(None, "--org")):
413413
def create_knowledge_cmd(
414414
title: str,
415415
body: str,
416+
trigger: str = typer.Option("", "--trigger", help="Trigger description"),
416417
org: Optional[str] = typer.Option(None, "--org"),
417418
):
418419
"""Create a knowledge note."""
419420
if org: config.temporary_org_id = org
420-
resp = knowledge.create_knowledge(title, body)
421+
resp = knowledge.create_knowledge(title=title, body=body, trigger=trigger)
421422
console.print(f"[green]Created note:[/green] {resp.get('id')}")
422423

423424
@knowledge_app.command("delete")
@@ -435,13 +436,21 @@ def delete_knowledge_cmd(
435436
# --- Playbooks ---
436437
@playbook_app.command("list")
437438
@handle_api_error
438-
def list_playbooks_cmd(org: Optional[str] = typer.Option(None, "--org")):
439+
def list_playbooks_cmd(
440+
org: Optional[str] = typer.Option(None, "--org"),
441+
json_output: bool = typer.Option(False, "--json", help="Output raw JSON"),
442+
):
439443
"""List team playbooks."""
440444
if org: config.temporary_org_id = org
441445
resp = playbooks.list_playbooks()
442446
items = resp.get("items", []) if isinstance(resp, dict) else resp
447+
448+
if json_output:
449+
console.print(json.dumps(items, indent=2))
450+
return
451+
443452
table = Table(title="Playbooks")
444-
table.add_column("ID", style="cyan")
453+
table.add_column("ID", style="cyan", no_wrap=True)
445454
table.add_column("Title")
446455
for item in items:
447456
if isinstance(item, dict):
@@ -950,7 +959,7 @@ def update_knowledge_cmd(
950959
trigger: Optional[str] = typer.Option(None, "--trigger"),
951960
):
952961
"""Update an existing knowledge entry."""
953-
knowledge.update_knowledge(knowledge_id, title=name, body=body)
962+
knowledge.update_knowledge(knowledge_id, title=name, body=body, trigger=trigger)
954963
console.print(f"[green]Knowledge {knowledge_id} updated.[/green]")
955964

956965
@app.command("update-playbook")

tests/test_api/test_knowledge.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,21 @@ def test_create_knowledge():
2424
)
2525
knowledge.create_knowledge(
2626
title="test",
27-
body="content"
27+
body="content",
28+
trigger="my_trigger"
2829
)
2930
assert route.called
3031
import json
3132
body = json.loads(route.calls.last.request.read())
32-
assert body["title"] == "test"
33+
assert body["name"] == "test"
34+
assert body["trigger"] == "my_trigger"
3335

3436
@respx.mock
3537
def test_update_knowledge():
3638
route = respx.put("https://api.devin.ai/v3/organizations/test_org/knowledge/notes/k_123").mock(
3739
return_value=Response(200)
3840
)
39-
knowledge.update_knowledge("k_123", title="new")
41+
knowledge.update_knowledge("k_123", title="new", trigger="new_trigger")
4042
assert route.called
4143

4244
@respx.mock

0 commit comments

Comments
 (0)