@capagents/forgeqe 2.3.10 → 2.3.12

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.
@@ -182,7 +182,7 @@ Tools take structured arguments. `run_test_cases` and `find_test_cases` get a li
182
182
 
183
183
  **Permissions.** The agent's bash is allowed except `git push*`, `git * push*` (so `git -C . push` is caught too), and `gh repo delete*`, each also with a leading `*` so a push wrapped in another command (`env git push`, `sh -c 'git push'`) is caught; the agent runtime matches each command of a chain on its own and applies the last matching rule. These rules are guard rails, not a sandbox. `forgeqe_*` tools are allowed. `external_directory` allows only the run and memory folders. Tool calls to `forgeqe_*` are hidden from the `⚙` lines because their `ToolEvent`s already render richer output (browser steps, suite cards).
184
184
 
185
- **Callers.** The TUI opens the brain on the first message and keeps it for the session, so follow-up answers and "write a test for that run" have context; `/profile` (or Tab) closes it and keeps the turns so far: the next agent session's first prompt is `carryOver(turns, text)`, the last 20 turns with remembered secrets redacted, so switching models does not lose the conversation. It renders `card` events as result panels and `agent` events as `⚙` and test lines with their own token counter, and its `waitForUser` pushes the prompt into the transcript and opens a **Your turn** dialog (Done, continue / Cancel); opening another dialog or Esc settles it as cancelled. `forgeqe run` opens the brain for one request, prints tool events (cards as `cardText`) and the reply as plain lines, waits for Enter in `waitForUser` when stdin is a terminal, and exits 0 done, 1 failed, 2 stopped, 3 needs input. `forgeqe run --direct` and a missing agent runtime run `browser_run` directly. `forgeqe mcp` serves the same `TOOLS` on stdio and logs `ToolEvent`s to stderr; it has no `waitForUser`. `forgeqe start` and `forgeqe mcp` stop background monitors when they return, because `src/index.ts` calls `process.exit`.
185
+ **Callers.** The TUI opens the brain on the first message and keeps it for the session, so follow-up answers and "write a test for that run" have context; `/profile` (or Tab) closes it and keeps the turns so far: the next agent session's first prompt is `carryOver(turns, text)`, the last 20 turns with remembered secrets redacted, so switching models does not lose the conversation. It renders `card` events as result panels and `agent` events as `⚙` and test lines with their own token counter, and its `waitForUser` pushes the prompt into the transcript and opens a **Your turn** dialog (Done, continue / Cancel); opening another dialog or Esc settles it as cancelled. `forgeqe run` opens the brain for one request, prints tool events (cards as `cardText`) and the reply as plain lines, waits for Enter in `waitForUser` when stdin is a terminal, and exits 0 done, 1 failed, 2 stopped, 3 needs input. `forgeqe run --direct` and a missing agent runtime run `browser_run` directly. `forgeqe mcp` serves the same `TOOLS` on stdio and logs `ToolEvent`s to stderr; it has no `waitForUser`. `forgeqe chat --jsonl` (`src/chat/jsonl.ts`) is the TUI's agent for a program: like the TUI, it opens the brain on the first message, keeps it for every message, runs with `session: "shell"`, runs Tier 0 requests as recorded before asking the agent, and continues an earlier conversation with `carryOver` (`--carry-over FILE`, with its own reason sentence); like `forgeqe run`, it takes its flags (`repoFlag`, `memoryFlags`, …) and writes one session log; like `forgeqe mcp`, it is a machine interface, with stdout claimed for the protocol and every other print sent to stderr. It writes each `CodeEvent` and `ToolEvent` unchanged as a JSON line (`agent`, `tool`), turns `ask` and `waitForUser` into `ask` and `wait` lines answered on stdin, ends every turn with one `turn_done`, and passes every outgoing string through `redactSecrets` and the values of `privateEnvNames` and profile keys. The protocol is in HOW_TO_USE.md. `forgeqe start`, `forgeqe mcp`, and `forgeqe chat` stop background monitors when they return, because `src/index.ts` calls `process.exit`.
186
186
 
187
187
  ## Tool scope (`src/mcp/scope.ts`, `src/capabilities`)
188
188
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capagents/forgeqe",
3
- "version": "2.3.10",
3
+ "version": "2.3.12",
4
4
  "description": "ForgeQE: a browser agent CLI that runs goals and test cases in local Chrome or Chromium, or BrowserStack and TestMu AI/LambdaTest when configured, and turns passing runs into tests in your repo",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "repository": {
@@ -15,6 +15,7 @@ from __future__ import annotations
15
15
  import json
16
16
  import os
17
17
  import re
18
+ import shutil
18
19
  import subprocess
19
20
  import xml.etree.ElementTree as ET
20
21
  from pathlib import Path
@@ -303,7 +304,8 @@ def run_maestro(
303
304
  out_dir.mkdir(parents=True, exist_ok=True)
304
305
  junit = out_dir / "maestro-junit.xml"
305
306
  debug = out_dir / "maestro-debug"
306
- args = [*command, *(["--device", device] if device else []), "test", "--format", "junit", "--output", str(junit), "--debug-output", str(debug), *flows]
307
+ resolved = shutil.which(command[0]) or command[0]
308
+ args = [resolved, *command[1:], *(["--device", device] if device else []), "test", "--format", "junit", "--output", str(junit), "--debug-output", str(debug), *flows]
307
309
  try:
308
310
  proc = run(args, env=dict(env), capture_output=True, text=True, timeout=timeout, shell=False)
309
311
  except FileNotFoundError: