- Conducted Technical Hygiene, CI Matrix & Security Policy Parity Check (Pfad A).
- Hardened GitHub Actions CI workflow (
.github/workflows/tests.yml) with concurrency controls (cancel-in-progress: true) across Node.js matrix[18, 20, 22, 24]and multi-OS matrix (ubuntu-latest,windows-latest,macos-latest). - Updated
ellmos-module.v2.jsonboundary platforms to multi-OS["windows", "linux", "macos"]. - Enriched bilingual
SECURITY.mdwith direct umbrella security contactlukas@open-bricks.orgalongsidesecurity@ellmos.aiandsupport@lukasgeiger.com. - Expanded automated metadata test suite in
_tests/metadata.test.mjswith contract checks for internationalized README titles/badges, zero-egress offline runtime invariants, and manifest boundary integrity (11/11 passed). - Synchronized
llms.txtLast-checked: 2026-08-23timestamp. - Verified test suite parity across Node.js test runner (235 passed, 1 skipped, 100% green).
- Conducted Technical Hygiene, CI Matrix & Security Policy Parity Check (Pfad A).
- Hardened GitHub Actions CI workflow (
.github/workflows/tests.yml) with Node.js matrix[18, 20, 22, 24]across Ubuntu, Windows, and macOS withnpmcaching. - Enriched bilingual
SECURITY.mdwith explicit security contact points (security@ellmos.ai,support@lukasgeiger.com), direct GitHub Security Advisory links, and local-first execution guarantees. - Extended automated repository metadata & parity test suite in
_tests/metadata.test.mjsto validate CI workflow matrix and security policy integrity. - Synchronized
llms.txtDocs navigation andLast-checked: 2026-08-21timestamp. - Verified test suite parity across Node.js test runner (235 passed, 1 skipped, 100% green).
- Conducted Discoverability, README-Design, Badges, Test Status & Metadata Check (Pfad B).
- Synchronized Node.js, platform, PTY engine, and MIT license badges across
README.mdandREADME_de.md. - Added comprehensive Sibling Tools & Ecosystem Matrix in both English and German documentation linking
dev-bricks,ellmos-ai, andopen-brickstools (safe-start-for-codex,automizer-for-claude-desktop,DevCenter,CodeBox,CareCenter-for-Codex,automation-master,ellmos-filecommander-mcp,ellmos-codecommander-mcp,ellmos-controlcenter-mcp,ellmos-clatcher-mcp,n8n-manager-mcp,skills,open-bricks). - Synchronized
llms.txtrelated projects list andLast-checked: 2026-08-20timestamp. - Verified test suite parity across Node.js test runner (232 passed, 1 skipped, 100% green).
- Conducted Discoverability, README-Design, Badges & Pytest Status Check (Pfad B).
- Added interactive bilingual Mermaid system architecture and data flow diagrams illustrating the 5-phase PTY lifecycle state machine and dual output paths.
- Synchronized Node.js test suite status badge across documentation (232 passed, 1 skipped).
- Added dev-bricks ecosystem and open-bricks umbrella badges and sibling tool references (
DevCenter,CodeBox,MethodenAnalyser,CareCenter-for-Codex). - Added comprehensive repository metadata & manifest parity test suite in
_tests/metadata.test.mjs. - Synchronized
llms.txtLast-checked timestamp to2026-08-16.
- Added
--probe-colorto run the known-answer color probe and cache agy's response truecolor per platform/architecture;AGY_COMPANION_RESPONSE_RGBremains the explicit override. - Added
--streamfor progressive text output and JSONL chunk/result events. - Re-verified the ANSI-wrapped invalid-model catalog against agy 1.1.11 and added regression coverage for its six-model effort format.
- Conducted Discoverability, README Design & SEO Check (Pfad B).
- Updated canonical repository URLs in
llms.txt,README.md, andREADME_de.mdtoellmos-ai/companion-for-agy. - Integrated Shields.io Ecosystem (
ellmos-ai) and Umbrella (open-bricks) badges across English and German documentation. - Synchronized
llms.txtLast-checkedtimestamp to2026-08-04. - Verified Node.js test suite execution (220 passed, 1 skipped, 100% green).
- Live agy model discovery via
--list-models/--refresh-models, with a path/version-bound 24-hour cache. - Model-aware automatic effort selection and one pre-prompt retry when agy requires effort to be added or removed.
--no-effortto explicitly suppress automatic selection and--version/-Vfor machine-readable version checks.- JSON metadata for effective effort and the discovered model catalog.
--effort <low|medium|high>passthrough flag (mirrors agy's own flag). agy >= 1.1.x requires--effortfor some models (e.g.gemini-3.6-flash) and silently falls back to its default model otherwise — closing the Known Issue documented in 2.0.1.- Model-mismatch surfacing: whenever the model detected from agy's banner does not match
the requested
--model, the companion prints a localizedwarnModelMismatchwarning on stderr and setsmodelMismatch: truein--jsonoutput. - New regression tests:
--effortpassthrough, missing--add-dirrejection, and the add-dir working-directory behavior.
- The FIRST
--add-dirdirectory now becomes agy's working directory (previously agy always ran inside a throwaway temp workspace, so relative output paths silently landed in%TEMP%\agy-companion-<pid>\instead of the caller's directory — found in a real banner-generation run). AstatusWorkdirstatus line reports the effective directory; a missing--add-dirpath now fails fast witherrAddDirMissinginstead of running against a directory agy cannot use. - Help text: model list updated to the agy 1.1.x generation (
gemini-3.6-flash,gemini-3.5-flash,gemini-3.1-pro; the retiredgemini-1.5*/2.0*/3.5-proentries are gone),--effortdocumented, examples updated — in all six locales.
- Premature Ctrl+C during generation:
detectResponseComplete()treated the bare>that agy's bordered input box renders on every screen redraw — including while a response is still generating — as the "back to idle" signal, because the box border, spinner, and the accompanying "esc to cancel" status line were all classified as noise and never reset the candidate flag. Against the currently installed agy 1.1.5 UI, this made the wrapper send Ctrl+C and abort the live response within about 2.5s of sending the question on every run (confirmed via--debug: agy logged "Interrupted"). Fix: seeing "esc to cancel" after a candidate>now clears it, since that text only ever appears while agy is actively generating. Verified against a real authenticated agy session (previously reproducible failure, now a clean extracted response). Covered by two new regression tests in_tests/unit.test.mjs. package-lock.jsonhad drifted to1.4.2whilepackage.jsonalready read2.0.0; re-synced vianpm install.
- agy 1.1.5 now warns
--model gemini-3.5-flash requires --effort (available: low, medium, high). Using the default model instead.and silently falls back to its own default model whenever--modelis passed without a matching--effort. companion-for-agy does not yet pass--effort, so a non-default--modelrequest can silently not take effect. Tracked in ROADMAP → "Known Issues".
- Updated
llms.txtLast-checkedtimestamp to2026-07-26and re-verified Node.js test suite execution (209 passed, 1 skipped).
- Updated
llms.txtLast-checkedtimestamp to2026-07-25. - Added Node.js test badge (209 passing unit/fixture/hygiene tests) and LLM-Ready callout banner to
README.mdandREADME_de.md. - Verified repository hygiene, clean git status, and node test suite execution.
- Updated
llms.txtLast-checkedtimestamp to2026-07-22and added search phrases forv2.0.0native permission model (--sandbox,--skip-permissions) and ConPTY response capture. - Conducted discoverability audit and verified test suite execution.
- Permission model reduced to the three modes agy natively supports, so the companion's invocation mode and agy's own internal mode are always in sync:
- default (no flag): agy uses its own configuration — global
~/.gemini/antigravity-cli/settings.jsonplus per-project rules (allow/deny/ask). In headless-pmode a tool that is neither pre-allowed nor denied resolves to "ask" and blocks, so use--skip-permissionsfor tasks needing tools that are not pre-approved. --sandbox: shell and network blocked, filesystem limited to the workspace (writing files still works).--skip-permissions: auto-approve every tool (YOLO), full rights.
- default (no flag): agy uses its own configuration — global
- Soft permission modes
--no-tools,--researcher,--read-onlyand the custom-rule flags--allow/--deny. agy does not read per-invocation or workspace-local permission rules, so these had no enforceable effect (verified) — they only created a false sense of enforcement. - The per-invocation
<workspace>/.gemini/settings.jsonwriter (no-op: agy never adoptscwdas a project root) and the capability-preamble injection (unnecessary: agy is natively aware of its sandbox mode via its own<terminal_sandbox>system context). - Migration: replace
--no-tools/--researcher/--read-onlywith--sandbox(or the default mode); replace--allow/--denyby configuring agy's own global/project permission rules. Rationale and the (deliberately unshipped) per-invocation enforcement research are documented in ROADMAP → "Permission Model & Enforcement".
- Hardened repository hygiene for local npm credentials, token/recovery files, private keys and certificate bundles. Added a regression test that checks the effective Git ignore behavior and defensive npm ignore patterns.
- Orphan-process guard (module review 2026-07-04): on the SUCCESS path the wrapper exited without ever force-killing agy — if agy ignored Ctrl+C (hung tool call, ConPTY signal loss) it survived as an orphan on every automated call. The final-exit handler now kills the PTY right before exiting whenever agy is still alive; error-path timing is unchanged.
- Temp workspace and settings.json are created with restrictive permissions (0o700/0o600) — on shared /tmp multi-user POSIX hosts they were world-readable (no-op on Windows).
- agy-debug.log is written with mode 0o600 and both CLI (all 6 languages, new statusDebugLogSensitive) and READMEs now warn that it contains the full session incl. the prompt in clear text.
- --help in es/zh-Hans/ja/ru was missing the whole Workspace/--add-dir section that en/de already had (implemented since 1.4.0) — added.
- Replaced the SemVer and Go-duration regex parsers with bounded linear parsing to avoid pathological backtracking on malformed CLI output or timeout values.
--report-file <path>for diagnostic modes (--doctor,--platform-smoke,--pty-smoke,--live-smoke). It writes a pretty JSON report to disk while stdout remains text or JSON as requested, giving macOS/Linux handoff runs persistent evidence files.--platform-smokebundled pre-live platform gate plusnpm run platform-smoke/npm run platform-smoke:json. The report runs--doctorand the auth-free PTY smoke in one command, nests both reports, aggregates blockers/warnings, and prints the exact authenticated--live-smoke --no-model --debug --jsoncommand for Mac/Linux handoff.--live-smokeauthenticated agy marker smoke plusnpm run live-smoke/npm run live-smoke:json(scripts use--no-modelfor agy 1.0.x compatibility). The mode defaults tono-tools, asks agy to return exactlyAGY_LIVE_SMOKE_OK, emits a text or JSON report, and exits with code5on marker mismatch. This gives macOS/Linux transfer work a repeatable live gate after--doctorand--pty-smoke.- Packaged
--pty-smokeplatform smoke plusnpm run pty-smoke/npm run pty-smoke:json. The smoke verifies the installednode-ptytruecolor path without agy authentication, reports blockers/warnings as text or JSON, and gives macOS/Linux a repeatable pre-live-smoke gate before realagy --debugsessions.
- Update notifier: shows an "update available" hint when a newer published version exists. Runs only in an interactive terminal (
process.stdout.isTTY) — never in subprocess, pipe, CI or MCP usage, so machine integrations are unaffected. The check runs detached in the background. Implemented withupdate-notifier. - Linux-specific PTY smoke test
_tests/linux-pty-smoke.test.mjsplusnpm run test:linux-pty. The smoke spawns/bin/shthroughnode-pty, verifiesspawn-helperandpty.node, and checks thatRGB(232,234,237)truecolor extraction works on the real Linuxforkptypath without requiring agy authentication. - Startup fallback (graceful degradation): If
STARTUP_DONE_PATTERNSnever match withinSTARTUP_FALLBACK_MS(30 s), the tool no longer stalls until the global 120 s timeout and exits with error code 2. Instead, it logs a status message and proceeds to send the question anyway — same fallback path as the existing init-idle timer. The new constantSTARTUP_FALLBACK_MS = 30000is exported. Status messages added to all 6 locales (statusStartupFallback). Covered by unit tests.
- Added Best Practices: Two Return Paths section to README.md, README_de.md, and llms.txt. Documents that the stdout return path can garble non-ASCII/CJK content (observed on Windows) and recommends the file-output pattern via
--add-dirfor bulky or non-ASCII responses. Inbound task delivery and file output via--add-dirare reliable (tested on Windows, including CJK); stdout capture is the unreliable leg. Translated locales (es, ja, ru, zh-Hans) are tracked as TODO.
--add-dir <dir>workspace passthrough (repeatable). agy only writes files inside its own workspace; without this flag, file-write attempts outside the temp directory are silently ignored or falsely reported as successful.--add-dirregisters additional directories with agy's--add-dirflag so that writes there actually land. Pair with--skip-permissionsfor full write access, or with a matching--allow "write_file(...)"rule in sandbox mode.
- Sidebar Workspace Leak: When running under temporary workspaces (e.g.
agy-companion-<PID>), the Antigravity IDE automatically registers these temp directories as projects in.gemini/config/projects/<uuid>.json. They were never removed, leading to sidebar clutter. Added projects cleanup logic incleanupTemp()to find and delete its corresponding.jsonproject configuration file upon exit.
- Response-Idle-Timer: 1-byte trickle chunks could reset the idle timer indefinitely, making the global timeout the only backstop. The new
shouldResetIdleTimerpure function (exported for testability) only resets the timer when ≥10 bytes of new ANSI-stripped response content have arrived, or whendetectResponseCompletefires — whichever comes first. The constantRESPONSE_MIN_PROGRESS_BYTES = 10controls the threshold.
- detectResponseComplete: Mid-response bare
>(e.g. Markdown blockquotes, agy status lines) no longer triggers premature response-complete detection; the newfoundPromptCandidateapproach scans the full buffer and resets on real content after a candidate (ed1436d). - getMessage: Placeholder values containing
$&,$',$`or$nwere corrupted by JavaScript'sString.prototype.replacespecial-pattern expansion; replacement now uses the function form() => String(val)to prevent any substitution (5470404).
- CLI localization via
--lang <code>and locale auto-detection. - Supported CLI/documentation languages: English, German, Spanish, Simplified Chinese, Japanese, and Russian.
- New localization module
src/locales.mjs. - Translated README files:
README_de.md,README_es.md,README_zh-Hans.md,README_ja.md,README_ru.md. - German changelog:
CHANGELOG_de.md. - CLI regression tests for localized help and parsing errors.
- User-facing CLI strings are now read from locale maps instead of being hardcoded in
src/agy-companion.mjs. package.jsonnow includes all localized documentation files in the npm package.- Documentation now distinguishes CLI output localization, documentation translation, and agy TUI recognition patterns.
- Empty/non-extractable responses now exit nonzero instead of falling back to startup banner text or reporting success.
- Shutdown no longer force-kills the PTY when
Ctrl+Calready produced a clean exit, avoiding latenode-ptycleanup stacktraces in successful runs. researcherandread-onlypermission presets now denycommand(*)to prevent command-based writes.- Unknown CLI options now fail fast;
--can be used before prompts that start with a dash. - Response color can now be overridden via
AGY_COMPANION_RESPONSE_RGB. - German trust/startup patterns, signal cleanup, dead-code cleanup, and one-character prompt/answer handling are covered by tests.
- agy v1.0.x can be used by omitting the model flag via
--no-modelorAGY_COMPANION_NO_MODEL.
- Security: Stale temp workspace from crashed run with same PID could leak permissions to a new run; it is now cleaned on startup (
e8c5230). - Temp directory leak in sandbox/skip-permissions modes when no custom rules are set (
d406299). - Temp cleanup race on Windows: post-kill delay plus
rmSyncretries for CWD locks (41412d6). - ConPTY text extraction: stale cursor position, bold SGR false positive, and too-narrow deduplication scope (
c2194bb). isNoiseLinefalse positives for blockquotes (>) and lines containing the word "tokens" (f6a8e7b).
- Brand ASCII banner aligned to the left in READMEs.
- Switched image source to raw GitHub URLs to fix logo rendering on npmjs.com.
- Handled additional CLI tip noise (lines starting with
└) and "Verifying..." lines in the output parser.
- Package renamed to
companion-for-agyfor legal/trademark distancing via the "for" pattern. - Added "Unofficial" disclaimer to README and package description.
- Short responses (2 or fewer characters like "4", "42", "ja") were incorrectly filtered as noise.
- Prompt-echo bug in
--no-toolsmode: the permission prefix was returned as the response instead of the actual answer. - ConPTY space loss in prompt echo: whitespace-normalized matching now handles "Donotuse" versus "Do not use".
stripPromptEcho()for whitespace-tolerant prompt echo removal.extractResponse()accepts a fourth parameter,effectiveFilter, for full prompt echo stripping.- 5-phase state machine with a trust dialog auto-confirmation phase.
- Banner model detection: JSON reports the actual model from agy's banner.
- 26 new tests (107 total): short-answer extraction, prompt echo regression, and
stripPromptEchounit tests. companion-for-agyCLI alias alongsideagy-companionfor backward compatibility.
- Cross-platform support: Windows, macOS, Linux (
node-ptyhandles platform-specific PTYs). - Auto-detection of the agy binary via PATH, common install locations, and environment variable fallback.
node-ptyloaded as a standard npm dependency, without a hardcoded path to gemini-cli internals.- Debug log writes to
./agy-debug.loginstead of~/.claude/scripts/. - CLI messages and usage text in English for an international audience.
- Added English
INIT_DONE_PATTERNSalongside German ones. - Removed the
"os": ["win32"]restriction frompackage.json.
- Exported
findAgyPath()for programmatic agy detection. - Test suite: 81 tests (unit, fixture, smoke) via
node:test. npm run deployandnpm run syncscripts for local copy management.- Comprehensive README with installation, troubleshooting, and usage docs.
- ConPTY-based wrapper for agy (Antigravity CLI).
- ANSI-color-based response extraction (
RGB(232,234,237)). - Line-based noise-filter fallback.
- 4-phase state machine (startup, init, question, response).
- Adaptive timing: 10s during generation, 2.5s after completion.
- Permission system with 5 modes: sandbox, skip-permissions, no-tools, researcher, read-only.
- Custom allow/deny rules compatible with agy's
settings.jsonformat. - JSON output mode (
--json). - Configurable paths via environment variables.
- Prompt sanitization against PTY injection.
- Graceful shutdown.
- Debug mode with PTY output log.