scrn-mgr
A GNU screen session manager: CLI first, with a Rich/Textual TUI and an
MCP server, so sessions can be driven the same way from a terminal, a
human-friendly UI, or an AI assistant. Sessions can live on the local
machine or on remote nodes reachable over SSH -- scrn-mgr keeps a small
registry at ~/.scrn-mgr/registry.json recording which host each session
is on.
Install (dev)
This project is developed inside a henv environment:
henv -x pip install -e ".[dev]"
henv -x pytest -q
python, pytest, and the installed scrn-mgr executable are all run the
same way: henv -x <command> ....
Quick start (Python API)
from scrn_mgr import ScreenSessionManager
manager = ScreenSessionManager()
manager.new_session("work") # local
manager.new_session("train", host="user@gpu01") # remote, over SSH
manager.send_command("work", "python script.py")
output = manager.capture("work")
CLI usage
scrn-mgr new work # alias: create
scrn-mgr new train --host user@gpu01 # started on a remote node over SSH
scrn-mgr send work "echo hello"
scrn-mgr send-commands work -c "echo 1" -c "echo 2"
scrn-mgr send-file work script.sh
scrn-mgr capture work
scrn-mgr list --all
scrn-mgr attach work # interactive; ssh -t under the hood if remote
scrn-mgr new-or-attach work # alias: create-or-attach
scrn-mgr kill work
scrn-mgr cleanup work # or: scrn-mgr cleanup --all
scrn-mgr tui # Textual UI
scrn-mgr serve # MCP server (stdio)
MCP server
scrn-mgr serve runs an MCP server over stdio exposing every non-interactive
operation: list_sessions, new_session, send_command, send_commands,
send_file, capture, cleanup_session, kill_session. Interactive
attach is intentionally not exposed over MCP -- it needs to take over a
real terminal/PTY for the life of the session, which doesn't fit a single
tool call/response. Use the CLI (scrn-mgr attach NAME) or the TUI for that.
Because the MCP server always runs locally next to its client and reaches
remote sessions the same way the CLI does (one ssh round trip per call,
using the host recorded in the registry), no special transport is needed for
SSH-remote sessions -- plain stdio is sufficient.
Example client config:
{
"mcpServers": {
"scrn-mgr": {
"command": "scrn-mgr",
"args": ["serve"]
}
}
}
Requirements
- Python 3.10+
- The
screenbinary (brew install screen/apt install screen) - For remote sessions: SSH access to the target host (via your normal
~/.ssh/config) withscreeninstalled there too
Releasing
Pushing a v* tag runs .github/workflows/release.yml,
which builds the sdist/wheel, publishes them to PyPI via
Trusted Publishing (no stored
secrets), and attaches the build artifacts to a GitHub release.
One-time setup (already done for this repo, kept here for reference): on the PyPI project's "Publishing" settings (or, for the very first release, on https://pypi.org/manage/account/publishing/), add a trusted publisher with:
| Field | Value |
|---|---|
| PyPI project name | scrn-mgr |
| Owner | matplo |
| Repository name | scrn-mgr |
| Workflow name | release.yml |
| Environment name | pypi |
Cutting a release:
# 1. bump the version in pyproject.toml, e.g. 0.1.0 -> 0.1.1, and commit it
git commit -am "Bump version to 0.1.1"
# 2. tag it (must match pyproject.toml's version, with a v prefix) and push both
git push
git tag v0.1.1
git push origin v0.1.1
The workflow refuses to publish if the tag and pyproject.toml's version
disagree.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scrn_mgr-0.1.0.tar.gz.
File metadata
- Download URL: scrn_mgr-0.1.0.tar.gz
- Upload date:
- Size: 16.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46a6dc91d4239c3836cfbdd5a1daa29fbcc54745af5ec7f361c3573aea856cf6
|
|
| MD5 |
a0edbe2b28cdb059d525f2b577b46297
|
|
| BLAKE2b-256 |
82a2a0bd8027ee256aeaa32eab29e160fde073354c7b914e30accda653c01143
|
Provenance
The following attestation bundles were made for scrn_mgr-0.1.0.tar.gz:
Publisher:
release.yml on matplo/scrn-mgr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scrn_mgr-0.1.0.tar.gz -
Subject digest:
46a6dc91d4239c3836cfbdd5a1daa29fbcc54745af5ec7f361c3573aea856cf6 - Sigstore transparency entry: 2799887513
- Sigstore integration time:
-
Permalink:
matplo/scrn-mgr@95c835811b778c36f08917ec5871b26c23bd8a9d -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/matplo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95c835811b778c36f08917ec5871b26c23bd8a9d -
Trigger Event:
push
-
Statement type:
File details
Details for the file scrn_mgr-0.1.0-py3-none-any.whl.
File metadata
- Download URL: scrn_mgr-0.1.0-py3-none-any.whl
- Upload date:
- Size: 16.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e699f9268d327734b39a89c8296fe175783255fef0181949c61eb00d3eb106fd
|
|
| MD5 |
b9df1021b06cbfdf3969a6aad934178f
|
|
| BLAKE2b-256 |
d015dae36bd722802863733906de59318a2ad158f15d088619efb0c95513a17f
|
Provenance
The following attestation bundles were made for scrn_mgr-0.1.0-py3-none-any.whl:
Publisher:
release.yml on matplo/scrn-mgr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scrn_mgr-0.1.0-py3-none-any.whl -
Subject digest:
e699f9268d327734b39a89c8296fe175783255fef0181949c61eb00d3eb106fd - Sigstore transparency entry: 2799887599
- Sigstore integration time:
-
Permalink:
matplo/scrn-mgr@95c835811b778c36f08917ec5871b26c23bd8a9d -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/matplo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95c835811b778c36f08917ec5871b26c23bd8a9d -
Trigger Event:
push
-
Statement type: