dailybot-cli 3.7.1__tar.gz → 3.7.3__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 (51) hide show
  1. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/PKG-INFO +1 -1
  2. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/kudos.py +2 -17
  3. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/display.py +106 -0
  4. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli.egg-info/PKG-INFO +1 -1
  5. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/pyproject.toml +1 -1
  6. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/LICENSE +0 -0
  7. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/README.md +0 -0
  8. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/__init__.py +0 -0
  9. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/api_client.py +0 -0
  10. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/__init__.py +0 -0
  11. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/agent.py +0 -0
  12. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/ask.py +0 -0
  13. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/auth.py +0 -0
  14. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/authoring_helpers.py +0 -0
  15. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/channels.py +0 -0
  16. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/chat.py +0 -0
  17. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/checkin.py +0 -0
  18. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/config.py +0 -0
  19. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/conversation.py +0 -0
  20. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/env.py +0 -0
  21. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/form.py +0 -0
  22. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/hook.py +0 -0
  23. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/identity.py +0 -0
  24. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/interactive.py +0 -0
  25. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/interactive_chat.py +0 -0
  26. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/public_api_helpers.py +0 -0
  27. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/query_options.py +0 -0
  28. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/status.py +0 -0
  29. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/team.py +0 -0
  30. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/uninstall.py +0 -0
  31. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/update.py +0 -0
  32. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/upgrade.py +0 -0
  33. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/user.py +0 -0
  34. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/user_scoped_actions.py +0 -0
  35. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/version.py +0 -0
  36. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/commands/workflow.py +0 -0
  37. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/config.py +0 -0
  38. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/install_method.py +0 -0
  39. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/ledger.py +0 -0
  40. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/main.py +0 -0
  41. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/tui/__init__.py +0 -0
  42. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/tui/app.py +0 -0
  43. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/tui/commands.py +0 -0
  44. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/tui/conversation.py +0 -0
  45. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli/tui/intents.py +0 -0
  46. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli.egg-info/SOURCES.txt +0 -0
  47. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli.egg-info/dependency_links.txt +0 -0
  48. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli.egg-info/entry_points.txt +0 -0
  49. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli.egg-info/requires.txt +0 -0
  50. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/dailybot_cli.egg-info/top_level.txt +0 -0
  51. {dailybot_cli-3.7.1 → dailybot_cli-3.7.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dailybot-cli
3
- Version: 3.7.1
3
+ Version: 3.7.3
4
4
  Summary: Dailybot CLI - The command-line bridge between humans and agents. Progress reports, observability, and workflow automation for modern teams across Slack, Google Chat, Discord, MS Teams, and more.
5
5
  Author-email: Dailybot <support@dailybot.com>
6
6
  License: MIT
@@ -20,10 +20,10 @@ from dailybot_cli.commands.public_api_helpers import (
20
20
  from dailybot_cli.commands.query_options import build_query_params, query_options, resolve_fetch_all
21
21
  from dailybot_cli.display import (
22
22
  console,
23
- print_detail_panel,
24
23
  print_error,
25
24
  print_kudos_result,
26
25
  print_kudos_table,
26
+ print_kudos_wall_of_fame,
27
27
  print_pagination_footer,
28
28
  )
29
29
 
@@ -394,19 +394,4 @@ def kudos_wall_of_fame(limit: int | None, json_mode: bool) -> None:
394
394
  if json_mode:
395
395
  emit_json(data)
396
396
  return
397
- leaderboard: Any = data.get("leaderboard") or []
398
- fields: list[tuple[str, str]] = [
399
- ("Top receiver", "top_receiver"),
400
- ("Top giver", "top_giver"),
401
- ("Leaderboard entries", "leaderboard_summary"),
402
- ]
403
- summary: dict[str, Any] = {
404
- "top_receiver": (data.get("top_receiver") or {}).get("full_name")
405
- if isinstance(data.get("top_receiver"), dict)
406
- else data.get("top_receiver"),
407
- "top_giver": (data.get("top_giver") or {}).get("full_name")
408
- if isinstance(data.get("top_giver"), dict)
409
- else data.get("top_giver"),
410
- "leaderboard_summary": len(leaderboard),
411
- }
412
- print_detail_panel("Kudos — Wall of Fame", summary, fields)
397
+ print_kudos_wall_of_fame(data)
@@ -64,6 +64,112 @@ def print_kudos_table(kudos: list[dict[str, Any]]) -> None:
64
64
  console.print(table)
65
65
 
66
66
 
67
+ def _kudos_person_name(entry: Any) -> str | None:
68
+ """Extract a display name from a wall-of-fame person entry.
69
+
70
+ The API nests the person under ``user`` (``{"user": {"full_name": ...},
71
+ "kudos_received": ...}``); a top-level ``full_name`` is accepted as a
72
+ fallback so partial payloads degrade to a dash instead of crashing.
73
+ """
74
+ if not isinstance(entry, dict):
75
+ return None
76
+ user: Any = entry.get("user")
77
+ if isinstance(user, dict) and user.get("full_name"):
78
+ return str(user["full_name"])
79
+ name: Any = entry.get("full_name")
80
+ return str(name) if name else None
81
+
82
+
83
+ def print_kudos_wall_of_fame(data: dict[str, Any]) -> None:
84
+ """Render the kudos wall of fame: top receiver/giver, caller position,
85
+ company-values distribution, and the ranked leaderboard.
86
+
87
+ ``GET /v1/kudos/wall-of-fame/`` returns ``top_receiver`` / ``top_giver``
88
+ with the person nested under ``user``, the leaderboard wrapped in a
89
+ ``{count, next, previous, results}`` envelope, and the caller's own
90
+ standing in ``leaderboard_summary`` (``{position, total}``).
91
+ """
92
+ top_receiver: Any = data.get("top_receiver")
93
+ top_giver: Any = data.get("top_giver")
94
+ receiver_name: str | None = _kudos_person_name(top_receiver)
95
+ giver_name: str | None = _kudos_person_name(top_giver)
96
+ if receiver_name and isinstance(top_receiver, dict):
97
+ received: Any = top_receiver.get("kudos_received")
98
+ if received is not None:
99
+ receiver_name = f"{receiver_name} ({received} received)"
100
+ if giver_name and isinstance(top_giver, dict):
101
+ given: Any = top_giver.get("kudos_given")
102
+ if given is not None:
103
+ giver_name = f"{giver_name} ({given} given)"
104
+
105
+ summary_raw: Any = data.get("leaderboard_summary")
106
+ position: str | None = None
107
+ if isinstance(summary_raw, dict) and summary_raw.get("position") is not None:
108
+ total_ranked: Any = summary_raw.get("total")
109
+ position = (
110
+ f"{summary_raw['position']} of {total_ranked}"
111
+ if total_ranked
112
+ else str(summary_raw["position"])
113
+ )
114
+
115
+ print_detail_panel(
116
+ "Kudos — Wall of Fame",
117
+ {"top_receiver": receiver_name, "top_giver": giver_name, "position": position},
118
+ [
119
+ ("Top receiver", "top_receiver"),
120
+ ("Top giver", "top_giver"),
121
+ ("Your position", "position"),
122
+ ],
123
+ )
124
+
125
+ dna: Any = data.get("dna_distribution")
126
+ if isinstance(dna, list) and dna:
127
+ dna_table: Table = Table(title="Company values (kudos DNA)")
128
+ dna_table.add_column("Value", style="cyan")
129
+ dna_table.add_column("Kudos", justify="right")
130
+ dna_table.add_column("%", justify="right", style="dim")
131
+ for item in dna:
132
+ value_raw: Any = item.get("company_value") if isinstance(item, dict) else None
133
+ value: dict[str, Any] = value_raw if isinstance(value_raw, dict) else {}
134
+ label: str = f"{value.get('emoji', '')} {value.get('value', '—')}".strip()
135
+ dna_table.add_row(label, str(item.get("count", "—")), str(item.get("percentage", "—")))
136
+ console.print(dna_table)
137
+
138
+ board_raw: Any = data.get("leaderboard")
139
+ if isinstance(board_raw, dict):
140
+ entries: list[Any] = list(board_raw.get("results") or [])
141
+ total: int | None = (
142
+ board_raw.get("count") if isinstance(board_raw.get("count"), int) else None
143
+ )
144
+ else:
145
+ entries = list(board_raw or [])
146
+ total = len(entries)
147
+ if not entries:
148
+ console.print("[dim]No leaderboard entries.[/dim]")
149
+ return
150
+ table: Table = Table(title="Leaderboard")
151
+ table.add_column("#", justify="right", style="dim")
152
+ table.add_column("Name", style="cyan")
153
+ table.add_column("Kudos", justify="right")
154
+ table.add_column("+Kudos", justify="right")
155
+ for entry in entries:
156
+ if not isinstance(entry, dict):
157
+ continue
158
+ table.add_row(
159
+ str(entry.get("position", "—")),
160
+ _kudos_person_name(entry) or "—",
161
+ str(entry.get("score", "—")),
162
+ str(entry.get("total_plus_kudos", "—")),
163
+ )
164
+ console.print(table)
165
+ print_pagination_footer(
166
+ len(entries),
167
+ total,
168
+ has_more=total is not None and total > len(entries),
169
+ more_hint="raise --limit to fetch more",
170
+ )
171
+
172
+
67
173
  def print_workflows_table(workflows: list[dict[str, Any]]) -> None:
68
174
  """Render a compact table of workflows (name, trigger, active, runs)."""
69
175
  if not workflows:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dailybot-cli
3
- Version: 3.7.1
3
+ Version: 3.7.3
4
4
  Summary: Dailybot CLI - The command-line bridge between humans and agents. Progress reports, observability, and workflow automation for modern teams across Slack, Google Chat, Discord, MS Teams, and more.
5
5
  Author-email: Dailybot <support@dailybot.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dailybot-cli"
7
- version = "3.7.1"
7
+ version = "3.7.3"
8
8
  description = "Dailybot CLI - The command-line bridge between humans and agents. Progress reports, observability, and workflow automation for modern teams across Slack, Google Chat, Discord, MS Teams, and more."
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
File without changes
File without changes
File without changes