
Scada
- 1 installs
- 12 repo stars
- Updated April 26, 2026
- bytesagain/ai-skills
scada is a Claude skill wrapping a command-line supervisory control and data acquisition manager that stores entries as JSONL.
About
This skill is a command-line supervisory control and data acquisition (SCADA) manager. It exposes commands to show status, add, list, search, remove, export data, and view statistics, storing entries as JSONL in ~/.scada/. A developer uses it to manage SCADA-style entries from the terminal.
- A supervisory control and data acquisition (SCADA) manager CLI
- Commands: status, add, list, search, remove, export, stats, config, help, version
- Stores all data in ~/.scada/ as JSONL, configurable via SCADA_DIR
Scada by the numbers
- 1 all-time installs (skills.sh)
- Ranked #467 of 550 CLI & Terminal skills by installs in the Skillselion catalog
- Data as of Jul 27, 2026 (Skillselion catalog sync)
scada capabilities & compatibility
- Use cases
- data analysis
- Pricing
- Free
What scada says it does
Supervisory control and data acquisition manager
All data stored in `~/.scada/` using JSONL format (one JSON object per line).
Structured output to stdout. Exit code 0 on success, 1 on error.
npx skills add https://github.com/bytesagain/ai-skills --skill scadaAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1 |
|---|---|
| repo stars | ★ 12 |
| Last updated | April 26, 2026 |
| Repository | bytesagain/ai-skills ↗ |
What it does
Manage supervisory control and data acquisition entries from the terminal with add, list, and export commands.
Who is it for?
add/list/search/export of SCADA entries via a CLI
Skip if: connecting to real industrial control hardware or PLCs
When should I use this skill?
managing SCADA-style entries from the terminal
What you get
Provides a CLI to add, list, search, export, and report on SCADA entries stored as JSONL.
By the numbers
- 10 documented commands
Files
scada
Supervisory control and data acquisition manager
Commands
status
scripts/script.sh statusShow current status
add
scripts/script.sh addAdd new entry
list
scripts/script.sh listList all entries
search
scripts/script.sh searchSearch entries
remove
scripts/script.sh removeRemove entry by number
export
scripts/script.sh exportExport data to file
stats
scripts/script.sh statsShow statistics
config
scripts/script.sh configView or set config
help
scripts/script.sh helpversion
scripts/script.sh versionConfiguration
Use scripts/script.sh config <key> <value> to set preferences.
| Variable | Required | Description |
|---|---|---|
SCADA_DIR | No | Data directory (default: ~/.scada/) |
Data Storage
All data stored in ~/.scada/ using JSONL format (one JSON object per line).
Output
Structured output to stdout. Exit code 0 on success, 1 on error.
---
Powered by BytesAgain | bytesagain.com | hello@bytesagain.com
#!/usr/bin/env bash
# scada -- Supervisory control and data acquisition manager
# Powered by BytesAgain | bytesagain.com | hello@bytesagain.com
set -euo pipefail
VERSION="1.0.0"
DATA_DIR="${SCADA_DIR:-$HOME/.scada}"
_ensure_dirs() { mkdir -p "$DATA_DIR"; }
_save_entry() {
_ensure_dirs
local cmd="$1" val="$2"
local ts=$(date '+%Y-%m-%d %H:%M:%S')
printf '{"ts":"%s","cmd":"%s","val":"%s"}\n' "$ts" "$cmd" "$val" >> "$DATA_DIR/data.jsonl"
}
show_help() {
cat << EOF
scada v$VERSION -- Supervisory control and data acquisition manager
Usage: scada <command> [args]
Commands:
status Show current status
add Add new entry
list List all entries
search Search entries
remove Remove entry by number
export Export data to file
stats Show statistics
config View or set config
help Show this help
version Show version
Data: $DATA_DIR
Powered by BytesAgain | bytesagain.com
EOF
}
cmd_status() {
echo "=== scada Status ==="
echo " Version: $VERSION"
echo " Data dir: $DATA_DIR"
local entries=$(cat "$DATA_DIR"/*.jsonl 2>/dev/null | wc -l || echo 0)
echo " Entries: $entries"
echo " Disk: $(du -sh "$DATA_DIR" 2>/dev/null | cut -f1 || echo empty)"
}
cmd_add() {
local value="${1:?Usage: scada add <entry>}"
shift || true
_save_entry "add" "$value $*"
local count=$(wc -l < "$DATA_DIR/data.jsonl" 2>/dev/null || echo 0)
echo "Added: $value (entry #$count)"
}
cmd_list() {
echo "=== Scada Entries ==="
if [ -f "$DATA_DIR/data.jsonl" ]; then
local count=$(wc -l < "$DATA_DIR/data.jsonl")
echo "Total: $count"
echo "---"
tail -20 "$DATA_DIR/data.jsonl" | while IFS= read -r line; do
local ts=$(echo "$line" | grep -o '"ts":"[^"]*' | cut -d'"' -f4)
local cmd=$(echo "$line" | grep -o '"cmd":"[^"]*' | cut -d'"' -f4)
local val=$(echo "$line" | grep -o '"val":"[^"]*' | cut -d'"' -f4)
echo " [$ts] $cmd: $val"
done
else
echo "No entries yet."
fi
}
cmd_search() {
local term="${1:?Usage: scada search <term>}"
if [ -f "$DATA_DIR/data.jsonl" ]; then
local matches=$(grep -ic "$term" "$DATA_DIR/data.jsonl" 2>/dev/null || echo 0)
echo "Found: $matches matches"
grep -i "$term" "$DATA_DIR/data.jsonl" 2>/dev/null | head -20 | while IFS= read -r line; do
local val=$(echo "$line" | grep -o '"val":"[^"]*' | cut -d'"' -f4)
local ts=$(echo "$line" | grep -o '"ts":"[^"]*' | cut -d'"' -f4)
echo " [$ts] $val"
done
else
echo "No data to search."
fi
}
cmd_remove() {
local num="${1:?Usage: scada remove <line-number>}"
if [ -f "$DATA_DIR/data.jsonl" ]; then
local total=$(wc -l < "$DATA_DIR/data.jsonl")
if [ "$num" -ge 1 ] 2>/dev/null && [ "$num" -le "$total" ] 2>/dev/null; then
sed -i "${num}d" "$DATA_DIR/data.jsonl"
echo "Removed #$num ($((total-1)) remaining)"
else echo "Invalid: $num (total: $total)"; fi
else echo "No data."; fi
}
cmd_export() {
local fmt="${1:-json}"
local out="scada-export.$fmt"
if [ ! -f "$DATA_DIR/data.jsonl" ]; then echo "No data."; return 0; fi
case "$fmt" in
json) cp "$DATA_DIR/data.jsonl" "$out" ;;
csv)
echo "timestamp,command,value" > "$out"
while IFS= read -r line; do
ts=$(echo "$line" | grep -o '"ts":"[^"]*' | cut -d'"' -f4)
c2=$(echo "$line" | grep -o '"cmd":"[^"]*' | cut -d'"' -f4)
vl=$(echo "$line" | grep -o '"val":"[^"]*' | cut -d'"' -f4)
echo "$ts,$c2,$vl" >> "$out"
done < "$DATA_DIR/data.jsonl"
;;
*) echo "Formats: json, csv"; return 1 ;;
esac
echo "Exported: $out ($(wc -c < "$out") bytes)"
}
cmd_stats() {
echo "=== Scada Stats ==="
if [ -f "$DATA_DIR/data.jsonl" ]; then
local total=$(wc -l < "$DATA_DIR/data.jsonl")
local bytes=$(wc -c < "$DATA_DIR/data.jsonl")
echo " Entries: $total"
echo " Size: $bytes bytes"
echo " Disk: $(du -sh "$DATA_DIR" 2>/dev/null | cut -f1)"
else echo " No data yet."; fi
}
cmd_config() {
local key="${1:-}" val="${2:-}"
local cfg="$DATA_DIR/config.txt"
if [ -z "$key" ]; then
echo "=== Config ==="
if [ -f "$cfg" ]; then
while IFS="=" read -r k v; do echo " $k=$v"; done < "$cfg"
else echo " (empty — use config <key> <value>)"; fi
elif [ -z "$val" ]; then
grep "^${key}=" "$cfg" 2>/dev/null | cut -d= -f2- || echo "(not set)"
else
if [ -f "$cfg" ] && grep -q "^${key}=" "$cfg" 2>/dev/null; then
sed -i "s|^${key}=.*|${key}=${val}|" "$cfg"
else
echo "${key}=${val}" >> "$cfg"
fi
echo "Set: $key=$val"
fi
}
CMD="${1:-help}"
shift 2>/dev/null || true
_ensure_dirs
case "$CMD" in
status) cmd_status "$@" ;;
add) cmd_add "$@" ;;
list) cmd_list "$@" ;;
search) cmd_search "$@" ;;
remove) cmd_remove "$@" ;;
export) cmd_export "$@" ;;
stats) cmd_stats "$@" ;;
config) cmd_config "$@" ;;
help|--help|-h) show_help ;;
version|--version|-v) echo "scada v$VERSION -- Powered by BytesAgain" ;;
*) echo "Unknown: $CMD"; echo "Run: scada help"; exit 1 ;;
esac