diff --git a/.vibecrafted/GUIDELINES.md b/.vibecrafted/GUIDELINES.md index ead7e76..191898b 100644 --- a/.vibecrafted/GUIDELINES.md +++ b/.vibecrafted/GUIDELINES.md @@ -1,4 +1,4 @@ -# Vibecrafted Operator Workspace — VetCoders GUIDELINES +# Vibecrafted Operator Workspace — Vetcoders GUIDELINES > Per-workspace, agent-agnostic instructions for `operator/`. Same rules for > Claude, Codex, Gemini, Junie, and Qwen. Global doctrine still applies; this @@ -6,7 +6,7 @@ ## Identity -- **Workspace:** standalone `VetCoders/vc-operator` checkout. +- **Workspace:** standalone `vetcoders/vc-operator` checkout. - **Role:** consolidated operator platform workspace for `mux-agent`, `tui-agent`, `tray-agent`, and `shell-agent`. - **Crate names:** keep existing distribution names stable. `mux-agent/` @@ -41,7 +41,7 @@ This workspace is a shared live tree. Concurrent edits are expected. - If a concurrent edit conflicts with the T0 contract, preserve evidence, reconcile the file, and report exactly what happened. - `.vibecrafted/{plans,reports}` are daily symlinks into - `$VIBECRAFTED_HOME/artifacts/VetCoders/vibecrafted-operator//`. + `$VIBECRAFTED_HOME/artifacts/vetcoders/vibecrafted-operator//`. Date-rotation drift is not product code. ## Wizard / Config Doctrine @@ -86,7 +86,7 @@ Forbidden: vendor footers, personal signatures, and Use the canonical brand line only when a sigblock is needed: ```text -𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by VetCoders (c)2024-2026 LibraxisAI +𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by Vetcoders (c)2024-2026 ``` ## Anti-Patterns Repo-Specific @@ -102,4 +102,4 @@ Use the canonical brand line only when a sigblock is needed: --- -_𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by VetCoders (c)2024-2026 LibraxisAI_ +_𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by Vetcoders (c)2024-2026_ diff --git a/Cargo.toml b/Cargo.toml index a7cd999..1cee8f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ members = [ [workspace.package] version = "0.1.0" edition = "2024" -authors = ["VetCoders "] +authors = ["Vetcoders "] license = "MIT OR Apache-2.0" [workspace.dependencies] diff --git a/LICENSE b/LICENSE index 8134927..62bb1f2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2026 Szowesgad +Copyright (c) 2026 Vetcoders Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/docs/plans/PLAN_22_NEXT_OPERATOR_MISSION_CONTROL.md b/docs/plans/PLAN_22_NEXT_OPERATOR_MISSION_CONTROL.md index 6cfb996..90635ff 100644 --- a/docs/plans/PLAN_22_NEXT_OPERATOR_MISSION_CONTROL.md +++ b/docs/plans/PLAN_22_NEXT_OPERATOR_MISSION_CONTROL.md @@ -1,6 +1,6 @@ # VC Operator 22-Next: Mission Control From Shell To Product -- Repo: `/Users/maciejgad/vc-workspace/VetCoders/vc-operator` +- Repo: `~/vc-operator` - Branch: `main` - Baseline commit: `a2a0a51` - Generated: `2026-05-12` @@ -19,7 +19,7 @@ The first product promise is intentionally narrow: > failed, and what the next useful action is. This repo should not become a generic dashboard framework. It should expose -runtime truth for the VetCoders agent workflow. +runtime truth for the Vetcoders agent workflow. ## Current Truth diff --git a/mux-agent/AI_README.md b/mux-agent/AI_README.md index fed60b0..e70f6e4 100644 --- a/mux-agent/AI_README.md +++ b/mux-agent/AI_README.md @@ -205,7 +205,7 @@ Navigation: `Up/Down` choose, `Space` toggle, `Enter` / `n` next step, `p` previ Source of truth is **client configs**, not running processes. ps-scan is used as enrichment to stamp PIDs and surface running orphans, never as the discovery driver. -Detail: `docs/WIZARD.md`, `docs/vc-agents-client-discovery-plan.md`. +Detail: `docs/WIZARD.md`. ## Status Snapshots diff --git a/mux-agent/CHANGELOG.md b/mux-agent/CHANGELOG.md index c3fb9f9..c795012 100644 --- a/mux-agent/CHANGELOG.md +++ b/mux-agent/CHANGELOG.md @@ -142,26 +142,26 @@ args.contains("rust-mux")` was a copy/paste; the second clause now ### Changed - **Rebranded: `rmcp_mux` → `rust-mux`.** Crate name hyphenated on crates.io per convention; module path `rust_mux`. Binary `rmcp_mux_proxy` → `rust_mux_proxy`. All internal imports `use rmcp_mux::` → `use rust_mux::`. User-facing `RMCP_MUX_*` environment variables preserved for backward compatibility. -- **Moved to Loctree org:** `https://github.com/VetCoders/rust-mux` → `https://github.com/Loctree/rust-mux`. +- **Moved to Loctree org:** `https://github.com/vetcoders/rust-mux` → `https://github.com/Loctree/rust-mux`. ### Added -- Package metadata: `description`, `repository`, `homepage`, `documentation`, `readme`, `keywords`, `categories`, `license = "MIT OR Apache-2.0"`, and `authors = ["Maciej Gad ", "Monika Szymanska "]` in `Cargo.toml` for proper crates.io listing and discovery. +- Package metadata: `description`, `repository`, `homepage`, `documentation`, `readme`, `keywords`, `categories`, `license = "MIT OR Apache-2.0"`, and `authors = ["Vetcoders "]` in `Cargo.toml` for proper crates.io listing and discovery. ## 0.2.0 - 2025-11-24 ### Added -- Optional tray icon (`--tray`) showing live server status, client and pending counts, and restart reasons. ([5eefde4](https://github.com/LibraxisAI/rust_mux/commit/5eefde4)) -- Config file support (JSON/YAML/TOML) with auto-detection and CLI overrides. ([5eefde4](https://github.com/LibraxisAI/rust_mux/commit/5eefde4)) -- `rust-mux-proxy` helper binary plus launchd template and installer tweaks for easier setup. ([04e5402](https://github.com/LibraxisAI/rust_mux/commit/04e5402)) -- GitHub Actions CI workflow for formatting, linting, testing, and coverage, including an async proxy forwarding test. ([ad2b9aa](https://github.com/LibraxisAI/rust_mux/commit/ad2b9aa)) -- Mux hooks, Semgrep rules, and expanded README documentation. ([e80083c](https://github.com/LibraxisAI/rust_mux/commit/e80083c)) +- Optional tray icon (`--tray`) showing live server status, client and pending counts, and restart reasons. ([5eefde4](https://github.com/Loctree/rust-mux/commit/5eefde4)) +- Config file support (JSON/YAML/TOML) with auto-detection and CLI overrides. ([5eefde4](https://github.com/Loctree/rust-mux/commit/5eefde4)) +- `rust-mux-proxy` helper binary plus launchd template and installer tweaks for easier setup. ([04e5402](https://github.com/Loctree/rust-mux/commit/04e5402)) +- GitHub Actions CI workflow for formatting, linting, testing, and coverage, including an async proxy forwarding test. ([ad2b9aa](https://github.com/Loctree/rust-mux/commit/ad2b9aa)) +- Mux hooks, Semgrep rules, and expanded README documentation. ([e80083c](https://github.com/Loctree/rust-mux/commit/e80083c)) - `health` subcommand to resolve config and assert socket reachability, plus unit tests for healthy/missing sockets. ### Changed -- Refactored mux state management and tray functionality into dedicated `state` and `tray` modules, with tray dependencies gated behind an optional `tray` feature; CI updated to run with `--no-default-features`. ([0d60764](https://github.com/LibraxisAI/rust_mux/commit/0d60764), [ad2b9aa](https://github.com/LibraxisAI/rust_mux/commit/ad2b9aa)) +- Refactored mux state management and tray functionality into dedicated `state` and `tray` modules, with tray dependencies gated behind an optional `tray` feature; CI updated to run with `--no-default-features`. ([0d60764](https://github.com/Loctree/rust-mux/commit/0d60764), [ad2b9aa](https://github.com/Loctree/rust-mux/commit/ad2b9aa)) ## 0.1.5 diff --git a/mux-agent/Cargo.toml b/mux-agent/Cargo.toml index 563bf36..0b8aa7d 100644 --- a/mux-agent/Cargo.toml +++ b/mux-agent/Cargo.toml @@ -2,7 +2,7 @@ name = "rust-mux" version = "0.4.0" edition.workspace = true -authors = ["Maciej Gad ", "Monika Szymanska "] +authors = ["Vetcoders "] description = "Transport multiplexer for Rust MCP servers — tray, proxy, and runtime supervisor" license.workspace = true repository = "https://github.com/Loctree/rust-mux" diff --git a/mux-agent/LICENSE b/mux-agent/LICENSE index 82686a4..02238f6 100644 --- a/mux-agent/LICENSE +++ b/mux-agent/LICENSE @@ -3,25 +3,25 @@ License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved. Parameters -Licensor: VetCoders (Maciej Gad & Monika Szymanska) +Licensor: Vetcoders Licensed Work: Rust Multiplexer - The Connectivity Driver for Intentions Engine. - The Licensed Work is (c) 2024-2026 VetCoders. + The Licensed Work is (c) 2024-2026 Vetcoders. Additional Use Grant: You may make production use of the Licensed Work, provided Your use does not include offering the Licensed Work to third parties on a hosted or embedded - basis in order to compete with VetCoders' paid + basis in order to compete with Vetcoders' paid version(s) of the Licensed Work. For purposes of this license: A "competitive offering" is a Product that is offered to third parties on a paid basis, including through paid support arrangements, that significantly overlaps - with the capabilities of VetCoders' paid version(s) of + with the capabilities of Vetcoders' paid version(s) of the Licensed Work. If Your Product is not a competitive offering when You first make it generally available, it will not become a competitive offering later due to - VetCoders releasing a new version of the Licensed Work + Vetcoders releasing a new version of the Licensed Work with additional capabilities. In addition, Products that are not provided on a paid basis are not competitive. @@ -49,7 +49,7 @@ Change Date: 2030-03-24 Change License: Apache License, Version 2.0 For information about alternative licensing arrangements for the Licensed -Work, please contact void@div0.space. +Work, please contact hello@vetcoders.io. Notice diff --git a/mux-agent/README.md b/mux-agent/README.md index ffc50a3..29162a5 100644 --- a/mux-agent/README.md +++ b/mux-agent/README.md @@ -126,7 +126,7 @@ lazy_start = true socket = "~/.rmcp-servers/sockets/rmcp-memex.sock" cmd = "/path/to/rmcp-memex" args = ["serve", "--config", "config.toml", "--db-path", "~/.ai-memories/lancedb"] -env = { SLED_PATH = "~/.rmcp-servers/sled/memex" } +env = { SLED_PATH = "~/.rmcp-servers/sled/db" } max_request_bytes = 1048576 request_timeout_ms = 30000 restart_backoff_ms = 1000 diff --git a/mux-agent/docs/WIZARD.md b/mux-agent/docs/WIZARD.md index 96ff7f8..09f22f0 100644 --- a/mux-agent/docs/WIZARD.md +++ b/mux-agent/docs/WIZARD.md @@ -84,7 +84,7 @@ automatically. │ [x] brave-search │ │ Total entries : 15 │ │ [x] loctree-mcp │ │ Unique names : 9 │ │ [x] context7 │ │ Sources scanned: 3 │ -│ [x] memex │ │ │ +│ [x] rmcp-memex │ │ │ │ ─ codex │ │ Keys │ │ [x] playwright │ │ Up/Down navigate │ │ [x] chrome-devtools (pid 21470) │ │ Space toggle │ @@ -308,11 +308,9 @@ and ignored by the 5-step flow. ## See also - `docs/integration.md` — library use of `MuxConfig` / `spawn_mux_server`. -- `docs/vc-agents-client-discovery-plan.md` — original plan for the - multi-client discovery layer this wizard now consumes. - `AGENTS.md` — repo-wide doctrine, including the wizard's Unified / Per-client / Auto-rewire split. --- -_𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by VetCoders (c)2024-2026 LibraxisAI_ +_𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by Vetcoders (c)2024-2026_ diff --git a/mux-agent/docs/dev/guidelines.md b/mux-agent/docs/dev/guidelines.md index aa71f10..06c8de2 100644 --- a/mux-agent/docs/dev/guidelines.md +++ b/mux-agent/docs/dev/guidelines.md @@ -70,7 +70,7 @@ error messages or tests. ### 1.3. Building the binaries -All builds are driven through Cargo. From the project root (`/Users/maciejgad/.rmcp_servers/rmcp-mux` in the current +All builds are driven through Cargo. From the project root (`~/.rmcp_servers/rmcp-mux` in the current setup): #### 1.3.1. Debug build (fast, for development) diff --git a/mux-agent/docs/vc-agents-client-discovery-plan.md b/mux-agent/docs/vc-agents-client-discovery-plan.md deleted file mode 100644 index 72ee75c..0000000 --- a/mux-agent/docs/vc-agents-client-discovery-plan.md +++ /dev/null @@ -1,183 +0,0 @@ ---- -run_id: rust-mux-client-discovery-config-generation -skill: vc-agents -project: rust-mux -status: pending -loops_completed: 0 ---- - -# Task: rust-mux MCP client discovery and config generation - -You are working on a living tree. Concurrent changes are expected. Adapt proactively and continue, but do not skip quality, security, or test gates. - -## Product intent - -`rust-mux` is a daemon/proxy for keeping one MCP server process alive and sharing it between many MCP clients through a socket/proxy transport. The current client discovery defaults are stale after the `rmcp_mux` → `rust-mux` rebrand and after real CLI verification. - -Implement a client discovery and setup flow that stops pretending all MCP clients use one universal config model. The wizard must offer two explicit paths: - -1. Safe default: discover real MCP servers from known client configs, generate mux-owned configs under `~/.config/mux`, and print exact per-client usage instructions. Do not modify existing client configs. -2. `[DANGER] Automatically configure my clients`: after discovery, offer a backup-first and preview-first rewrite of known MCP server blocks in existing client configs so they point to `rust-mux-proxy` instead of directly starting upstream MCP servers. - -## Required real-world defaults - -Correct the discovery defaults according to observed local CLI behavior and current research: - -- Claude: - - `~/.claude.json` for Claude Code / global config. - - `~/Library/Application Support/Claude/claude_desktop_config.json` for Claude Desktop on macOS. - - Claude supports `--mcp-config ` and `--strict-mcp-config`. - - Recommended safe usage: `claude --strict-mcp-config --mcp-config "$HOME/.config/mux/mcp.json"`. -- Codex: - - Prefer `codex mcp list --json` / `codex mcp get --json` if useful and robust. - - File fallback: `~/.codex/config.toml`. - - `-c/--config` is a key-value override, not a config-file flag. Do not document fake `codex --config ~/.config/mux/mcp.toml` behavior. - - Codex TOML shape is expected around `[mcp_servers.]`. -- Junie: - - `~/.junie/mcp/mcp.json` high-confidence. - - `~/.agents/mcp.json` and `~/.ai/mcp.json` as generic medium-confidence agent config paths. - - Junie supports `--mcp-location` and `--mcp-default-locations`. - - Recommended safe usage: `junie --mcp-location "$HOME/.config/mux/mcp.json"`. -- Gemini: - - `~/.gemini/settings.json` if it contains MCP server config. - - Gemini exposes `gemini mcp list/add/remove/enable/disable`. - - No observed Claude-style strict config flag. Prefer generated instructions/commands or danger rewrite. -- Custom files: - - Support user-provided JSON/TOML paths. - - JSON with `mcpServers`. - - JSON with `servers` only when shape is clearly MCP-like. - - TOML with `mcp_servers`. - -## Architecture requirements - -- Represent discovery per client/config source with explicit metadata: - - client kind - - source path or CLI source - - config format - - confidence - - whether writable / eligible for danger rewrite - - discovered servers -- Represent each server with: - - name - - command - - args - - env - - source client/path - - enabled status if known -- Deduplicate identical servers by normalized `(name, command, args, env)`. -- Do not silently overwrite conflicts where the same server name has different command/args/env. Surface conflict and either keep both with deterministic suffixes or require explicit choice. - -## Safe path requirements - -Generate mux-owned files under `~/.config/mux`: - -- `~/.config/mux/config.toml` — daemon/upstream truth for `rust-mux`, containing original upstream commands. -- `~/.config/mux/mcp.json` — client-facing JSON config where each server command is `rust-mux-proxy`. -- `~/.config/mux/mcp.toml` — client-facing TOML config for TOML-style clients / manual Codex merge. - -The generated client-facing configs must point clients at `rust-mux-proxy`, not at upstream MCP servers directly. - -After generation, print concise instructions: - -- how to start `rust-mux` with generated daemon config; -- Claude strict-mode command; -- Junie `--mcp-location` command; -- Codex note that there is no verified strict config-file flag in this environment, plus generated `codex mcp add ...` or manual TOML merge instructions; -- Gemini note using `gemini mcp` commands or danger rewrite. - -## Danger path requirements - -`[DANGER] Automatically configure my clients` must be explicit, backup-first, preview-first, and tested. - -Required behavior: - -- Show scary confirmation text. -- Show dry-run preview of every file and server block to be changed. -- Require explicit confirmation before write. -- Create timestamped backup next to every modified file before mutation. -- Preserve unrelated config keys/tables. -- Modify only selected MCP server blocks. -- If parsing fails, do not modify that file. -- Print rollback commands using the exact backup paths. - -JSON rules: - -- Preserve unknown top-level keys. -- Modify only `mcpServers` or clearly supported `servers` entries. - -TOML rules: - -- Preserve unrelated tables as much as the current TOML library allows. -- If comments cannot be preserved, state that in preview and rely on backup. - -## Tests required - -Add tests proportional to implementation: - -- discover Claude JSON `mcpServers`; -- discover Codex TOML `[mcp_servers.*]`; -- discover Junie JSON config; -- discover generic/custom JSON and TOML; -- Gemini parser only if the actual settings shape is confidently known; otherwise keep it conservative and test generic JSON import; -- deduplicate identical servers; -- detect conflicting server names; -- write mux daemon config + client JSON + client TOML into temp dir; -- danger rewrite creates backup before JSON mutation; -- danger rewrite creates backup before TOML mutation; -- invalid config is not modified. - -Do not require real local user configs in normal CI. Any local-config test must be ignored/optional and read-only. - -## Docs required - -Update `docs/WIZARD.md` and `README.md` if needed: - -- explain the safe default path step by step; -- explain the danger path, backups, rollback, and dry-run; -- document custom imports; -- document per-client commands and limitations; -- include troubleshooting for duplicate names, invalid config, original servers still starting, socket unavailable, and env/secrets handling. - -## Constraints - -- No `#[allow(...)]` suppressions. -- No `// nosemgrep` suppressions. -- No `--no-verify`. -- Do not delete user files. -- Do not rewrite unrelated config content. -- Do not invent unsupported CLI flags. -- Follow existing Rust style and architecture. - -## Acceptance - -- Discovery defaults reflect real Claude, Codex, Junie, Gemini and generic config locations above. -- Wizard offers safe generation and `[DANGER]` automatic client configuration as separate choices. -- Safe path writes mux-owned configs under `~/.config/mux` and does not mutate existing client configs. -- Danger path is backup-first, preview-first, explicit-confirmation-only, and rollback-friendly. -- Tests cover parser/generation/rewrite behavior without relying on local user config. -- Documentation gives exact setup and monitoring guidance. -- Gates pass: - - `cargo fmt -- --check` - - `cargo clippy --all-targets --all-features -- -D warnings` - - `cargo test --all-targets --all-features` - - `make test-full` if available and environment has optional dependencies. - -## Agent roles - -Claude: - -- Audit real-world MCP client config formats and danger-path risks. -- Verify assumptions before changing code. -- Focus on edge cases, data loss risks, rollback quality, and docs truthfulness. - -Gemini: - -- Challenge and simplify the UX/architecture. -- Identify overengineering, unsafe magic, and better command-generation alternatives. -- Keep user flow understandable. - -Codex: - -- Implement the final design after incorporating findings. -- Prioritize exact parser/generator/rewrite code and tests. -- Keep gates green. diff --git a/mux-agent/src/runtime/heartbeat.rs b/mux-agent/src/runtime/heartbeat.rs index 181c27c..b613155 100644 --- a/mux-agent/src/runtime/heartbeat.rs +++ b/mux-agent/src/runtime/heartbeat.rs @@ -4,8 +4,7 @@ //! It periodically sends lightweight ping probes and tracks response times, //! triggering server restarts when the backend becomes unresponsive. //! -//! Created by M&K (c)2025 The LibraxisAI Team -//! Co-Authored-By: [Maciej](void@div0.space) & [Klaudiusz](the1st@whoai.am) +//! Created by Vetcoders (c)2025 use std::sync::Arc; use std::time::{Duration, Instant}; diff --git a/mux-agent/src/scan.rs b/mux-agent/src/scan.rs index 082f204..3c128f8 100644 --- a/mux-agent/src/scan.rs +++ b/mux-agent/src/scan.rs @@ -568,7 +568,7 @@ impl DiscoveredMcp { pub fn discover_vibecrafted_mcp() -> Option { discover_vibecrafted_mcp_with( - &expand_path("~/Libraxis/vibecrafted/vibecrafted-mcp"), + &expand_path("~/vibecrafted/vibecrafted-mcp"), vibecrafted_mcp_pip_show, ) } diff --git a/mux-agent/tools/launchd/rust-mux.sample.plist b/mux-agent/tools/launchd/rust-mux.sample.plist index a6f7603..e4a85c7 100644 --- a/mux-agent/tools/launchd/rust-mux.sample.plist +++ b/mux-agent/tools/launchd/rust-mux.sample.plist @@ -3,7 +3,7 @@ Label - com.libraxis.mcp-mux.general-memory + com.vetcoders.mcp-mux.general-memory ProgramArguments diff --git a/shell-agent/Makefile b/shell-agent/Makefile index d7ea5c2..e97574e 100644 --- a/shell-agent/Makefile +++ b/shell-agent/Makefile @@ -1,5 +1,5 @@ # shell-agent - UniFFI bridge + SwiftUI app -# Created by VetCoders (c)2026 LibraxisAI +# Created by Vetcoders (c)2026 export MACOSX_DEPLOYMENT_TARGET ?= 14.0 @@ -36,7 +36,7 @@ dmg: @./scripts/build-dmg.sh dmg-signed: - @SIGNING_IDENTITY="Developer ID Application: Maciej Gad (MW223P3NPX)" ./scripts/build-dmg.sh + @SIGNING_IDENTITY="Developer ID Application: Your Name (TEAMID)" ./scripts/build-dmg.sh app-debug: bindings xcode @cargo build --workspace --release diff --git a/shell-agent/app/Vibecrafted/Views/CanvasViewController.swift b/shell-agent/app/Vibecrafted/Views/CanvasViewController.swift index 3e272f7..db0a5a9 100644 --- a/shell-agent/app/Vibecrafted/Views/CanvasViewController.swift +++ b/shell-agent/app/Vibecrafted/Views/CanvasViewController.swift @@ -1,5 +1,5 @@ // Vibecrafted — Canvas View (Routing Matrix / Log Tail) -// Created by VetCoders +// Created by Vetcoders import AppKit diff --git a/shell-agent/app/Vibecrafted/Views/InspectorViewController.swift b/shell-agent/app/Vibecrafted/Views/InspectorViewController.swift index 6758448..7bdf06d 100644 --- a/shell-agent/app/Vibecrafted/Views/InspectorViewController.swift +++ b/shell-agent/app/Vibecrafted/Views/InspectorViewController.swift @@ -1,5 +1,5 @@ // Vibecrafted — Inspector -// Created by VetCoders +// Created by Vetcoders import AppKit diff --git a/shell-agent/app/Vibecrafted/Views/MainSplitViewController.swift b/shell-agent/app/Vibecrafted/Views/MainSplitViewController.swift index d512fc2..c17e79f 100644 --- a/shell-agent/app/Vibecrafted/Views/MainSplitViewController.swift +++ b/shell-agent/app/Vibecrafted/Views/MainSplitViewController.swift @@ -1,5 +1,5 @@ // Vibecrafted — Main Split View -// Created by VetCoders +// Created by Vetcoders import AppKit diff --git a/shell-agent/app/Vibecrafted/Views/MainWindowController.swift b/shell-agent/app/Vibecrafted/Views/MainWindowController.swift index 75826fe..ec69b6b 100644 --- a/shell-agent/app/Vibecrafted/Views/MainWindowController.swift +++ b/shell-agent/app/Vibecrafted/Views/MainWindowController.swift @@ -1,5 +1,5 @@ // Vibecrafted — Main Window Controller -// Created by VetCoders +// Created by Vetcoders import AppKit diff --git a/shell-agent/app/Vibecrafted/Views/SidebarViewController.swift b/shell-agent/app/Vibecrafted/Views/SidebarViewController.swift index 50a4f8d..4cd6075 100644 --- a/shell-agent/app/Vibecrafted/Views/SidebarViewController.swift +++ b/shell-agent/app/Vibecrafted/Views/SidebarViewController.swift @@ -1,5 +1,5 @@ // Vibecrafted — Sidebar -// Created by VetCoders +// Created by Vetcoders import AppKit diff --git a/tray-agent/src/handlers.rs b/tray-agent/src/handlers.rs index f01b943..0108c07 100644 --- a/tray-agent/src/handlers.rs +++ b/tray-agent/src/handlers.rs @@ -93,7 +93,7 @@ pub fn handle_menu_event(event_id: &MenuId, menu_ids: &MenuIds, socket_path: &Pa Some(MenuRoute::Help) => { send_menu_event(TrayMenuEvent::OpenHelp); let _ = Command::new("open") - .arg("https://github.com/VetCoders/vibecrafted#readme") + .arg("https://github.com/vetcoders/vibecrafted#readme") .spawn(); } Some(MenuRoute::About) => { @@ -214,12 +214,12 @@ mod tests { help: MenuId::new("help"), about: MenuId::new("about"), quit: MenuId::new("quit"), - restart_services: vec![("memex".to_string(), MenuId::new("restart-memex"))], + restart_services: vec![("example".to_string(), MenuId::new("restart-example"))], verify_clients: vec![(ClientKind::Claude, MenuId::new("verify-claude"))], }; assert_eq!( - resolve_menu_route(&MenuId::new("restart-memex"), &ids), - Some(MenuRoute::RestartService("memex".to_string())) + resolve_menu_route(&MenuId::new("restart-example"), &ids), + Some(MenuRoute::RestartService("example".to_string())) ); assert_eq!( resolve_menu_route(&MenuId::new("verify-claude"), &ids), diff --git a/tui-agent/.gitignore b/tui-agent/.gitignore index 06d4476..1389d6b 100644 --- a/tui-agent/.gitignore +++ b/tui-agent/.gitignore @@ -21,5 +21,3 @@ target/ .vibecrafted/ /.loctree /audits/* -!/audits/historical/ -!/audits/historical/*.md diff --git a/tui-agent/Cargo.toml b/tui-agent/Cargo.toml index c677d67..bd4feb2 100644 --- a/tui-agent/Cargo.toml +++ b/tui-agent/Cargo.toml @@ -7,7 +7,7 @@ authors.workspace = true description = "Rust operator console for Vibecrafted" readme = "README.md" homepage = "https://vibecrafted.io" -repository = "https://github.com/VetCoders/vc-operator" +repository = "https://github.com/vetcoders/vc-operator" documentation = "https://docs.rs/vibecrafted-operator" [dependencies] diff --git a/tui-agent/LICENSE b/tui-agent/LICENSE index 8134927..62bb1f2 100644 --- a/tui-agent/LICENSE +++ b/tui-agent/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2026 Szowesgad +Copyright (c) 2026 Vetcoders Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/tui-agent/audits/historical/2026-04-19_next-steps-agnostic.md b/tui-agent/audits/historical/2026-04-19_next-steps-agnostic.md deleted file mode 100644 index 5f09a60..0000000 --- a/tui-agent/audits/historical/2026-04-19_next-steps-agnostic.md +++ /dev/null @@ -1,44 +0,0 @@ -# Operator TUI: 10-Point Natural Next Steps (Terminal-Agnostic — COMPLETED 2026-04-30, hardened P.M.) - -> **Status: 10/10 done + readiness contract hardened.** Ten terminal-agnostic -> plan został zrealizowany przez codex 2026-04-29 w commitach `8bc04a9` -> (queue scope + archive controls), `1d55925` (launch env + failure feedback), -> `3a3bfbd` (prompt artifact + clipboard ux), następnie domknięty przez stable -> zellij session naming (`8930d05`) i named-session readiness probe 2026-04-30. -> 2026-04-30 P.M. dokleciony przez claude: probe `--config-dir` parity, probe -> error preservation, hard timeout z child kill, fake-zellij e2e coverage -> (P1-01 / P2-01 / P2-02 / P2-03 z `2026-04-30_vc-review.md`). Plus rust-mux -> MCP daemon visibility w Monitor tabie + `MuxHealth` deep action. Zachowany -> jako historical evidence trail per `vc-intents` 2026-04-29 i 2026-04-30. - -Ten plan traktuje `operator-tui` jako niezależne, samodzielne narzędzie, które żyje wewnątrz dowolnego obecnie używanego emulatora terminala (Ghostty, Alacritty, iTerm2, WezTerm). Skupia się na tym, aby TUI było solidnym pomostem do orkiestracji (Zellij + agenci) bez wymuszania konkretnego okna. - -### 1. In-Place Multiplexer Hand-off (Exec) -Skoro działamy wewnątrz obecnego terminala, wywołanie `LaunchRuntime::Terminal` powinno sprowadzać się do eleganckiego przejęcia sesji przez `zellij attach` lub `zellij --session`. Należy upewnić się, że `operator-tui` używa mechanizmów pokrewnych do `exec` (zastąpienie procesu lub bezkolizyjne zawieszenie TUI na czas działania Zellij), aby nie tworzyć niepotrzebnej matrioszki procesów. - -### 2. Bezkolizyjne Zarządzanie TTY (Suspend/Resume) -Dopracowanie mechanizmu `suspend_and_run` (w `launch.rs`). Przełączanie między trybem Raw (Ratatui) a subprocesem interaktywnym (Zellij) bywa kruche. Należy zagwarantować, że sygnały systemowe, przywracanie bufora ekranu i stan kursora działają perfekcyjnie, niezależnie od tego, jak ezoteryczny emulator terminala pod spodem wyświetla obraz. - -### 3. Hermetyzacja Środowiska (Env Passthrough) -Bezpieczne przekazanie `ZELLIJ_CONFIG_DIR`, `VIBECRAFT_ROOT` oraz stanu sesji operatora do subprocesu. TUI musi działać jak zawór: odcina szum z powłoki użytkownika, ale dziedziczy kluczowe ustawienia terminala (np. wsparcie dla kolorów, TERM, wymiary ekranu) i wstrzykuje tylko to, co niezbędne dla agentów. - -### 4. Dynamiczne Wykrywanie Toolingu (Zoxide/Starship) -Zamiast hardcodować zachowania powłoki, `operator-tui` przed odpaleniem sesji w Zellij powinno móc weryfikować w `PATH` dostępność narzędzi pomocniczych (Zoxide, Starship, Atuin). Na tej podstawie launcher może dynamicznie wstrzykiwać odpowiednie pliki `.zshrc` lub profile startowe do wewnątrz Zellij. - -### 5. Asynchroniczny Watcher Stanu (Control-Plane) -Przebudowa mechanizmu odświeżania (obecnie w `app.rs` oparte na `Instant::now()`). Aby interfejs wydawał się w 100% responsywny (Vibe), TUI powinno asynchronicznie obserwować zmiany w katalogu `.ai-context/local/state/` (np. przez `notify`) i natychmiast aktualizować widok sesji bez czekania na "tick" pętli głównej. - -### 6. Natywny Pager dla Raportów (Deep Controls) -W `launch.rs` funkcja `pager_command` obecnie mocno polega na systemowym poleceniu wstrzykniętym w `sh -lc`. Zamiast wyrywać użytkownika do powłoki za pomocą `less`, o wiele bardziej "pro" byłoby zintegrowanie w Ratatui prostego widoku (TextView), który potrafi wyrenderować log/transkrypt agenta w nowym panelu wewnątrz samego TUI. - -### 7. Wzbogacenie Telemetrii Błędów TUI (Error Modal) -Jeśli wywołanie komendy launchera się nie powiedzie, aplikacja nie powinna po prostu wracać do czystego widoku lub "wypluwać" błędu po wyjściu. Wprowadzenie dedykowanego pop-upa (modal) w Ratatui, który wyłapie błąd z subprocesu i pozwoli operatorowi spokojnie go przeanalizować bez niszczenia układu TUI. - -### 8. Integracja ze Schowkiem (Clipboard) -Wprowadzenie cross-platformowej obsługi schowka (np. przez crate `arboard`). Niezależnie od terminala, w którym działa TUI, operator naciskając `y` na danym wpisie powinien móc błyskawicznie skopiować UUID sesji, ścieżkę do najnowszego raportu czy gotową komendę `vibecrafted resume`. - -### 9. Nawigacja i Filtrowanie Sesji -Gdy historia operacji (runs) zacznie pęcznieć, przewijanie jej strzałkami stanie się niewydajne. Dodanie skrótu `/` w UI otwierającego pasek szybkiego wyszukiwania (fuzzy search po nazwie agenta, typie lub statusie), co dramatycznie przyspieszy pracę w terminalu. - -### 10. Testy Akceptacyjne Logiki Launchera -Rozszerzenie zestawu testów w `operator-tui/tests/`. Główny nacisk musi pójść na hermetyczność `build_launch_command`: czy TUI pod każdym względem produkuje deterministyczny, terminalo-agnostyczny łańcuch wywołania dla Zellij, niezależnie od tego, czy odpalamy to na Linuksie pod tmuxem, czy na macOS pod Ghostty. diff --git a/tui-agent/audits/historical/2026-04-19_next-steps-ghostty.md b/tui-agent/audits/historical/2026-04-19_next-steps-ghostty.md deleted file mode 100644 index 6d0b9fd..0000000 --- a/tui-agent/audits/historical/2026-04-19_next-steps-ghostty.md +++ /dev/null @@ -1,39 +0,0 @@ -# Operator TUI: 10-Point Natural Next Steps (Ghostty-first — SUPERSEDED 2026-04-19) - -> **Status: superseded.** Plan zakładał Ghostty-first surface (`terminal_binary`, -> "new Ghostty window for reports", Ghostty env passthrough). Zastąpiony przez -> `2026-04-19_next-steps-agnostic.md` (terminal-agnostic shape), który codex -> zrealizował 2026-04-29 w commitach `8bc04a9` / `1d55925` / `3a3bfbd`. -> Zachowany jako historical evidence trail per `vc-intents` 2026-04-29 verdict. - -Ten plan skupia się wyłącznie na architekturze, refaktoringu i rozwoju narzędzia `operator-tui` (Rust), aby w pełni obsłużyć nowy ekosystem oparty na Ghostty i zoptymalizować doświadczenie operatora. - -### 1. Bezpieczna Iniekcja Zmiennych Środowiskowych -W module `launch.rs` (w `LaunchCommand::spawn`) należy dodać jawną propagację zmiennych środowiskowych specyficznych dla VibeCrafted (np. `ZELLIJ_CONFIG_DIR`, `VIBECRAFT_ROOT`). Zapobiegnie to wyciekom i konfliktom z globalnym środowiskiem systemu. - -### 2. Rozszerzenie `LaunchCommand` pod Ghostty -Zaktualizowanie struktury `build_launch_command`, aby poprawnie formatowała zagnieżdżone polecenia. Wywołanie Ghostty wymaga przekazania parametrów do Zellij (`ghostty -e zellij attach ...`). Należy upewnić się, że argumenty są poprawnie parsowane i escapowane przez `std::process::Command`. - -### 3. Graceful Error Handling przy Spawnowaniu -Aktualnie `suspend_and_run` zwraca ogólny błąd, jeśli proces nie wstanie. Należy przechwycić `stderr` z wywołania Ghostty i wyświetlić go w `status_line` interfejsu (w `app.rs`), aby operator natychmiast wiedział, dlaczego terminal nie wystartował (np. brak binarki w `PATH`). - -### 4. Dynamiczna Konfiguracja Terminala w `AppConfig` -Dodanie pola `terminal_binary` do `AppConfig` w `config.rs`. Choć domyślnie używamy Ghostty, odczytywanie ścieżki do terminala z głównego konfigu `vibecrafted` pozwoli na łatwiejsze testowanie i fallback na środowiskach CI/CD (np. headless). - -### 5. Async Launch & Nieblokujący Interfejs -Przepisanie mechanizmu `suspend_and_run` tak, aby interfejs Ratatui nie zamarzał całkowicie, jeśli proces startowy powłoki zaliczy "zwiechę". Odejście od blokującego `child.wait()` na rzecz asynchronicznego monitorowania stanu procesu (tokio/std::thread). - -### 6. Wzbogacenie `DeepAction` (Akcje Głębokiego Dostępu) -W `app.rs` rozszerzenie `DeepAction`. Zamiast polegać tylko na systemowym `$PAGER` dla akcji `OpenReport` czy `OpenTranscript`, możemy dodać opcję "Open in new Ghostty window", co otworzy logi w osobnym, niezależnym od Zellij, czystym oknie terminala. - -### 7. Weryfikacja Kondycji Sesji (Healthcheck) -Po wywołaniu Zellij przez Ghostty, `operator-tui` mogłoby sprawdzić (np. po gnieździe Zellij lub przez szybki poll), czy sesja faktycznie żyje. Umożliwi to automatyczne oznaczenie Run'a jako `Failed`, jeśli Zellij natychmiastowo zginie po starcie. - -### 8. Optymalizacja Kontekstu (Paging i Historia) -Przebudowa funkcji `pager_command`. Aktualny skrypt basha z `if/elif` jest podatny na błędy parsowania przy nietypowych znakach w ścieżkach. Należy to zastąpić bezpiecznym, natywnym wywołaniem procesu podglądarki (`less` lub `bat`) prosto z Rusta. - -### 9. Testy Jednostkowe Komend Startowych -Napisanie dedykowanych testów w `tests/` lub w samym `launch.rs`, które zweryfikują ciągi znaków generowane przez `build_launch_command`. Musimy mieć 100% pewności (Test Gate), że kombinacja `LaunchRuntime::Terminal` + Ghostty + Zellij renderuje perfekcyjnego stringa. - -### 10. Udoskonalenie Widoku Błędów (TUI Polish) -Jeśli Ghostty rzuci paniką, powrót do `operator-tui` po `LeaveAlternateScreen` potrafi zgubić logi błędu. Stworzenie dedykowanego modala/pop-upa w Ratatui (`ui.rs`), który przed ponownym wejściem w pętlę zdarzeń wyświetli dokładny powód awarii subprocesu. diff --git a/tui-agent/audits/historical/2026-04-29_vc-intents.md b/tui-agent/audits/historical/2026-04-29_vc-intents.md deleted file mode 100644 index 17b6692..0000000 --- a/tui-agent/audits/historical/2026-04-29_vc-intents.md +++ /dev/null @@ -1,72 +0,0 @@ -# vc-intents audit — 2026-04-29 - -Bounded intent-to-runtime audit of `vc-operator` (Vibecrafted Operator Console). - -**Worker:** claude (vc-agents native, Opus 4.7) -**Scope:** intentions extracted from `NEXT_STEPS.md`, `NEXT_STEPS_AGNOSTIC.md`, and the operator video review at `Screen_Recording_2026-04-25_at_06.54.04_report.md`, verified against runtime code in `src/` and `tests/`. -**Full report:** see the artifacts path below. - -## Verdict in one sentence - -The TUI's self-tests pass for the launch-string contract, but the operator-facing surface still lies on three intertwined fronts: the panel says "Live queue" while the loader returns every `runs/*.json` ever written (including 25-day-old completed runs), there is no operator-side eviction primitive so the dashboard can only grow, and the prompt editor that the dispatch flow funnels every operator into is a single-line `String` with no modal. - -## Coverage - -| Status | Count | -|---|---| -| `done` | 4 | -| `partial` | 5 | -| `superseded` | 2 | -| `missing` | 9 | -| **Total** | **20** | - -`done`-rate against deduped intent surface: **20%**. - -## Highest-leverage next moves - -1. **Eviction + freshness for the live queue (V#1 + V#2).** Add `Char('x')` archive action + a real time slice for "Live"; closes three video items at once. -2. **Subprocess error pipeline → status_line + ErrorOverlay (A#3 + A#10 + B#7).** Capture child stderr, surface in status_line, add `LaunchFocus::Error(String)` overlay. Fixes silent-fail UX after `q`-exits. -3. **Multiline prompt modal (V#7 + V#8 + V#9).** Promote the prompt editor to a Ratatui overlay with `\n` support and a save toast. - -## Full report - -`/Users/polyversai/.vibecrafted/artifacts/VetCoders/vc-operator/2026_0429/reports/20260429_215131_20260429_2151_perform-the-vc-intents-skill-on-this-repositor_claude.md` - -(Also reachable via the local symlink: `.vibecrafted/reports/20260429_215131_…_claude.md`.) - -## What was inspected - -| Surface | Path | LOC | -|---|---|---| -| Library entry, key handler, suspend_and_run | `src/lib.rs` | 423 | -| App state, deep actions, dispatch state machine | `src/app.rs` | 663 | -| Ratatui draw functions, three tabs, help overlay | `src/ui.rs` | 675 | -| Control-plane state loader, classification, age | `src/state.rs` | 412 | -| Launch command builder, zellij layout, env join | `src/launch.rs` | 269 | -| Config + CLI parser | `src/config.rs` | 189 | -| Integration tests (state contract + launch builder) | `tests/state_contract.rs` | 499 | - -## Key shape findings - -### Done (and why it matters) - -1. **In-place zellij multiplexer hand-off** is real. `build_terminal_launch_command` (`src/launch.rs:181-202`) emits `zellij options --config-dir … --layout-string …` with the deck `exec` quoted into a bash pane. `tests/state_contract.rs:148-189` pins the exact layout string. This was the most architecturally consequential intent — and it landed cleanly. -2. **TTY hygiene around subprocess launch** is real. `suspend_and_run` (`src/lib.rs:248-266`) restores raw mode + alternate screen even when the launched child fails — `leave_result?` and `raw_result?` run before `launch_result?`. - -### Superseded (be honest about which plan died) - -The Ghostty-first plan in `NEXT_STEPS.md` is dead. Items A#1 (Ghostty env), A#2 (Ghostty-Zellij chain), A#4 (`terminal_binary`), A#6 ("new Ghostty window" for reports) all replaced by the terminal-agnostic shape from `NEXT_STEPS_AGNOSTIC.md`. Documenting this so the next worker doesn't re-implement Ghostty wrappers. - -### The unresolved 9 (ranked by user-visible impact) - -- The `Live queue` panel keeps growing forever (no GC, no time slice, no eviction). -- No `delete`/`archive`/`dismiss` action — operator audit V#2. -- Subprocess errors silently take down the TUI — A#3 + A#10 + B#7. -- Prompt editor is a single-line `String` with no save feedback — V#7-V#9. -- No `notify` async watcher; UI refreshes on a 250ms poll only — B#5. -- No `arboard` clipboard — B#8. -- No `/` fuzzy search — B#9. -- No native Ratatui pager — A#8 + B#6. -- No tooling autodetection (Zoxide/Starship/Atuin) — B#4. - -See the full report for evidence per item. diff --git a/tui-agent/audits/historical/2026-04-30_vc-review.md b/tui-agent/audits/historical/2026-04-30_vc-review.md deleted file mode 100644 index ec35127..0000000 --- a/tui-agent/audits/historical/2026-04-30_vc-review.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -run_id: rvew-192258-80990 -prompt_id: 20260430_1922_perform-the-vc-review-skill-on-this-repository_20260430 -agent: codex -skill: rvew -model: unknown -status: completed ---- - -# VC Review: vc-operator - -Report mirror for the review worker run. Canonical external artifact: - -`/Users/polyversai/.vibecrafted/artifacts/VetCoders/vc-operator/2026_0430/reports/20260430_192301_20260430_1922_perform-the-vc-review-skill-on-this-repository_codex.md` - -## Findings (P0/P1/P2/P3) - -- **[P1-01] Readiness probe can inspect a different Zellij namespace than the launched session** - - **Evidence:** `src/launch.rs:270-276` adds `--config-dir /config/zellij` to the launch command, while `src/launch.rs:171-178` builds the readiness probe as only `list-sessions --short --no-formatting` with no matching `--config-dir`. The new test pins that incomplete probe shape at `tests/state_contract.rs:362-367`. - - **Comment:** When a repo-local Zellij config is active, the operator can launch one session namespace and probe another, producing either a false failure for a real session or silently disabling the health signal. - - **Recommendation:** Carry the resolved config dir into `LaunchReadinessProbe` and invoke `zellij --config-dir list-sessions --short --no-formatting`, or set the same `ZELLIJ_CONFIG_DIR` for both launch and probe; add a test with `root/config/zellij/config.kdl`. - -- **[P2-01] Probe timeout falls back to old success path instead of enforcing the README contract** - - **Evidence:** `README.md:43-46` says a terminal launch that exits before the named session appears is reported as failure, but `src/lib.rs:387-406` only bails when a successful child exit happens inside the two-second loop; after the deadline it calls `child.wait_with_output()` and can return success without ever observing the session. - - **Comment:** The new readiness behavior can look implemented while still allowing the same false-success class the change is meant to remove. - - **Recommendation:** After a named-session probe deadline, either fail with a clear readiness timeout or keep polling until child exit and fail if no visibility was ever observed; pin this with a fake `zellij` integration test. - -- **[P2-02] Readiness probe errors are swallowed** - - **Evidence:** `src/launch.rs:184-192` attaches useful context to `list-sessions` failures, but `src/lib.rs:390` converts every probe error into `false` with `unwrap_or(false)`. - - **Comment:** Bad flags, socket/config errors, or permission failures become indistinguishable from "session not visible", which makes operator failures harder to diagnose. - - **Recommendation:** Preserve at least the first probe error in the eventual `LaunchRunError`, and show it in the TUI error detail when readiness never succeeds. - -- **[P2-03] The runtime branch added no executable coverage for the new wait/probe behavior** - - **Evidence:** The added tests verify command/probe construction only (`tests/state_contract.rs:331-367` and `tests/state_contract.rs:379-413`); none execute `LaunchReadinessProbe::is_session_visible` or `wait_for_interactive_launch`. - - **Comment:** This feature is timing- and process-boundary sensitive, so shape tests are not enough to prove it works under real launch failure modes. - - **Recommendation:** Add a temp fake `zellij` binary that records args and simulates `list-sessions` success, slow visibility, non-zero probe status, and quick child exit. - -- **[P2-04] [TOOLING] prview passed an empty diff while the live selected surface had changes** - - **Evidence:** `/Users/polyversai/.prview/runs/vc-operator/main/20260430-192506/report.json:12-16` selected `base=main` and `head=main`; `report.json:18-29` reported PASS, while `10_diff/full.patch` was 0 bytes. Direct `git diff --stat origin/main` showed 8 changed files and 399 insertions / 29 deletions. - - **Comment:** The generated artifact pack is useful for gates, but not trustworthy for reviewing this headless worker surface because it ignored both the ahead/dirty repository delta and the current working tree. - - **Recommendation:** For local `main` review runs, force an explicit base such as `origin/main` and include dirty working-tree changes, or have prview emit a blocking tooling warning when `git status --short` is non-empty. - -- **[P3-01] Cargo audit still reports dependency advisories through ratatui** - - **Evidence:** `/Users/polyversai/.prview/runs/vc-operator/main/20260430-192506/report.json:27-35` records advisory caveats for `paste` and `lru`; `/Users/polyversai/.prview/runs/vc-operator/main/20260430-192506/20_quality/cargo_audit.log:1` shows `paste` as unmaintained and `lru` as unsound. `cargo tree -i lru` and `cargo tree -i paste` both route through `ratatui v0.29.0`. - - **Comment:** This is not a blocking vulnerability today, but it is still dependency risk in the TUI foundation. - - **Recommendation:** Track the upstream `ratatui` path to an `lru >=0.16.3` compatible release and re-run `cargo audit` after dependency refresh. - -## Before-Merge TODO - -- [ ] **(P1)** Make the readiness probe use the same Zellij config namespace as the launch command. (ref: P1-01) -- [ ] **(P2)** Decide and enforce the readiness timeout contract. (ref: P2-01) -- [ ] **(P2)** Stop discarding probe errors. (ref: P2-02) -- [ ] **(P2)** Add fake-process coverage for readiness behavior. (ref: P2-03) -- [ ] **(P2 tooling)** Re-run review artifacts with an explicit live diff target or fix prview local-main behavior. (ref: P2-04) -- [ ] **(P3)** Track or refresh the transitive `ratatui` dependency path for `paste` and `lru` audit advisories. (ref: P3-01) - -## Verification Run - -- `prview --with-tests --with-lint --no-fetch --soft-exit` passed, but generated empty diff artifacts. -- `cargo fmt --check` passed. -- `cargo clippy --all-targets -- -D warnings` passed. -- `cargo test` passed. -- `semgrep --config auto --error --timeout 60 .` passed with 0 findings. -- Loctree repo view: 9 Rust files, 4281 LOC, 0 cycles, 0 dead exports, 0 twins. diff --git a/tui-agent/tests/skill_launcher.rs b/tui-agent/tests/skill_launcher.rs index 32990a7..f8b7448 100644 --- a/tui-agent/tests/skill_launcher.rs +++ b/tui-agent/tests/skill_launcher.rs @@ -128,7 +128,7 @@ fn polarize_intent_ingests_prism_payload_and_renders_band_action() { let home = tempdir().unwrap(); let prism = home .path() - .join("artifacts/VetCoders/vc-operator/2026_0508/polarize/polr-123/prism.json"); + .join("artifacts/vetcoders/vc-operator/2026_0508/polarize/polr-123/prism.json"); fs::create_dir_all(prism.parent().unwrap()).unwrap(); fs::write( &prism, @@ -155,7 +155,7 @@ fn polarize_intent_prefers_canonical_band_action_over_score_fallback() { let home = tempdir().unwrap(); let prism = home .path() - .join("artifacts/VetCoders/vc-operator/2026_0508/polarize/polr-action/prism.json"); + .join("artifacts/vetcoders/vc-operator/2026_0508/polarize/polr-action/prism.json"); fs::create_dir_all(prism.parent().unwrap()).unwrap(); fs::write( &prism, @@ -174,10 +174,10 @@ fn polarize_intent_discovery_skips_malformed_prisms_without_hiding_valid_intents let home = tempdir().unwrap(); let valid_prism = home .path() - .join("artifacts/VetCoders/vc-operator/2026_0508/polarize/polr-valid/prism.json"); + .join("artifacts/vetcoders/vc-operator/2026_0508/polarize/polr-valid/prism.json"); let malformed_prism = home .path() - .join("artifacts/VetCoders/vc-operator/2026_0508/polarize/polr-bad/prism.json"); + .join("artifacts/vetcoders/vc-operator/2026_0508/polarize/polr-bad/prism.json"); fs::create_dir_all(valid_prism.parent().unwrap()).unwrap(); fs::create_dir_all(malformed_prism.parent().unwrap()).unwrap(); fs::write( @@ -206,10 +206,10 @@ fn polarize_intent_discovery_does_not_follow_symlinked_directories() { let escaped = tempdir().unwrap(); let valid_prism = home .path() - .join("artifacts/VetCoders/vc-operator/2026_0508/polarize/polr-valid/prism.json"); + .join("artifacts/vetcoders/vc-operator/2026_0508/polarize/polr-valid/prism.json"); let escaped_prism = escaped .path() - .join("VetCoders/vc-operator/2026_0508/polarize/polr-escaped/prism.json"); + .join("vetcoders/vc-operator/2026_0508/polarize/polr-escaped/prism.json"); fs::create_dir_all(valid_prism.parent().unwrap()).unwrap(); fs::create_dir_all(escaped_prism.parent().unwrap()).unwrap(); fs::write(