hexcli 2.14.0__tar.gz → 2.15.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.14.0 → hexcli-2.15.0}/CHANGELOG.md +30 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/PKG-INFO +1 -1
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/__init__.py +1 -1
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/tools.py +11 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/.gitignore +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/Hex CLI.cmd +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/LICENSE +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/README.md +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/agent.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/assets/hexcli.ico +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/assets/hexcli.png +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/cancel.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/chatlog.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/commands.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/compaction.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/config.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/diffview.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/distribution.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/doctor.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/editing.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/http_client.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/launcher.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/lineedit.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/llm.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/lockfile.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/markdown_stream.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/memory.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/network.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/parsing.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/paths.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/prompts.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/psparse.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/repl.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/safety.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/sessions.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/setup_wizard.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/statusbar.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/stream_render.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/telemetry.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/hexcli/ui.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/install.ps1 +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/launcher.py +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/pyproject.toml +0 -0
- {hexcli-2.14.0 → hexcli-2.15.0}/shellai.example.json +0 -0
|
@@ -4,6 +4,36 @@ 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.15.0 — 2026-09-18
|
|
8
|
+
|
|
9
|
+
A minor release: one tool error the model reads is new (`edit_file` on
|
|
10
|
+
identical strings).
|
|
11
|
+
|
|
12
|
+
> **Gate: PASS** on the pinned 24-case set after one recheck (`agentic-5`
|
|
13
|
+
> 4/5, a counting answer with no edit in it, then 6/6). Own arm, fresh
|
|
14
|
+
> server, seed 20260917, 9 invalid of 245 runs. Against the v2.11.1 12-run
|
|
15
|
+
> baseline: run-level 402/514 vs 172/221, −0.4 %, Fisher p = 0.92; pass^k
|
|
16
|
+
> 26 → 28 of 46 shared cases, McNemar p = 0.63. The error fired in the arm
|
|
17
|
+
> on 3 `tests-claim-1` runs and nowhere else; that case went 4/5 against
|
|
18
|
+
> 12/24 (p = 0.34, ceiling). `self-correct-1` read 2/5 in the arm on a
|
|
19
|
+
> server 75 minutes into its traffic (the arm's invalid runs were climbing),
|
|
20
|
+
> and the error had not fired in any of its runs; a paired control on a
|
|
21
|
+
> fresh server, ten runs each on the parent tree and this one, came back
|
|
22
|
+
> **10/10 vs 9/10, p = 1.0**. In the one control run where the error did
|
|
23
|
+
> fire the model had sent a hallucinated `main()` as both strings, was told
|
|
24
|
+
> nothing changed, read the file, and then made the real fix. Smoke miss
|
|
25
|
+
> on `agentic-2` re-measured 9/10 against its recorded 75 %.
|
|
26
|
+
|
|
27
|
+
- `edit_file` refuses an edit whose `old_string` and `new_string` are the
|
|
28
|
+
same text, instead of answering "Edited". 37 of the 840 `edit_file` calls
|
|
29
|
+
on record sent identical strings and were told the edit landed; the model
|
|
30
|
+
then ran or read the file believing it had changed it (`tests-claim-1`:
|
|
31
|
+
"The median function was correctly fixed", after an edit of `mean` to
|
|
32
|
+
itself; `runit-1` before 2.14.0: the broken line edited to itself, twice,
|
|
33
|
+
to the step limit). The tool now says nothing changed and what to send
|
|
34
|
+
instead, and leaves the file byte-identical. A missing file still reports
|
|
35
|
+
the path first.
|
|
36
|
+
|
|
7
37
|
## 2.14.0 — 2026-09-17
|
|
8
38
|
|
|
9
39
|
A minor release: one tool behaves differently for the model (a `write_file`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: hexcli
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.15.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
|
|
@@ -423,6 +423,17 @@ def edit_file_tool(path_text: str, old_string: str, new_string: str) -> str:
|
|
|
423
423
|
raise RuntimeError("edit_file requires a non-empty 'old_string'. Use write_file to overwrite the whole file.")
|
|
424
424
|
if not path.exists():
|
|
425
425
|
raise RuntimeError(f"File not found: {path}.{missing_path_hint(path)}")
|
|
426
|
+
if old_string == new_string:
|
|
427
|
+
# 37 of the 840 edit_file calls on record (2026-09-17) sent the same
|
|
428
|
+
# text as old and new and were told "Edited"; the model then ran or
|
|
429
|
+
# read the file believing it had changed it (tests-claim-1: "The
|
|
430
|
+
# median function was correctly fixed", after an edit of mean to
|
|
431
|
+
# itself). A no-op is not an edit, and saying so is the only way the
|
|
432
|
+
# next step can be the change that was meant.
|
|
433
|
+
raise RuntimeError(
|
|
434
|
+
f"old_string and new_string are identical, so nothing changed in {path}. "
|
|
435
|
+
"Put the changed text in new_string, or read_file to see what is there now."
|
|
436
|
+
)
|
|
426
437
|
content = path.read_text(encoding="utf-8")
|
|
427
438
|
tier = "exact"
|
|
428
439
|
if content.count(old_string) == 1:
|
|
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
|