sync: auto-sync from HOWARD-HOME at 2026-07-07 07:23:12

Author: Howard Enos
Machine: HOWARD-HOME
Timestamp: 2026-07-07 07:23:12
This commit is contained in:
2026-07-07 07:23:39 -07:00
parent 0daf06263f
commit ead30520e5
5 changed files with 108 additions and 31 deletions

View File

@@ -29,6 +29,7 @@
- [TickTick Integration](reference_ticktick_integration.md) — OAuth API integration, MCP server, SOPS vault creds, project/task CRUD. - [TickTick Integration](reference_ticktick_integration.md) — OAuth API integration, MCP server, SOPS vault creds, project/task CRUD.
- [Client Docs Structure](reference_client_docs_structure.md) — clients/<name>/docs/ layout (overview, network, servers, cloud, security, rmm). Template: clients/_client_template/. - [Client Docs Structure](reference_client_docs_structure.md) — clients/<name>/docs/ layout (overview, network, servers, cloud, security, rmm). Template: clients/_client_template/.
- [Client Wi-Fi Inventory](reference_client_wifi_inventory.md) — Building a fleet Wi-Fi list to connect onsite without asking. Passwords → vault `clients/<slug>/wifi.sops.yaml` (`credentials.<key>_ssid/_password`); readable index → `wiki/reference/client-wifi.md`. `/wifi` importer deferred (structure-only 2026-07-06). - [Client Wi-Fi Inventory](reference_client_wifi_inventory.md) — Building a fleet Wi-Fi list to connect onsite without asking. Passwords → vault `clients/<slug>/wifi.sops.yaml` (`credentials.<key>_ssid/_password`); readable index → `wiki/reference/client-wifi.md`. `/wifi` importer deferred (structure-only 2026-07-06).
- [Discord read replies](feedback_discord_read_replies.md) — Discord DM replies don't come through coord/repo sync. Use `discord-dm.sh read <user>` to see if mike/winter/rob actually answered before assuming silence.
- [MSP Audit Scripts](reference_msp_audit_scripts.md) — server_audit.ps1 / workstation_audit.ps1 at projects/msp-tools/msp-audit-scripts/. - [MSP Audit Scripts](reference_msp_audit_scripts.md) — server_audit.ps1 / workstation_audit.ps1 at projects/msp-tools/msp-audit-scripts/.
- [Pluto Build Server](reference_pluto_build_server.md) — Windows build VM: hostname PLUTO = Unraid VM "Claude-Builder" = 172.16.3.36 (all the same box). MSVC + WiX + Azure Trusted Signing. Drive via /rmm (agent enrolls as PLUTO) when SSH key isn't authorized. - [Pluto Build Server](reference_pluto_build_server.md) — Windows build VM: hostname PLUTO = Unraid VM "Claude-Builder" = 172.16.3.36 (all the same box). MSVC + WiX + Azure Trusted Signing. Drive via /rmm (agent enrolls as PLUTO) when SSH key isn't authorized.
- [Coord /messages API shape](reference_coord_messages_api_shape.md) — GET /api/coord/messages returns {total,skip,limit,messages[]} NOT a bare array; parse .messages[], strip control chars, read flag may be null. - [Coord /messages API shape](reference_coord_messages_api_shape.md) — GET /api/coord/messages returns {total,skip,limit,messages[]} NOT a bare array; parse .messages[], strip control chars, read flag may be null.

View File

@@ -0,0 +1,26 @@
---
name: feedback_discord_read_replies
description: Discord DM replies are invisible to coord/repo sync — use `discord-dm.sh read <user>` to see if mike/winter/rob actually answered.
metadata:
type: feedback
---
When we DM someone via the `discord-dm` skill and wait on an answer, their reply does NOT
come through coord messages or repo sync — those channels never carry Discord replies. Before
telling the user "no reply yet / they didn't answer," READ the DM channel:
```bash
bash .claude/scripts/discord-dm.sh read mike 10 # last 10 in the mike DM
bash .claude/scripts/discord-dm.sh read #dev-alerts # a channel
```
Output is oldest-first; lines marked `>>>` are from THEM (replies), indented lines are us.
**Why:** the bot participates in every DM channel it opened, so `GET /channels/<id>/messages`
returns full content — the Message Content privileged intent only gates gateway events, not this
REST fetch. Before adding `read` (2026-07-07, Howard flagged it) the wrapper was send-only, so
replies from mike/winter were silently missed.
**How to apply:** after DMing a question to mike/winter/rob, `read` that user to check for their
answer instead of assuming silence. Related: [[reference_community_forum]] is a different channel;
this is Discord DMs/channels via [[discord-dm]] (`.claude/scripts/discord-dm.sh`).

View File

@@ -6,6 +6,7 @@
# Usage: # Usage:
# discord-dm.sh <recipient> "message text" # discord-dm.sh <recipient> "message text"
# echo "message text" | discord-dm.sh <recipient> # echo "message text" | discord-dm.sh <recipient>
# discord-dm.sh read <recipient> [limit] # READ recent messages — SEE replies (default 15)
# discord-dm.sh list # show known users + channels # discord-dm.sh list # show known users + channels
# #
# <recipient> is one of: # <recipient> is one of:
@@ -51,11 +52,29 @@ if [ -z "$RECIPIENT" ] || [ "$RECIPIENT" = "-h" ] || [ "$RECIPIENT" = "--help" ]
sed -n '2,30p' "$0"; exit 1 sed -n '2,30p' "$0"; exit 1
fi fi
if [ "$RECIPIENT" = "list" ]; then print_dir; exit 0; fi if [ "$RECIPIENT" = "list" ]; then print_dir; exit 0; fi
# --- read mode: fetch recent messages so we can SEE replies (mike/winter/etc.).
# `discord-dm.sh read <user|#channel> [limit]` — reuses the recipient resolution,
# token, and DM-channel-open below, then prints history instead of sending. The
# bot participates in each DM channel it opened, so REST history returns full
# content (the Message Content intent only gates gateway events, not this fetch).
ACTION=send
if [ "$RECIPIENT" = "read" ] || [ "$RECIPIENT" = "inbox" ]; then
ACTION=read; shift
RECIPIENT="${1:-}"
[ -z "$RECIPIENT" ] && { echo "[ERROR] usage: discord-dm.sh read <user|#channel> [limit]" >&2; exit 1; }
fi
shift shift
# --- message (remaining args, else stdin) --- # --- message (send) or limit (read) ---
if [ "$#" -gt 0 ]; then MSG="$*"; elif [ ! -t 0 ]; then MSG="$(cat)"; else MSG=""; fi if [ "$ACTION" = "read" ]; then
if [ -z "$MSG" ]; then echo "[ERROR] empty message — nothing sent" >&2; exit 1; fi READ_LIMIT="${1:-15}"
printf '%s' "$READ_LIMIT" | grep -qE '^[0-9]+$' || READ_LIMIT=15
[ "$READ_LIMIT" -gt 100 ] && READ_LIMIT=100
else
if [ "$#" -gt 0 ]; then MSG="$*"; elif [ ! -t 0 ]; then MSG="$(cat)"; else MSG=""; fi
if [ -z "$MSG" ]; then echo "[ERROR] empty message — nothing sent" >&2; exit 1; fi
fi
# --- resolve recipient -> mode (dm|channel) + target id --- # --- resolve recipient -> mode (dm|channel) + target id ---
MODE=""; TARGET=""; LABEL="" MODE=""; TARGET=""; LABEL=""
@@ -99,6 +118,22 @@ if [ "$MODE" = "dm" ]; then
TARGET="$CHID" TARGET="$CHID"
fi fi
# --- read mode: fetch + print recent messages, then exit (no send) ---
if [ "$ACTION" = "read" ]; then
MSGS="$(curl -s -m 20 "${auth[@]}" "$API/channels/${TARGET}/messages?limit=${READ_LIMIT}")"
if ! printf '%s' "$MSGS" | jq -e 'type=="array"' >/dev/null 2>&1; then
echo "[ERROR] could not read $LABEL: $(printf '%s' "$MSGS" | head -c 200)" >&2
bash "$ROOT/.claude/scripts/log-skill-error.sh" "discord-dm" "read history failed for $LABEL" --context "resp=$(printf '%s' "$MSGS" | head -c 80)" >/dev/null 2>&1
exit 3
fi
echo "[OK] discord-dm: last ${READ_LIMIT} message(s) in ${LABEL} (oldest first; '>>>' = reply from them, ' ' = us):"
printf '%s' "$MSGS" | jq -r 'reverse[] |
((if (.author.bot // false) then " " else ">>> " end)
+ (.timestamp[0:16]) + " " + .author.username + ": "
+ ((.content // "") | gsub("\n";" ")))'
exit 0
fi
# --- chunk: Discord caps content at 2000 chars (code 50035 on overflow). # --- chunk: Discord caps content at 2000 chars (code 50035 on overflow).
# This tool's job is delivering LONG content intact, so split into <=1900-char # This tool's job is delivering LONG content intact, so split into <=1900-char
# pieces (preferring newline boundaries) and send them in order — no markers # pieces (preferring newline boundaries) and send them in order — no markers

View File

@@ -1,6 +1,6 @@
--- ---
name: discord-dm name: discord-dm
description: "Send a Discord message to an org member DM or team channel via the ClaudeTools bot - copy-paste-friendly delivery of links/commands the terminal would mangle; address people by name (mike/howard/rob/winter). Triggers: DM <person> in discord, send that link to my discord, ping <person>." description: "Send OR read Discord messages to/from an org member DM or team channel via the ClaudeTools bot - copy-paste-friendly delivery of links/commands the terminal would mangle, and READ replies (coord/repo sync does not carry Discord answers); address people by name (mike/howard/rob/winter). Triggers: DM <person> in discord, send that link to my discord, ping <person>, did <person> reply/answer, read discord replies, check discord DMs."
--- ---
# discord-dm — direct Discord messaging to the org # discord-dm — direct Discord messaging to the org
@@ -27,9 +27,26 @@ DMs** and deliberate channel posts.
```bash ```bash
bash .claude/scripts/discord-dm.sh <recipient> "message text" bash .claude/scripts/discord-dm.sh <recipient> "message text"
echo "message text" | bash .claude/scripts/discord-dm.sh <recipient> echo "message text" | bash .claude/scripts/discord-dm.sh <recipient>
bash .claude/scripts/discord-dm.sh read <recipient> [limit] # READ recent messages — SEE replies (default 15)
bash .claude/scripts/discord-dm.sh list # print known users + channels bash .claude/scripts/discord-dm.sh list # print known users + channels
``` ```
## Reading replies (`read`)
Sends are one-way, but people **answer** — always `read` before assuming silence. The bot
participates in every DM channel it opened, so `GET /channels/<id>/messages` returns full
content (the Message Content privileged intent only gates *gateway* events, not this REST
fetch). Works for users and channels:
```bash
bash .claude/scripts/discord-dm.sh read mike 10 # last 10 in the mike DM
bash .claude/scripts/discord-dm.sh read #dev-alerts # last 15 in #dev-alerts
```
Output is oldest-first; lines from **them** are marked `>>>`, lines from us are indented.
After DMing someone a question, `read` that user to check for their answer — coord/repo sync
does NOT carry Discord replies, so this is the only way to see them.
`<recipient>`: `<recipient>`:
| Form | Effect | | Form | Effect |

View File

@@ -3,29 +3,27 @@
Online = ActiveConnections ProcessType==2 (guest agent connected). Recency = GuestInfoUpdateTime. Online = ActiveConnections ProcessType==2 (guest agent connected). Recency = GuestInfoUpdateTime.
Rebuilt 2026-07-04. Staging installer pushed to all ONLINE machines (land in Staging -> reassign-staging.py). Rebuilt 2026-07-04. Staging installer pushed to all ONLINE machines (land in Staging -> reassign-staging.py).
## ONLINE now (1) ## ONLINE now (2)
- IMC-PRINTSERVER [Instrumental Music Center] (1d) - IMC-PRINTSERVER [Instrumental Music Center] (2d)
- WILLCOXDOTADMIN [Reliant Well Drilling and Pump Corporate] (0d)
## active <=14d (13) ## active <=14d (10)
- KAT1 [Business Services of Tucson LLC] (0d) - KAT1 [Business Services of Tucson LLC] (1d)
- HSM-CATHY [Horseshoe Management] (3d) - IMC-M-EDSERVICE [Instrumental Music Center] (0d)
- IMC-M-EDSERVICE [Instrumental Music Center] (4d)
- LAPTOP-PNVA9G51 [Instrumental Music Center] (6d) - LAPTOP-PNVA9G51 [Instrumental Music Center] (6d)
- REPAIRADMIN [Instrumental Music Center] (3d) - REPAIRADMIN [Instrumental Music Center] (4d)
- PLS-SERVER [PUTT LAND SURVEYING, INC.] (9d) - PLS-SERVER [PUTT LAND SURVEYING, INC.] (10d)
- LAPTOP-73UDDTTK [Pro-Tech Services] (3d) - DESKTOP-ARNPE1U [Safesite] (4d)
- WILLCOXDOTADMIN [Reliant Well Drilling and Pump Corporate] (3d) - DESKTOP-V3H99FC [Safesite] (4d)
- DESKTOP-ARNPE1U [Safesite] (3d)
- DESKTOP-V3H99FC [Safesite] (3d)
- DESKTOP-V9F9L23 [Safesite] (0d) - DESKTOP-V9F9L23 [Safesite] (0d)
- JEREE [Stamback Septic] (3d) - JEREE [Stamback Septic] (4d)
- DESKTOP-6HT5SJ9 [The Marc Group] (0d) - DESKTOP-6HT5SJ9 [The Marc Group] (0d)
## stale 15-45d (4) ## stale 15-45d (4)
- GND-L-3 [Grabb & Durando Law Office] (22d) - GND-L-3 [Grabb & Durando Law Office] (23d)
- DESKTOP-KRHQ5TS [Instrumental Music Center] (17d) - DESKTOP-KRHQ5TS [Instrumental Music Center] (18d)
- RWD-ALLENDESKTO [Reliant Well Drilling and Pump Corporate] (20d) - RWD-ALLENDESKTO [Reliant Well Drilling and Pump Corporate] (20d)
- DESKTOP-FMDIK0Q [Safesite] (44d) - DESKTOP-FMDIK0Q [Safesite] (45d)
## dead/no-session (58) ## dead/no-session (58)
- DESKTOP-SUFJR0J [Bill Tedards] (no SC) - DESKTOP-SUFJR0J [Bill Tedards] (no SC)
@@ -40,22 +38,22 @@ Rebuilt 2026-07-04. Staging installer pushed to all ONLINE machines (land in Sta
- Sheila’s MacBook Pro [Heieck, Sheila] (no SC) - Sheila’s MacBook Pro [Heieck, Sheila] (no SC)
- HSM-RANDI [Horseshoe Management] (no SC) - HSM-RANDI [Horseshoe Management] (no SC)
- HSM-SURFACE [Horseshoe Management] (no SC) - HSM-SURFACE [Horseshoe Management] (no SC)
- DESKTOP-JQ0D38J [Instrumental Music Center] (107d) - DESKTOP-JQ0D38J [Instrumental Music Center] (108d)
- DESKTOP-URV3UGR [Instrumental Music Center] (81d) - DESKTOP-URV3UGR [Instrumental Music Center] (82d)
- IMC-EVENTS [Instrumental Music Center] (112d) - IMC-EVENTS [Instrumental Music Center] (113d)
- IMC-L1-GRAPHICS [Instrumental Music Center] (no SC) - IMC-L1-GRAPHICS [Instrumental Music Center] (no SC)
- PHIL [Instrumental Music Center] (no SC) - PHIL [Instrumental Music Center] (no SC)
- PHIL2021LAPTOP [Instrumental Music Center] (143d) - PHIL2021LAPTOP [Instrumental Music Center] (144d)
- PURCHASINGCOMP [Instrumental Music Center] (81d) - PURCHASINGCOMP [Instrumental Music Center] (82d)
- LHLH [Little Hearts Little Hands] (no SC) - LHLH [Little Hearts Little Hands] (no SC)
- WIN-KNVO6MUMMEM [Little Hearts Little Hands] (no SC) - WIN-KNVO6MUMMEM [Little Hearts Little Hands] (no SC)
- CPC-chris-UZR6E [MVAN Enterprises Inc] (no SC) - CPC-chris-UZR6E [MVAN Enterprises Inc] (no SC)
- DESKTOP-I7504C5 [MVAN Enterprises Inc] (no SC) - DESKTOP-I7504C5 [MVAN Enterprises Inc] (no SC)
- June’s MacBook Pro [MVAN Enterprises Inc] (no SC) - June’s MacBook Pro [MVAN Enterprises Inc] (no SC)
- MITCH-LAPTOP [MVAN Enterprises Inc] (140d) - MITCH-LAPTOP [MVAN Enterprises Inc] (141d)
- DESKTOP-3VPT017 [Mineralogical Record] (no SC) - DESKTOP-3VPT017 [Mineralogical Record] (no SC)
- DESKTOP-9QHSCIT [Mineralogical Record] (no SC) - DESKTOP-9QHSCIT [Mineralogical Record] (no SC)
- DESKTOP-S1HPLDF [Multicultural Counseling Center] (66d) - DESKTOP-S1HPLDF [Multicultural Counseling Center] (67d)
- PLS-FOUR [PUTT LAND SURVEYING, INC.] (no SC) - PLS-FOUR [PUTT LAND SURVEYING, INC.] (no SC)
- PLS-FRONT [PUTT LAND SURVEYING, INC.] (no SC) - PLS-FRONT [PUTT LAND SURVEYING, INC.] (no SC)
- PLS-LAPTOP [PUTT LAND SURVEYING, INC.] (no SC) - PLS-LAPTOP [PUTT LAND SURVEYING, INC.] (no SC)
@@ -72,10 +70,10 @@ Rebuilt 2026-07-04. Staging installer pushed to all ONLINE machines (land in Sta
- RELIANT-L01 [Reliant Well Drilling and Pump Corporate] (no SC) - RELIANT-L01 [Reliant Well Drilling and Pump Corporate] (no SC)
- RELIANT-L02 [Reliant Well Drilling and Pump Corporate] (no SC) - RELIANT-L02 [Reliant Well Drilling and Pump Corporate] (no SC)
- RELIANT-L03 [Reliant Well Drilling and Pump Corporate] (no SC) - RELIANT-L03 [Reliant Well Drilling and Pump Corporate] (no SC)
- RWD-ALANLAPTOP [Reliant Well Drilling and Pump Corporate] (128d) - RWD-ALANLAPTOP [Reliant Well Drilling and Pump Corporate] (129d)
- WILCOXADMIN [Reliant Well Drilling and Pump Corporate] (no SC) - WILCOXADMIN [Reliant Well Drilling and Pump Corporate] (no SC)
- 1225-LENOVO-E16 [Safesite] (51d) - 1225-LENOVO-E16 [Safesite] (52d)
- DESKTOP-QAR6D04 [Safesite] (144d) - DESKTOP-QAR6D04 [Safesite] (145d)
- DEREK-LAPTOP [Stamback Septic] (no SC) - DEREK-LAPTOP [Stamback Septic] (no SC)
- DESKTOP-1BS5JL4 [Stamback Septic] (no SC) - DESKTOP-1BS5JL4 [Stamback Septic] (no SC)
- DESKTOP-JVLQQIJ [Stamback Septic] (no SC) - DESKTOP-JVLQQIJ [Stamback Septic] (no SC)
@@ -83,6 +81,6 @@ Rebuilt 2026-07-04. Staging installer pushed to all ONLINE machines (land in Sta
- STAMBACK-JBECK [Stamback Septic] (no SC) - STAMBACK-JBECK [Stamback Septic] (no SC)
- STAMBACK-NEW06 [Stamback Septic] (no SC) - STAMBACK-NEW06 [Stamback Septic] (no SC)
- STAMBACK-NEW06 [Stamback Septic] (no SC) - STAMBACK-NEW06 [Stamback Septic] (no SC)
- LAPTOP-JMUNGO [The Marc Group] (56d) - LAPTOP-JMUNGO [The Marc Group] (57d)
- DESKTOP-SRUOH4R [The Prairie Schooner] (no SC) - DESKTOP-SRUOH4R [The Prairie Schooner] (no SC)
- DESKTOP-TS1P9MT [The Prairie Schooner] (no SC) - DESKTOP-TS1P9MT [The Prairie Schooner] (no SC)