zames_pro 2.82.108 → 2.82.110

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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.82.110] - 2026-10-24
11
+
12
+ ### Fixed
13
+
14
+ - **commands:** a dollar token inside a custom-command argument is not expanded twice
15
+
16
+ ## [2.82.109] - 2026-10-24
17
+
18
+ ### Fixed
19
+
20
+ - **tui:** a failure phrase inside the output does not mark the call failed
21
+
10
22
  ## [2.82.108] - 2026-10-24
11
23
 
12
24
  ### Fixed
package/dist/commands.js CHANGED
@@ -886,10 +886,32 @@ function replaceDollarTokens(s, parts, names) {
886
886
  // it is unit-tested.
887
887
  export function expandCommandArgs(body, rest, names = []) {
888
888
  const parts = splitCommandArgs(rest);
889
+ // Scan the BODY only: the operator's arguments are DATA and must not be
890
+ // re-scanned for `$1`/`$name`. Substituting them into the text FIRST and
891
+ // running the dollar pass over the result rewrote an argument that merely
892
+ // contained `$1` (`/cmd real $1` sent `real real`). A unique placeholder is
893
+ // parked for every `{{args}}`/`$ARGUMENTS` occurrence and restored after the
894
+ // positional pass.
895
+ const parked = [];
889
896
  let out = String(body ?? '');
890
- out = out.split('{{args}}').join(rest);
891
- out = out.split('$ARGUMENTS').join(rest);
897
+ const park = () => {
898
+ const key = String.fromCharCode(0x1f) +
899
+ 'a' +
900
+ parked.length +
901
+ String.fromCharCode(0x1f);
902
+ parked.push(rest);
903
+ return key;
904
+ };
905
+ out = out.split('{{args}}').join(park());
906
+ out = out.split('$ARGUMENTS').join(park());
892
907
  out = replaceDollarTokens(out, parts, names);
908
+ for (let i = 0; i < parked.length; i++) {
909
+ const key = String.fromCharCode(0x1f) + 'a' + i + String.fromCharCode(0x1f);
910
+ out = out.split(key).join(parked[i]);
911
+ }
912
+ // The placeholder uses a control character that cannot appear in a normal
913
+ // body; a body that DOES contain it (a binary snippet) is left untouched
914
+ // because its text is not a generated key.
893
915
  return out.trim();
894
916
  }
895
917
  // Names declared in `arguments:` but not supplied on the command line (by
@@ -84,11 +84,17 @@ export function looksLikeToolError(result) {
84
84
  .toLowerCase();
85
85
  if (!head)
86
86
  return false;
87
+ const whole = String(result ?? '').toLowerCase();
87
88
  return (head.startsWith('error') ||
88
89
  head.startsWith('missing required argument') ||
89
90
  head.startsWith('failed') ||
90
- head.includes('command failed') ||
91
- head.includes('exit code') ||
91
+ // The run's OWN failure lines are anchored at the start of a line
92
+ // (`Exit code: N`, the `stdout:/stderr:` blocks follow). A phrase that
93
+ // merely APPEARS in the output (a log line, a diff, a test summary) is
94
+ // data, not a failure: a red ✖ on a successful call is just as wrong as a
95
+ // green ✔ on a refused one.
96
+ /^exit code\b/m.test(whole) ||
97
+ /^command failed\b/m.test(whole) ||
92
98
  // NOT every failure is a THROWN error: a PreToolUse hook, the permission
93
99
  // policy and the operator's denial BLOCK the call and return their message
94
100
  // as the result; an unknown tool and an aborted/timed-out run are reported
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.82.108",
3
+ "version": "2.82.110",
4
4
  "description": "Terminal coding agent that drives a real browser to chat with DeepSeek, Qwen and other web LLMs — no API key required. Reads and edits files, runs commands, commits to git, like Claude Code / Codex CLI.",
5
5
  "type": "module",
6
6
  "bin": {