diff options
| author | Agando <roduccomm@gmail.com> | 2026-10-29 12:53:41 +0100 |
|---|---|---|
| committer | Agando <roduccomm@gmail.com> | 2026-10-29 12:53:41 +0100 |
| commit | 6daf236b585dc47ad8ffe293cdefd5de8231c5d8 (patch) | |
| tree | df2f7c72def23f4664090689c3a9f54f28d5cb69 /modules/core | |
| parent | 1a27ba0e2ec736aa9b30c69a3aa2ee2ab86d0709 (diff) | |
feat(newos4): register `test` / `[` so chains decide locally instead of asking a model (v4.6.135)
`[ -f "/qt.txt" ] && echo exists` — the probe that closed the v4.6.132 batch — was not a shell test
at all: both commands were unregistered, so the line fell through to the AI fallback and a model was
asked whether a file exists. `_evalTest()` has implemented `-f -d -e -z -n ! = !=` for the if/while
parser since the script runner was written; only the command was missing.
* `test` and `[` registered in ShellModule. Success resolves silently; false rejects with a
`silent` error so `&&`/`||` skip it — POSIX prints nothing on exit 1.
* `[` requires the closing bracket (`[ : missing ']'`), and that message is NOT silent.
* `test` already names the on-demand regression-suite runner ("test auto" / "test list" in
help.html). A argv that does not look like a test expression (`-f`/`-d`/`-e`/`-z`/`-n`/`!`,
or `a = b` / `a != b`) is delegated to the handler registered before us, so `test auto`
still runs the suite and the two meanings cannot collide.
* terminal.dispatchCommand() now honours `err.silent` — without it a top-level `test -f /nope`
printed `Error in ShellModule.test:` (measured on v4.6.134, fixed in v4.6.135).
* help.html documents the bracket form next to the existing `test` row.
Three tags were minted minutes apart — v4.6.133 (commands), v4.6.134 (suite delegation),
v4.6.135 (silent top-level) — each a real cache-bust for a fix that superseded the previous build;
the net change is this commit.
Verification
node modules/test/test-shell-test-cmd.js -> 24/24 pass (RED against HEAD: "test command
registered" fails, "m.commands.test is not a function")
node modules/test/test-pipe-guard.js -> all seven flags true
node modules/test/test-parse-args.js -> 28/28 · daily job -> node tests 22/22 pass
newos4-maintain.py -> atlas 355 commands (was 354), modules-index 349, help 364/364
live v4.6.135, read from the terminal DOM:
[ -f /qt.txt ] && echo F135 -> F135
test -f /nope || echo M135 -> M135
[ -d /nope ] && echo BAD || echo N134-> N134 (false branch skipped, nothing printed)
test -> no output (suite not loaded; POSIX false)
test -f /nope -> no output
js "a b".length | wc -c -> 1 (v4.6.132 pipe fix still intact)
The AI fallback is no longer reachable for a bracketed file test.
Diffstat (limited to 'modules/core')
| -rw-r--r-- | modules/core/core-bundle.js | 3 | ||||
| -rw-r--r-- | modules/core/module-loader.js | 2 | ||||
| -rw-r--r-- | modules/core/terminal.js | 3 |
3 files changed, 7 insertions, 1 deletions
diff --git a/modules/core/core-bundle.js b/modules/core/core-bundle.js index b070e65..07609e3 100644 --- a/modules/core/core-bundle.js +++ b/modules/core/core-bundle.js @@ -4553,6 +4553,9 @@ Only output XML function calls for tool tasks. If no tool is needed, answer norm } return; } catch (err) { + // v4.6.134: `silent` errors are control flow, not failures — `test`/`[` + // reject to tell `&&`/`||` to skip, and must print nothing (POSIX). + if (err && err.silent) return; this.print(`Error in ${modName}.${cmd}: ${err.message}`, 'error'); console.error(`[Terminal] Error in ${modName}.${cmd}:`, err); return; diff --git a/modules/core/module-loader.js b/modules/core/module-loader.js index 0d39123..52cee36 100644 --- a/modules/core/module-loader.js +++ b/modules/core/module-loader.js @@ -4,7 +4,7 @@ // Core module bundle loaded synchronously in main.html. // This loader only handles version cache-busting, splash, terminal init, and optional ext modules. - const LATEST_VER = 'v4.6.132'; + const LATEST_VER = 'v4.6.135'; const CACHE = '?v=' + LATEST_VER; // Exposed so ext modules can register their own URL with the same cache-busting version // instead of an unversioned path the browser may already have cached (shell.js did). diff --git a/modules/core/terminal.js b/modules/core/terminal.js index 4122b3c..ca6bb61 100644 --- a/modules/core/terminal.js +++ b/modules/core/terminal.js @@ -1961,6 +1961,9 @@ } return; } catch (err) { + // v4.6.134: `silent` errors are control flow, not failures — `test`/`[` + // reject to tell `&&`/`||` to skip, and must print nothing (POSIX). + if (err && err.silent) return; this.print(`Error in ${modName}.${cmd}: ${err.message}`, 'error'); console.error(`[Terminal] Error in ${modName}.${cmd}:`, err); return; |