hexcli 2.19.0__tar.gz → 2.20.0__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 (44) hide show
  1. {hexcli-2.19.0 → hexcli-2.20.0}/CHANGELOG.md +31 -0
  2. {hexcli-2.19.0 → hexcli-2.20.0}/PKG-INFO +1 -1
  3. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/__init__.py +1 -1
  4. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/tools.py +13 -2
  5. {hexcli-2.19.0 → hexcli-2.20.0}/.gitignore +0 -0
  6. {hexcli-2.19.0 → hexcli-2.20.0}/Hex CLI.cmd +0 -0
  7. {hexcli-2.19.0 → hexcli-2.20.0}/LICENSE +0 -0
  8. {hexcli-2.19.0 → hexcli-2.20.0}/README.md +0 -0
  9. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/agent.py +0 -0
  10. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/assets/hexcli.ico +0 -0
  11. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/assets/hexcli.png +0 -0
  12. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/cancel.py +0 -0
  13. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/chatlog.py +0 -0
  14. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/commands.py +0 -0
  15. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/compaction.py +0 -0
  16. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/config.py +0 -0
  17. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/diffview.py +0 -0
  18. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/distribution.py +0 -0
  19. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/doctor.py +0 -0
  20. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/editing.py +0 -0
  21. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/http_client.py +0 -0
  22. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/launcher.py +0 -0
  23. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/lineedit.py +0 -0
  24. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/llm.py +0 -0
  25. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/lockfile.py +0 -0
  26. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/markdown_stream.py +0 -0
  27. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/memory.py +0 -0
  28. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/network.py +0 -0
  29. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/parsing.py +0 -0
  30. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/paths.py +0 -0
  31. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/prompts.py +0 -0
  32. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/psparse.py +0 -0
  33. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/repl.py +0 -0
  34. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/safety.py +0 -0
  35. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/sessions.py +0 -0
  36. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/setup_wizard.py +0 -0
  37. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/statusbar.py +0 -0
  38. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/stream_render.py +0 -0
  39. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/telemetry.py +0 -0
  40. {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/ui.py +0 -0
  41. {hexcli-2.19.0 → hexcli-2.20.0}/install.ps1 +0 -0
  42. {hexcli-2.19.0 → hexcli-2.20.0}/launcher.py +0 -0
  43. {hexcli-2.19.0 → hexcli-2.20.0}/pyproject.toml +0 -0
  44. {hexcli-2.19.0 → hexcli-2.20.0}/shellai.example.json +0 -0
@@ -4,6 +4,37 @@ Full evidence for every claim below — including the experiments that failed
4
4
  lives in `docs/V2_PLAN.md` §14. Numbers are pass^k over repeated live runs on
5
5
  the Hexagon NPU, not single-run anecdotes.
6
6
 
7
+ ## 2.20.0 — 2026-09-18
8
+
9
+ A minor release: a tool result the model reads changes (`run_code` on a
10
+ program that waits for the keyboard).
11
+
12
+ > **Gate: PASS** on the pinned 24-case set: 21 cases held 5/5 in the arm;
13
+ > `casual-4`, `factual-4` and `memory-1` lost four, two and four runs to
14
+ > backend timeouts and were re-run on a fresh server at six runs, 6/6 each.
15
+ > Own arm, seed 20260918. **Platform: 13 invalid of 245 runs (5.3 %)**, the
16
+ > server's working set again above 6 GB with 1.6 GB free, so the ceiling
17
+ > comparison carries the `[PLATFORM]` flag: run-level 402/514 vs 166/217,
18
+ > −1.7 %, Fisher p = 0.63; pass^k 26 → 30 of 46 shared cases, McNemar
19
+ > p = 0.13. The change did what it is for: `run_code` timed out 0 times in
20
+ > the arm against 10 in the 2.12.0 arm (all of them `make-py-1`'s
21
+ > calculator waiting on `input()`), the note fired twice, and `make-py-1`
22
+ > stayed 5/5. Smoke 10/10 on a fresh server.
23
+
24
+ - `run_code` gives the program no keyboard, and says so when the program
25
+ asked for one. The child inherited the terminal's standard input, so a
26
+ program that calls `input()` sat waiting on the owner's console until the
27
+ tool's timeout: on 2026-09-18 "create a python cli hilo guessing game and
28
+ run it" wrote a working game and then waited the full ten seconds, twice,
29
+ to report "TIMEOUT". Standard input is now closed for the child, so
30
+ `input()` raises `EOFError` at once, and when it does the result adds one
31
+ line: the program reads from the keyboard, `run_code` has none to give
32
+ it, and it has to be started in a terminal, with the command. On record:
33
+ 12 `run_code` timeouts whose output ends in a prompt (ten of them the
34
+ `make-py-1` calculator) and 19 runs that already hit `EOFError` under the
35
+ eval runner, which has no terminal; 0.6 % of recorded runs, all of them
36
+ this shape.
37
+
7
38
  ## 2.19.0 — 2026-09-18
8
39
 
9
40
  A minor release: nudge text the model reads is new (the claimed-fix rule)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: hexcli
3
- Version: 2.19.0
3
+ Version: 2.20.0
4
4
  Summary: Local Hexagon NPU terminal agent for Snapdragon X Elite Windows ARM64
5
5
  Project-URL: Homepage, https://github.com/NathanL15/Hex-CLI
6
6
  Project-URL: Repository, https://github.com/NathanL15/Hex-CLI
@@ -3,4 +3,4 @@
3
3
  # The one place the version is written. pyproject.toml reads it (hatch
4
4
  # dynamic version), agent.VERSION re-exports it, and CI refuses a release
5
5
  # tag that does not match it.
6
- __version__ = "2.19.0"
6
+ __version__ = "2.20.0"
@@ -918,8 +918,13 @@ def run_code_tool(
918
918
  )
919
919
  cmd = [*cmd_prefix, str(path), *[str(a) for a in run_args]]
920
920
  try:
921
+ # No keyboard. With the parent's stdin inherited, a program that
922
+ # calls input() sat on the owner's terminal until the timeout (10 s,
923
+ # twice, 2026-09-18: "create a python cli hilo guessing game and run
924
+ # it"); with stdin closed it raises EOFError at once, and the note
925
+ # below tells the model what that means.
921
926
  proc = subprocess.Popen(
922
- cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
927
+ cmd, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
923
928
  text=True, encoding="utf-8", errors="replace",
924
929
  )
925
930
  except (PermissionError, FileNotFoundError, OSError) as exc:
@@ -940,10 +945,16 @@ def run_code_tool(
940
945
  out = trim_text(stdout, output_limit)
941
946
  err = trim_text(stderr, output_limit)
942
947
  ui.tool_event("run", f"{path} (exit {proc.returncode})")
948
+ note = ""
949
+ if "EOFError" in stderr:
950
+ note = (f"\n\nThe program stopped where it reads from the keyboard (input()). "
951
+ f"run_code has no keyboard to give it, so it cannot be played or driven "
952
+ f"here; it has to be started in a terminal: python {path.name}. The code "
953
+ f"up to that point ran.")
943
954
  return (
944
955
  f"Exit code: {proc.returncode}\n\n"
945
956
  f"[stdout]\n{out or '(empty)'}\n\n"
946
- f"[stderr]\n{err or '(empty)'}"
957
+ f"[stderr]\n{err or '(empty)'}{note}"
947
958
  )
948
959
 
949
960
 
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