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.
- {hexcli-2.19.0 → hexcli-2.20.0}/CHANGELOG.md +31 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/PKG-INFO +1 -1
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/__init__.py +1 -1
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/tools.py +13 -2
- {hexcli-2.19.0 → hexcli-2.20.0}/.gitignore +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/Hex CLI.cmd +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/LICENSE +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/README.md +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/agent.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/assets/hexcli.ico +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/assets/hexcli.png +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/cancel.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/chatlog.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/commands.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/compaction.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/config.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/diffview.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/distribution.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/doctor.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/editing.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/http_client.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/launcher.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/lineedit.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/llm.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/lockfile.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/markdown_stream.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/memory.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/network.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/parsing.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/paths.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/prompts.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/psparse.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/repl.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/safety.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/sessions.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/setup_wizard.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/statusbar.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/stream_render.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/telemetry.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/hexcli/ui.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/install.ps1 +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/launcher.py +0 -0
- {hexcli-2.19.0 → hexcli-2.20.0}/pyproject.toml +0 -0
- {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.
|
|
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
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|