← back to Slack To Steve

arm.sh

30 lines

#!/bin/bash
# arm.sh — YOU run this (it enables autonomous claude -p from Slack). Steve-authorized only.
# Default: arms ONLY #claude-chat (C0BGQ2QLR35). To also arm #claude-to-steve, add its id
# to ARMED_CHANNELS below (or set ARMED_CHANNELS= empty to arm every watched channel).
set -e
cd ~/Projects/slack-to-steve

# 1. flip the switch — arm BOTH watched channels (ARMED_CHANNELS empty = all)
sed -i '' 's/^AUTO_EXECUTE=.*/AUTO_EXECUTE=1/' .env
grep -q '^ARMED_CHANNELS=' .env && sed -i '' 's/^ARMED_CHANNELS=.*/ARMED_CHANNELS=/' .env || echo 'ARMED_CHANNELS=' >> .env

# 2. seed cursors to NOW so your 174 old link-drops are NOT executed as commands
node -e '
const fs=require("fs");
const env=fs.readFileSync(".env","utf8");
const tok=(env.match(/SLACK_BOT_TOKEN=(.*)/)||[])[1].trim();
const chans=((env.match(/SLACK_CHANNEL_IDS=(.*)/)||[])[1]||"").trim().split(",").map(s=>s.trim()).filter(Boolean);
fs.mkdirSync("data",{recursive:true});
(async()=>{for(const c of chans){const r=await fetch("https://slack.com/api/conversations.history?channel="+c+"&limit=1",{headers:{Authorization:"Bearer "+tok}});const j=await r.json();const ts=(j.messages&&j.messages[0]&&j.messages[0].ts)||"0";fs.writeFileSync("data/last-ts-"+c+".txt",ts);console.log("  cursor",c,"->",ts);}})();
'

# 3. run the watcher under pm2 (90s loop, survives restarts)
pm2 delete slack-ingest >/dev/null 2>&1 || true
WATCH=1 pm2 start ingest.mjs --name slack-ingest
pm2 save
echo ""
echo "✅ ARMED — BOTH #claude-chat and #claude-to-steve auto-execute your messages via claude -p (rails enforce gates)."
echo "   Test it: post a SAFE task in either channel, e.g. \"what pm2 processes are running?\""
echo "   Disarm anytime:  sed -i '' 's/^AUTO_EXECUTE=.*/AUTO_EXECUTE=0/' ~/Projects/slack-to-steve/.env && pm2 restart slack-ingest"