opp-repl-shared-terminal — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited opp-repl-shared-terminal (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill stands up a single opp_repl process driven concurrently by two clients:
tmux attaches and types at the liveIPython prompt;
MCP client), which calls the execute_python MCP tool.
Because execute_python runs in the same IPython namespace as the interactive user, all state (loaded projects, results, variables, imports) is genuinely shared — no context drift between what the user sees and what the AI sees. It is one process.
This composes the base pack (opp-repl-mcp-server, opp-repl-repl-usage) into a collaboration workflow; load those for the underlying details.
or the user should watch and steer what the AI runs.
or terminal emulator.
For plain single-user opp_repl, use opp-repl-repl-usage. For the MCP transport details and per-client config, see opp-repl-mcp-server.
┌────────────────────────────────────┐
│ tmux session: opp_repl │
│ ┌──────────────────────────────┐ │
user ─►│ │ opp_repl (IPython) │ │ stdio ┌───────────────┐
attach │ │ --mcp-socket <path> │◄─┼── bridge ──┤ opp_repl_ │◄─ AI client
│ │ --load ... │ │ (UDS) │ mcp_bridge │ (Claude Code,
│ └──────────────────────────────┘ │ └───────────────┘ Windsurf, …)
└────────────────────────────────────┘spawn opp_repl_mcp_bridge (stdio↔socket). No token needed — the socket's 0600 permissions are the access control.
--http [PORT] exposes streamable HTTP on 127.0.0.1with a bearer token, for remote clients or older opp_repl.
pip install "opp_repl[mcp]"(opp_repl and opp_repl_mcp_bridge on PATH after sourcing the OMNeT++ setenv / activating the venv).
tmux installed.locally). For a remote client, forward over SSH and keep auth on.
scripts/start_shared_repl.sh — start opp_repl in tmux with the MCPserver, wait for it, and write the AI client's config. Socket transport by default; --http [PORT] for TCP+token.
scripts/attach_repl.sh — tmux attach to type at the live prompt(--read-only to watch only).
scripts/stop_repl.sh — graceful shutdown (sends exit, then killsthe session if it lingers); shreds the token / removes the socket.
scripts/configure_mcp_client.sh — (re)write a client's MCP configfor Claude Code / Windsurf / VS Code without restarting the REPL.
templates/claude_code_mcp.json, templates/windsurf_mcp_config.json— reference config shapes.
All scripts are POSIX-bash and work on Linux and macOS.
command -v tmux opp_repl opp_repl_mcp_bridge
echo "$OMNETPP_ROOT" # source the OMNeT++ setenv first if unsetFrom this skill directory:
scripts/start_shared_repl.sh \
[--session-name opp_repl] \
[--load '<.opp glob>' ...] \
[--client claude|windsurf|vscode|none] \ # default: claude
[--http [PORT]] \ # default: Unix socket
[--detach]Defaults: socket transport, client claude, and — when no --load is given — $OMNETPP_ROOT/omnetpp.opp + $OMNETPP_ROOT/samples/*/*.opp, or the bundled --load @opp descriptors. Without --detach you are attached to tmux immediately.
The script:
a different --session-name).
~/.opp_repl_shared/mcp-<session>.sock and runsopp_repl --mcp-socket <path> --load …. HTTP mode: mints a token, passes its SHA-256 via --mcp-token-hash (or --mcp-bypass-token-hash-check on older opp_repl).
curl --unix-socket).--detach).scripts/attach_repl.sh # read-write
scripts/attach_repl.sh --read-onlyDetach with Ctrl-b d. Multiple terminals may attach at once; every keystroke is visible to the AI because they share one kernel.
start_shared_repl.sh already wrote the config for --client (default Claude Code → a project .mcp.json). To (re)configure later, or target a different client:
scripts/configure_mcp_client.sh --client claude # or windsurf | vscodeThen reload the client:
claude mcp add --transport stdio opp_repl -- opp_repl_mcp_bridge).
The opp_repl server should expose the execute_python tool and the opp-repl://… resources.
scripts/stop_repl.shSends exit to IPython (flushes pending writes), waits up to 5 s, then kills the session if needed, and cleans up the token/socket.
execute_python runs in the REPL'suser_ns via IPython run_cell; variables/imports cross both ways.
and its scrollback.
In [N]:; theAI submits cells over MCP. opp_repl serialises cell execution, so a long-running cell on one side queues the other.
run_simulations()on one side blocks a conflicting run from the other until it returns.
0600 perms; AIclients use opp_repl_mcp_bridge. Best for a local human+AI pair.
127.0.0.1, bearertoken in the Authorization header. Use for remote clients (over an SSH tunnel) or opp_repl builds without the socket transport.
Full details and per-client config shapes are in opp-repl-mcp-server.
--http start mints a newtoken and rewrites the client config — reload the client or it 401s.
or socket file behind. stop_repl.sh cleans both; re-run start after.
client, forward over SSH (ssh -L for TCP, or run the bridge on the host) and keep auth on — never expose TCP unauthenticated.
$OMNETPP_ROOT/setenvwhen set; if OMNETPP_ROOT is wrong, the env is silently incomplete. Always echo $OMNETPP_ROOT and command -v opp_repl before filing a bug.
cooperative interrupt; it does not instantly kill a running opp_run subprocess. Use the user-side prompt to Ctrl-C an in-flight sim.
trailing commas, the JSON merge refuses to overwrite — fix it by hand and re-run configure_mcp_client.sh.
.mcp.json is written in the currentdirectory (project scope); run start/configure from the workspace you drive the AI from, or pass CLAUDE_MCP_CONFIG=~/.claude.json.
After start_shared_repl.sh returns and you're attached:
In [1]: shared_marker = "hello from user"Ask the AI (via chat) to execute_python("shared_marker") — it should return 'hello from user'. Have it set another variable; re-attach and confirm it's visible at the prompt.
Without an AI client — hit the endpoint directly:
# Socket transport:
SOCK=$(cat ~/.opp_repl_shared/socket)
curl -sN --unix-socket "$SOCK" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"execute_python","arguments":{"code":"print(\"mcp ok\")"}}}' \
http://localhost/mcp
# TCP transport (--http):
TOKEN=$(cat ~/.opp_repl_shared/token)
curl -sN -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"execute_python","arguments":{"code":"print(\"mcp ok\")"}}}' \
http://127.0.0.1:9966/mcpExpect a streaming response containing mcp ok; the same line appears in the tmux pane the user is watching.
opp-repl-mcp-server — transports, auth, and per-client config.opp-repl-repl-usage — the interactive REPL the user drives.opp-repl-sandbox — isolate the shared server under bubblewrap.opp-repl-ai-workflows — what the AI does once connected.opp-repl-overview — map of which skills to load when.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.