No description
  • TypeScript 100%
Find a file
keeb 995f18956e Add property-based schema tests (fast-check via @traversable/zod-test)
Generic harness: derives a fast-check arbitrary from every model zod
schema (globalArguments, method arguments, resource schemas) and asserts
generated data round-trips through the schema's own safeParse. Identical
file across extensions; canonical copy + docs live in mms/tests/property/.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 09:19:17 -07:00
.claude/skills/ssh feat: add multi-transport support (tailscale, bastion, proxy-command) 2026-05-14 21:15:26 -07:00
extensions/models style: reformat connectionFrom signature to fit line length 2026-05-14 21:15:48 -07:00
tests/property Add property-based schema tests (fast-check via @traversable/zod-test) 2026-07-18 09:19:17 -07:00
.gitignore Initial commit: @keeb/ssh swamp extension 2026-02-27 12:31:11 -08:00
.swamp.yaml Initial commit: @keeb/ssh swamp extension 2026-02-27 12:31:11 -08:00
CLAUDE.md Add repository and tags to manifest 2026-03-02 22:01:56 -08:00
LICENSE.txt feat: add multi-transport support (tailscale, bastion, proxy-command) 2026-05-14 21:15:26 -07:00
manifest.yaml feat: add multi-transport support (tailscale, bastion, proxy-command) 2026-05-14 21:15:26 -07:00
README.md feat: add multi-transport support (tailscale, bastion, proxy-command) 2026-05-14 21:15:26 -07:00

@keeb/ssh

Swamp extension for general-purpose SSH operations.

Models

ssh/host

Remote command execution, file upload, and connection waiting over SSH.

Method Description
exec Execute a command on the remote host
upload SCP a file to the remote host
waitForConnection Wait until SSH is reachable (with timeout)

Transports

Set via on the model to pick how the connection is established:

via Notes
key (default) Plain ssh/scp using the local agent + ~/.ssh keys
tailscale tailscale ssh — uses tailnet identity; no static keys needed
bastion Routes through -J <bastion> (e.g. user@jump-host)
proxy-command Tunnels via an arbitrary ProxyCommand (e.g. AWS SSM)

Extra globalArguments per transport:

  • via: bastionbastion: "user@jump-host"
  • via: proxy-commandproxyCommand: "aws ssm start-session --target i-..."

Workflows

None — this is a foundational model used by other extensions.

Dependencies

None.

Used by

Install

swamp extension pull @keeb/ssh

Example

Wait for a freshly booted VM, run a remote command, then upload a file:

models:
  - name: host
    type: "@keeb/ssh/host"
    globalArguments:
      host: "10.0.0.42"
      user: "root"

jobs:
  - name: provision
    steps:
      - model: host
        method: waitForConnection
        inputs: { timeout: 120 }
      - model: host
        method: exec
        inputs: { command: "apk add curl bash" }
      - model: host
        method: upload
        inputs:
          source: "./config.yaml"
          dest: "/etc/app/config.yaml"

Via a bastion / jump host

models:
  - name: host
    type: "@keeb/ssh/host"
    globalArguments:
      host: "10.0.0.42"
      user: "root"
      via: bastion
      bastion: "ops@jump.example.com"

Over Tailscale

models:
  - name: host
    type: "@keeb/ssh/host"
    globalArguments:
      host: "node-01"
      user: "root"
      via: tailscale

Through AWS SSM (proxy-command)

models:
  - name: host
    type: "@keeb/ssh/host"
    globalArguments:
      host: "i-0123456789abcdef0"
      user: "ec2-user"
      via: proxy-command
      proxyCommand: "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"

License

MIT