{
  "name": "shell",
  "kind": "bundled",
  "title": "Shell",
  "description": "Run a command in your login shell and read its output in the panel, with the exit code and how long it took. Nothing runs until you press Enter, and destructive-looking commands ask first.",
  "version": "0.1.0",
  "icon": {
    "tile": {
      "glyph": "󰞷",
      "bg": "slate"
    }
  },
  "author": "pal",
  "spec": "github:zcag/pal/extensions/shell@v0.9.1",
  "source": "https://github.com/zcag/pal/tree/HEAD/extensions/shell",
  "commit": "63287e180ce349dac3aa87c68ce4c80bc42ad409",
  "manifest": {
    "name": "shell",
    "title": "Shell",
    "description": "Run a command in your login shell and read its output in the panel, with the exit code and how long it took. Nothing runs until you press Enter, and destructive-looking commands ask first.",
    "version": "0.1.0",
    "icon": {
      "tile": {
        "glyph": "󰞷",
        "bg": "slate"
      }
    },
    "author": "pal",
    "repo": "bundled",
    "license": "MIT",
    "settings": [
      {
        "kind": "text",
        "id": "shell",
        "label": "Shell",
        "description": "The shell and its flags; `$SHELL` is your login shell. `-l` loads the login profile (PATH), `-i` the interactive one (aliases); `-c` takes the command. A `zsh -lc` skips the aliases and the interactive noise.",
        "placeholder": "$SHELL -lic",
        "default": "$SHELL -lic"
      },
      {
        "kind": "path",
        "id": "cwd",
        "label": "Working directory",
        "description": "Where commands run; `~` is expanded.",
        "pick": "folder",
        "placeholder": "~",
        "default": "~"
      },
      {
        "kind": "number",
        "id": "timeout",
        "label": "Timeout",
        "description": "A command still running after this is killed (SIGTERM, then SIGKILL) and the view says so; what it printed until then is kept.",
        "min": 1,
        "max": 600,
        "unit": "seconds",
        "default": 10
      },
      {
        "kind": "list",
        "id": "env",
        "label": "Environment",
        "description": "`KEY=VALUE` lines set for every command, on top of the host's environment.",
        "placeholder": "PAGER=cat",
        "default": []
      },
      {
        "kind": "boolean",
        "id": "confirm",
        "label": "Confirm destructive commands",
        "text": "Ask before running a command that removes, overwrites or escalates (rm, sudo, mv, dd, git reset --hard, ...)",
        "default": true
      },
      {
        "kind": "text",
        "id": "terminal",
        "label": "Terminal",
        "description": "What cmd+Enter opens: `Terminal` (default), `iTerm`, `kitty`, `Alacritty`, `WezTerm`, `Ghostty`, or any app name (`open -na \u003cname\u003e --args -e ...`); on Linux a command name (`kitty`, `foot`, `alacritty`, `wezterm`, `ghostty`, ...), else `$TERMINAL`, else the first of those installed.",
        "placeholder": "Terminal",
        "default": ""
      }
    ],
    "store": {
      "tagline": "Run a command, read its output in the panel, run it again",
      "category": "developer",
      "features": [
        "Nothing runs as you type; `rm`, `sudo`, `git reset --hard` and the like ask first",
        "Runs in your login shell, so your PATH, aliases and functions work",
        "Output in the panel: stdout in monospace, stderr in red, the exit code and duration on top",
        "Long commands show the elapsed time and the result lands when they finish",
        "`enter` copies the output, `cmd+enter` opens the command in your terminal, `cmd+r` runs it again",
        "A history of every command with its exit code; type `$ ls` at the root to run it right there"
      ],
      "permissions": [],
      "platforms": [
        "macos",
        "linux"
      ],
      "screenshots": [
        {
          "file": "1-run.png",
          "caption": "A command typed: one Run row, nothing has run yet"
        },
        {
          "file": "2-output.png",
          "caption": "The output view: exit 0 and the duration as badges, stdout in mono on the sunken surface"
        },
        {
          "file": "3-stderr.png",
          "caption": "A failing command: stderr in red, exit 1"
        },
        {
          "file": "4-confirm.png",
          "caption": "rm -rf on the way: the confirm card before anything runs"
        },
        {
          "file": "5-history.png",
          "caption": "Shell History: past commands with their exit codes, Enter runs one again"
        }
      ],
      "actions": [
        {
          "title": "Run",
          "description": "The command in the login shell; the output as a view. Asks first when it looks destructive.",
          "keys": "enter"
        },
        {
          "title": "Run in terminal",
          "description": "Opens a terminal window on the command in the working directory.",
          "keys": "cmd+enter"
        },
        {
          "title": "Copy command",
          "keys": "cmd+c"
        },
        {
          "title": "Copy output",
          "description": "In the output view: stdout (stderr when there is no stdout) onto the clipboard.",
          "keys": "enter"
        },
        {
          "title": "Open in terminal",
          "description": "In the output view: the same command in a terminal window.",
          "keys": "cmd+enter"
        },
        {
          "title": "Run again",
          "description": "In the output view: the command once more, the view replaced.",
          "keys": "cmd+r"
        },
        {
          "title": "Copy stderr",
          "description": "In the output view.",
          "keys": "cmd+shift+e"
        },
        {
          "title": "Remove from history",
          "keys": "cmd+d"
        }
      ]
    },
    "palettes": {
      "shell": {
        "title": "Shell",
        "kind": "input",
        "inline": true,
        "match": "^[$\u003e] \\S",
        "description": "Type a command; the one row runs it on Enter and shows the output as a view. At the root `$ ls` or `\u003e ls` lists the same row inline.",
        "keys": [
          {
            "keys": "enter",
            "title": "Run the command (in the view: copy the output)"
          },
          {
            "keys": "cmd+enter",
            "title": "Run it in a terminal window instead (in the view: open one)"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the command"
          },
          {
            "keys": "cmd+r",
            "title": "In the view: run it again"
          },
          {
            "keys": "cmd+shift+e",
            "title": "In the view: copy stderr"
          }
        ]
      },
      "history": {
        "title": "Shell History",
        "kind": "input",
        "description": "Every command run here, newest first, with its exit code and duration; Enter runs it again.",
        "keys": [
          {
            "keys": "enter",
            "title": "Run the command again"
          },
          {
            "keys": "cmd+enter",
            "title": "Run it in a terminal window"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the command"
          },
          {
            "keys": "cmd+d",
            "title": "Remove the entry"
          }
        ]
      }
    }
  },
  "playable": false,
  "updated_at": "2026-09-30T01:45:08Z",
  "url": "https://pal.cagdas.io/extensions/shell",
  "tagline": "Run a command, read its output in the panel, run it again",
  "category": "developer",
  "screenshots": [
    "https://pal.cagdas.io/extensions/shell/screenshots/1-run-dark.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/1-run.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/2-output-dark.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/2-output.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/3-stderr-dark.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/3-stderr.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/4-confirm-dark.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/4-confirm.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/5-history-dark.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/5-history.png"
  ],
  "panel_screenshots": [
    "https://pal.cagdas.io/extensions/shell/screenshots/1-run.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/2-output.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/3-stderr.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/4-confirm.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/5-history.png"
  ],
  "bar_screenshots": [],
  "panel_screenshots_dark": [
    "https://pal.cagdas.io/extensions/shell/screenshots/1-run-dark.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/2-output-dark.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/3-stderr-dark.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/4-confirm-dark.png",
    "https://pal.cagdas.io/extensions/shell/screenshots/5-history-dark.png"
  ],
  "bar_screenshots_dark": [],
  "has_bar": false,
  "bar_items": [],
  "has_links": false,
  "links": [],
  "multi": false,
  "has_readme": true
}
