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.
- {evo_cli-0.16.0 → evo_cli-0.16.1}/PKG-INFO +1 -1
- evo_cli-0.16.1/evo_cli/VERSION +1 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_render.py +2 -1
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/show.py +5 -2
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/PKG-INFO +1 -1
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_harness_dag.py +52 -0
- evo_cli-0.16.0/evo_cli/VERSION +0 -1
- {evo_cli-0.16.0 → evo_cli-0.16.1}/Containerfile +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/HISTORY.md +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/LICENSE +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/MANIFEST.in +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/README.md +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/__init__.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/__main__.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/base.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/cli.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/__init__.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/agent_toy.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/claude_code.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/cloudflare.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/cred.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/download.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/fix_claude.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/gdrive.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/gh.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/__init__.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_dag.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_git.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_model.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_mutate.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_paths.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/_server.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/check.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/edit.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/pull.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/serve.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/views.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/index-ByHqvOcG.css +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/index-Cb4QbBye.js +0 -0
- {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
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {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
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {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
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {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
- {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
- {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
- {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
- {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
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/harness/web/index.html +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/hwid.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/hwid_reset.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/localproxy.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/mcp.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/miniconda.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/netcheck.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/opencode.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/plantuml.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/site2s.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/ssh.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/sysmon.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/tts.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/update.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/commands/wifi.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/console.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/__init__.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/doctor.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/google_oauth.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/migrate.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/oauth_flow.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/registry.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/store.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/credentials/sync.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/mcp_registry.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/__init__.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/chunking.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/core.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/creds.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/errors.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/http.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/openai.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/player.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli/tts/vbee.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/SOURCES.txt +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/dependency_links.txt +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/entry_points.txt +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/requires.txt +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/evo_cli.egg-info/top_level.txt +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/pyproject.toml +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/setup.cfg +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/__init__.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_agent_toy.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_claude_code.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_cli.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_console.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_cred.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_download.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_fix_claude.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_gh.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_harness.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_mcp.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_opencode.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_plantuml.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_sysmon.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_tts.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_update.py +0 -0
- {evo_cli-0.16.0 → evo_cli-0.16.1}/tests/test_wifi.py +0 -0
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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,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
|
evo_cli-0.16.0/evo_cli/VERSION
DELETED
|
@@ -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
|
|
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
|
|
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
|