evo-cli 0.16.0__tar.gz → 0.16.1__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 (109) hide show
  1. {evo_cli-0.16.0 → evo_cli-0.16.1}/PKG-INFO +1 -1
  2. evo_cli-0.16.1/evo_cli/VERSION +1 -0
  3. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_render.py +2 -1
  4. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/show.py +5 -2
  5. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/PKG-INFO +1 -1
  6. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_harness_dag.py +52 -0
  7. evo_cli-0.16.0/evo_cli/VERSION +0 -1
  8. {evo_cli-0.16.0 → evo_cli-0.16.1}/Containerfile +0 -0
  9. {evo_cli-0.16.0 → evo_cli-0.16.1}/HISTORY.md +0 -0
  10. {evo_cli-0.16.0 → evo_cli-0.16.1}/LICENSE +0 -0
  11. {evo_cli-0.16.0 → evo_cli-0.16.1}/MANIFEST.in +0 -0
  12. {evo_cli-0.16.0 → evo_cli-0.16.1}/README.md +0 -0
  13. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/__init__.py +0 -0
  14. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/__main__.py +0 -0
  15. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/base.py +0 -0
  16. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/cli.py +0 -0
  17. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/__init__.py +0 -0
  18. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/agent_toy.py +0 -0
  19. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/claude_code.py +0 -0
  20. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/cloudflare.py +0 -0
  21. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/cred.py +0 -0
  22. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/download.py +0 -0
  23. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/fix_claude.py +0 -0
  24. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/gdrive.py +0 -0
  25. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/gh.py +0 -0
  26. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/__init__.py +0 -0
  27. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_dag.py +0 -0
  28. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_git.py +0 -0
  29. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_model.py +0 -0
  30. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_mutate.py +0 -0
  31. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_paths.py +0 -0
  32. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_server.py +0 -0
  33. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/check.py +0 -0
  34. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/edit.py +0 -0
  35. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/pull.py +0 -0
  36. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/serve.py +0 -0
  37. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/views.py +0 -0
  38. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/index-ByHqvOcG.css +0 -0
  39. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/index-Cb4QbBye.js +0 -0
  40. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  41. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  42. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  43. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  44. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  45. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  46. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  47. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  48. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  49. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  50. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  51. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  52. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/index.html +0 -0
  53. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/hwid.py +0 -0
  54. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/hwid_reset.py +0 -0
  55. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/localproxy.py +0 -0
  56. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/mcp.py +0 -0
  57. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/miniconda.py +0 -0
  58. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/netcheck.py +0 -0
  59. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/opencode.py +0 -0
  60. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/plantuml.py +0 -0
  61. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/site2s.py +0 -0
  62. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/ssh.py +0 -0
  63. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/sysmon.py +0 -0
  64. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/tts.py +0 -0
  65. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/update.py +0 -0
  66. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/wifi.py +0 -0
  67. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/console.py +0 -0
  68. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/__init__.py +0 -0
  69. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/doctor.py +0 -0
  70. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/google_oauth.py +0 -0
  71. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/migrate.py +0 -0
  72. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/oauth_flow.py +0 -0
  73. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/registry.py +0 -0
  74. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/store.py +0 -0
  75. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/sync.py +0 -0
  76. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/mcp_registry.py +0 -0
  77. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/__init__.py +0 -0
  78. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/chunking.py +0 -0
  79. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/core.py +0 -0
  80. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/creds.py +0 -0
  81. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/errors.py +0 -0
  82. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/http.py +0 -0
  83. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/openai.py +0 -0
  84. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/player.py +0 -0
  85. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/vbee.py +0 -0
  86. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/SOURCES.txt +0 -0
  87. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/dependency_links.txt +0 -0
  88. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/entry_points.txt +0 -0
  89. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/requires.txt +0 -0
  90. {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/top_level.txt +0 -0
  91. {evo_cli-0.16.0 → evo_cli-0.16.1}/pyproject.toml +0 -0
  92. {evo_cli-0.16.0 → evo_cli-0.16.1}/setup.cfg +0 -0
  93. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/__init__.py +0 -0
  94. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_agent_toy.py +0 -0
  95. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_claude_code.py +0 -0
  96. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_cli.py +0 -0
  97. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_console.py +0 -0
  98. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_cred.py +0 -0
  99. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_download.py +0 -0
  100. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_fix_claude.py +0 -0
  101. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_gh.py +0 -0
  102. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_harness.py +0 -0
  103. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_mcp.py +0 -0
  104. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_opencode.py +0 -0
  105. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_plantuml.py +0 -0
  106. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_sysmon.py +0 -0
  107. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_tts.py +0 -0
  108. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_update.py +0 -0
  109. {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_wifi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evo_cli
3
- Version: 0.16.0
3
+ Version: 0.16.1
4
4
  Summary: Evolution CLI - a developer toolbox for setting up dev machines
5
5
  Author: maycuatroi
6
6
  Project-URL: Homepage, https://github.com/maycuatroi/evo-cli
@@ -0,0 +1 @@
1
+ 0.16.1
@@ -73,7 +73,8 @@ def print_graph(title: str, graph: dict) -> None:
73
73
  for node in sorted(by_rank[rank], key=lambda n: n["id"]):
74
74
  style = TONE_STYLE[node["tone"]]
75
75
  cycle = " [yellow](in cycle)[/]" if node["inCycle"] else ""
76
- detail = node["meta"].get("what") or node["meta"].get("role") or node["meta"].get("status") or ""
76
+ meta = node["meta"]
77
+ detail = meta.get("title") or meta.get("what") or meta.get("role") or meta.get("status") or ""
77
78
  console.print(f" [{style}]*[/] [bold]{node['label']}[/]{cycle} [dim]{one_line(detail, width)}[/]")
78
79
  for edge in sorted(outgoing.get(node["id"], []), key=lambda e: e["target"]):
79
80
  arrow = "-->" if not edge["dashed"] else "..>"
@@ -22,14 +22,17 @@ HIDE_KEYS = {"status", "order", "what", "repo", "id"}
22
22
  def _render_item(section: str, index: int, item: dict, full: bool) -> None:
23
23
  status = item.get("status")
24
24
  style = TONE_STYLE[tone_of(section, status)]
25
- head = item.get("what") or item.get("repo") or item.get("issue") or "?"
25
+ authored = item.get("title")
26
+ titled = isinstance(authored, str) and bool(authored.strip())
27
+ head = authored.strip() if titled else (item.get("what") or item.get("repo") or item.get("issue") or "?")
28
+ hidden = (HIDE_KEYS - {"what"}) | {"title"} if titled else HIDE_KEYS
26
29
  label = item.get("id", item.get("order", index))
27
30
  badge = f"[{style}]{status}[/]" if status else ""
28
31
  if not full:
29
32
  head = one_line(head, title_width(reserved=18))
30
33
  console.print(f" [bold]{label:>3}[/] {head} {badge}")
31
34
  for key, value in item.items():
32
- if key in HIDE_KEYS:
35
+ if key in hidden:
33
36
  continue
34
37
  if isinstance(value, list):
35
38
  value = "; ".join(str(v) for v in value) or "-"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evo_cli
3
- Version: 0.16.0
3
+ Version: 0.16.1
4
4
  Summary: Evolution CLI - a developer toolbox for setting up dev machines
5
5
  Author: maycuatroi
6
6
  Project-URL: Homepage, https://github.com/maycuatroi/evo-cli
@@ -1,5 +1,8 @@
1
1
  import textwrap
2
2
 
3
+ from click.testing import CliRunner
4
+
5
+ from evo_cli.cli import cli
3
6
  from evo_cli.commands.harness._dag import plan_repo_graph, plan_step_graph, seam_graph
4
7
  from evo_cli.commands.harness._model import load_plan_file, load_seams
5
8
 
@@ -295,3 +298,52 @@ def test_step_graph_survives_a_step_with_neither_title_nor_what(tmp_path):
295
298
  assert [node["meta"]["title"] for node in graph["nodes"]] == [""]
296
299
  assert graph["acyclic"] is True
297
300
  assert not [w for w in graph["warnings"] if w["level"] == "error"]
301
+
302
+
303
+ def _titled_cluster(tmp_path):
304
+ root = tmp_path / "cluster"
305
+ (root / "plans" / "active").mkdir(parents=True)
306
+ (root / "harness.yaml").write_text(
307
+ f"name: test\nworkspace: {tmp_path.as_posix()}\nrepos:\n- name: alpha\n present: true\n",
308
+ encoding="utf-8",
309
+ )
310
+ (root / "contracts.yaml").write_text("seams: []\n", encoding="utf-8")
311
+ (tmp_path / "alpha").mkdir(exist_ok=True)
312
+ long_what = "Rewrite the harness dashboard so every step node carries a short readable headline " * 3
313
+ (root / "plans" / "active" / "p.yaml").write_text(
314
+ textwrap.dedent(
315
+ f"""
316
+ id: p
317
+ steps:
318
+ - id: 1
319
+ repo: alpha
320
+ title: Short authored title
321
+ what: {long_what.strip()}
322
+ status: pending
323
+ - id: 2
324
+ repo: alpha
325
+ what: {long_what.strip()}
326
+ status: pending
327
+ """
328
+ ),
329
+ encoding="utf-8",
330
+ )
331
+ return root
332
+
333
+
334
+ def test_graph_command_prints_the_title_rather_than_the_full_what(tmp_path):
335
+ root = _titled_cluster(tmp_path)
336
+ result = CliRunner().invoke(cli, ["harness", "graph", "p:steps", "--harness", str(root)])
337
+
338
+ assert result.exit_code == 0
339
+ assert "Short authored title" in result.output
340
+ assert "Rewrite the harness dashboard so every" not in result.output
341
+
342
+
343
+ def test_show_command_keeps_the_full_what_when_a_step_declares_a_title(tmp_path):
344
+ root = _titled_cluster(tmp_path)
345
+ result = CliRunner().invoke(cli, ["harness", "show", "p", "--full", "--harness", str(root)])
346
+
347
+ assert result.exit_code == 0
348
+ assert "Short authored title" in result.output
349
+ assert "what:" in result.output
@@ -1 +0,0 @@
1
- 0.16.0
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