sync: auto-sync from GURU-5070 at 2026-06-07 08:15:08

Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-06-07 08:15:08
This commit is contained in:
2026-06-07 08:15:11 -07:00
parent 261988956d
commit 8f6f7cabb2
6 changed files with 64 additions and 409 deletions

View File

@@ -1,20 +0,0 @@
# Howard Bootstrap — Project State
> Last updated: 2026-04-20
**Status:** STALLED
**Last Activity:** 2026-04-16
Bootstrap/onboarding setup for Howard's workstation and ClaudeTools integration. The directory contains only a README.txt, keys.txt, and setup.bat — minimal scaffolding. No substantive development has occurred.
## What Was Done
- Basic directory structure created
- setup.bat and keys.txt staged for Howard's initial machine setup
- No session logs recorded
## If Resuming
- Check `README.txt` for any setup instructions captured
- Determine what Howard still needs configured (vault access, git config, identity.json on his machine)
- Follow ONBOARDING.md process in `.claude/` for any new-machine setup steps

View File

@@ -1,42 +0,0 @@
AZ Computer Guru - ClaudeTools Setup
=====================================
This package sets up the Claude Code workspace on your machine.
WHAT'S INCLUDED:
setup.bat - Run this first. It installs everything.
keys.txt - Vault decryption key (if Mike included it)
README.txt - This file
WHAT IT DOES:
1. Checks for prerequisites (git, claude, python, sops)
- Auto-installs missing ones via winget
2. Clones the shared ClaudeTools repo from Gitea
3. Clones the encrypted credential vault
4. Sets up the decryption key for vault access
5. Creates a "ClaudeTools" shortcut on your desktop
HOW TO RUN:
1. Extract this zip to any drive (e.g., D:\)
2. Double-click setup.bat
3. Follow the prompts (you'll be asked for your Gitea
password on first clone - ask Mike)
4. After setup, double-click "ClaudeTools" on your desktop
5. Claude will introduce itself and walk you through everything
YOUR GITEA ACCOUNT:
URL: https://git.azcomputerguru.com
Username: howard
Password: Ask Mike (you'll change it on first login)
IF SOMETHING GOES WRONG:
- Close and re-run setup.bat (it's safe to run multiple times)
- If git clone fails: check network/VPN/Tailscale connection
- If vault fails: make sure keys.txt is at
%APPDATA%\sops\age\keys.txt
- Ask Mike or ask Claude (once it's running)
AFTER SETUP:
Your workspace lives at <drive>:\claudetools
Credentials vault at <drive>:\vault
Everything syncs to Gitea automatically via /sync command

View File

@@ -1,168 +0,0 @@
@echo off
setlocal EnableExtensions
title AZ Computer Guru - ClaudeTools Laptop Fix
color 0B
rem ============================================================
rem ClaudeTools - Laptop Fix (Howard)
rem ------------------------------------------------------------
rem 1) Installs the programs Claude needs (git, node, claude,
rem python, sops).
rem 2) Stops the "Claude hangs then closes when opened from the
rem claudetools folder" bug by disabling the grepai MCP
rem server (its binary, grepai.exe, is missing on this PC).
rem 3) Makes a desktop launcher that stays open on errors.
rem
rem Safe to run more than once. Targets C:\claudetools.
rem ============================================================
set "BASE=C:\claudetools"
set "SCRIPT_DIR=%~dp0"
set "NEEDS_RESTART=0"
echo ============================================
echo ClaudeTools - Laptop Fix
echo ============================================
echo.
echo Installs required programs and stops the
echo hang-then-close problem when opening Claude.
echo.
echo Press any key to start, or close to cancel.
pause >nul
echo.
echo [1/4] Installing required programs...
where winget >nul 2>&1
if errorlevel 1 echo [WARNING] winget missing. Install "App Installer" from the Microsoft Store, then re-run.
rem --- git (also provides Git Bash, used by the repo) ---
where git >nul 2>&1
if errorlevel 1 (
echo [..] installing git...
winget install --id Git.Git -e --accept-package-agreements --accept-source-agreements
set "NEEDS_RESTART=1"
) else (
echo [OK] git
)
rem --- node (Claude Code runs on Node) ---
where node >nul 2>&1
if errorlevel 1 (
echo [..] installing Node.js LTS...
winget install --id OpenJS.NodeJS.LTS -e --accept-package-agreements --accept-source-agreements
set "NEEDS_RESTART=1"
) else (
echo [OK] node
)
rem --- python ---
where py >nul 2>&1
if errorlevel 1 (
where python >nul 2>&1
if errorlevel 1 (
echo [..] installing Python...
winget install --id Python.Python.3.12 -e --accept-package-agreements --accept-source-agreements
set "NEEDS_RESTART=1"
) else (
echo [OK] python
)
) else (
echo [OK] python
)
rem --- sops (vault decryption) ---
where sops >nul 2>&1
if errorlevel 1 (
echo [..] installing SOPS...
winget install --id Mozilla.sops -e --accept-package-agreements --accept-source-agreements
) else (
echo [OK] sops
)
if "%NEEDS_RESTART%"=="1" (
echo.
echo ============================================
echo New programs were installed. CLOSE this
echo window and RUN THIS SCRIPT AGAIN so they
echo are on PATH. The second run finishes up.
echo ============================================
echo.
pause
exit /b 0
)
echo.
echo [2/4] Installing / updating Claude Code...
call npm install -g @anthropic-ai/claude-code
if errorlevel 1 (
echo [WARNING] Claude Code install reported an error - continuing.
) else (
echo [OK] Claude Code installed/updated
)
echo.
echo [3/4] Installing grepai + configuring MCP ^(stops the hang^)...
if not exist "%BASE%" (
echo [WARNING] %BASE% not found. Make sure ClaudeTools is at %BASE%, then re-run.
goto :launcher
)
rem --- install grepai.exe shipped alongside this script ---
if exist "%SCRIPT_DIR%grepai.exe" (
copy /Y "%SCRIPT_DIR%grepai.exe" "%BASE%\grepai.exe" >nul
echo [OK] grepai.exe copied to %BASE%
) else (
echo [..] grepai.exe not in this package - will disable the MCP server instead
)
if not exist "%BASE%\.claude" (
echo [WARNING] %BASE%\.claude not found.
echo Make sure ClaudeTools is at %BASE%, then re-run.
goto :launcher
)
set "SL=%BASE%\.claude\settings.local.json"
if exist "%SL%" copy /Y "%SL%" "%SL%.bak" >nul
if exist "%BASE%\grepai.exe" (
> "%SL%" echo {
>>"%SL%" echo "env": { "CLAUDETOOLS_ROOT": "C:/claudetools" }
>>"%SL%" echo }
echo [OK] grepai.exe present - left enabled
) else (
> "%SL%" echo {
>>"%SL%" echo "env": { "CLAUDETOOLS_ROOT": "C:/claudetools" },
>>"%SL%" echo "disabledMcpjsonServers": ["grepai"]
>>"%SL%" echo }
echo [OK] grepai MCP server disabled - Claude will no longer hang
)
if exist "%SL%.bak" echo ^(old settings backed up to settings.local.json.bak^)
:launcher
echo.
echo [4/4] Creating desktop launcher...
set "SHORTCUT=%USERPROFILE%\Desktop\ClaudeTools.bat"
> "%SHORTCUT%" echo @echo off
>>"%SHORTCUT%" echo title ClaudeTools - AZ Computer Guru
>>"%SHORTCUT%" echo cd /d C:\claudetools
>>"%SHORTCUT%" echo claude %%*
>>"%SHORTCUT%" echo if errorlevel 1 (
>>"%SHORTCUT%" echo echo.
>>"%SHORTCUT%" echo echo [WARNING] Claude exited with an error - window kept open so you can read it.
>>"%SHORTCUT%" echo pause
>>"%SHORTCUT%" echo ^)
echo [OK] created %SHORTCUT%
echo.
echo ============================================
echo Done
echo ============================================
echo.
where claude >nul 2>&1 && claude --version || echo [WARNING] claude not on PATH yet - open a NEW window.
echo.
echo Open a NEW window, then double-click "ClaudeTools"
echo on your Desktop. It should open without hanging.
echo.
pause
endlocal

View File

@@ -1,3 +0,0 @@
# created: 2026-03-30T13:53:19-07:00
# public key: age1qz7ct84m50u06h97artqddkj3c8se2yu4nxu59clq8rhj945jc0s5excpr
AGE-SECRET-KEY-1DE3V6V0ZLLZ45A7GA77M79CTN4LZQMTRCURP8VRGNLV6T2FSZEEQXUW2EU

View File

@@ -1,176 +0,0 @@
@echo off
setlocal EnableDelayedExpansion
title AZ Computer Guru - ClaudeTools Setup
color 0A
echo ============================================
echo AZ Computer Guru - ClaudeTools Bootstrap
echo ============================================
echo.
echo This sets up the Claude Code workspace on
echo this machine. Takes about 5 minutes.
echo.
echo Press any key to start, or Ctrl+C to cancel.
pause >nul
:: Determine target drive (same drive as this script)
set "DRIVE=%~d0"
set "BASE=%DRIVE%\claudetools"
set "VAULT=%DRIVE%\vault"
set "AGE_DIR=%APPDATA%\sops\age"
set "SCRIPT_DIR=%~dp0"
echo.
echo [1/7] Checking prerequisites...
:: Check git
where git >nul 2>&1
if %ERRORLEVEL% neq 0 (
echo [!] git not found. Installing via winget...
winget install --id Git.Git -e --accept-package-agreements --accept-source-agreements
echo [!] Please close and reopen this script after git installs.
pause
exit /b 1
)
echo [OK] git found
:: Check claude
where claude >nul 2>&1
if %ERRORLEVEL% neq 0 (
echo [!] Claude Code not found. Installing...
winget install --id Anthropic.ClaudeCode -e --accept-package-agreements --accept-source-agreements 2>nul
if %ERRORLEVEL% neq 0 (
echo [!] winget install failed. Try: npm install -g @anthropic-ai/claude-code
echo OR download from https://claude.ai/download
pause
exit /b 1
)
)
echo [OK] Claude Code found
:: Check sops
where sops >nul 2>&1
if %ERRORLEVEL% neq 0 (
echo [!] SOPS not found. Installing via winget...
winget install --id Mozilla.sops -e --accept-package-agreements --accept-source-agreements
)
echo [OK] SOPS found
:: Check python
where python >nul 2>&1
if %ERRORLEVEL% neq 0 (
echo [!] Python not found. Installing via winget...
winget install --id Python.Python.3.12 -e --accept-package-agreements --accept-source-agreements
echo [!] Please close and reopen this script after Python installs.
pause
exit /b 1
)
echo [OK] Python found
echo.
echo [2/7] Setting up age decryption key...
if not exist "%AGE_DIR%" mkdir "%AGE_DIR%"
if exist "%SCRIPT_DIR%keys.txt" (
copy /Y "%SCRIPT_DIR%keys.txt" "%AGE_DIR%\keys.txt" >nul
echo [OK] Age key installed from bootstrap package
) else if exist "%AGE_DIR%\keys.txt" (
echo [OK] Age key already present
) else (
echo [!!] Age decryption key not found!
echo.
echo Ask Mike for the keys.txt file and place it at:
echo %AGE_DIR%\keys.txt
echo.
echo Without this file, credential vault access won't work.
echo Setup will continue but vault commands will fail until
echo the key is in place.
echo.
pause
)
echo.
echo [3/7] Cloning ClaudeTools repo...
if not exist "%BASE%\.git" (
git clone https://howard@git.azcomputerguru.com/azcomputerguru/claudetools.git "%BASE%"
if %ERRORLEVEL% neq 0 (
echo [!] Clone failed. Check your Gitea credentials.
echo Username: howard
echo Password: ask Mike for initial password
pause
exit /b 1
)
echo [OK] Cloned to %BASE%
) else (
echo [OK] Already exists, pulling latest...
cd /d "%BASE%" && git pull
)
echo.
echo [4/7] Cloning Vault repo...
if not exist "%VAULT%\.git" (
git clone https://howard@git.azcomputerguru.com/azcomputerguru/vault.git "%VAULT%"
if %ERRORLEVEL% neq 0 (
echo [!] Vault clone failed. Check credentials.
pause
exit /b 1
)
echo [OK] Cloned to %VAULT%
) else (
echo [OK] Already exists, pulling latest...
cd /d "%VAULT%" && git pull
)
echo.
echo [5/7] Configuring git identity...
cd /d "%BASE%"
git config user.name "Howard Enos"
git config user.email "howard@azcomputerguru.com"
cd /d "%VAULT%"
git config user.name "Howard Enos"
git config user.email "howard@azcomputerguru.com"
echo [OK] Git identity set to Howard Enos
echo.
echo [6/7] Creating desktop shortcut...
set "SHORTCUT=%USERPROFILE%\Desktop\ClaudeTools.bat"
(
echo @echo off
echo title ClaudeTools - AZ Computer Guru
echo cd /d "%BASE%"
echo claude
) > "%SHORTCUT%"
echo [OK] Created: %SHORTCUT%
echo.
echo [7/7] Verifying setup...
echo Repo: %BASE%
echo Vault: %VAULT%
echo Age key: %AGE_DIR%\keys.txt
if exist "%AGE_DIR%\keys.txt" (
echo Vault: [OK] key present
cd /d "%BASE%"
bash "%VAULT%/scripts/vault.sh" list 2>nul | find /c ".sops.yaml" >nul 2>&1 && echo Decrypt: [OK] vault accessible || echo Decrypt: [!] vault test failed
) else (
echo Vault: [!] key missing - ask Mike
)
echo.
echo ============================================
echo Setup Complete!
echo ============================================
echo.
echo Next steps:
echo 1. Double-click "ClaudeTools" on your desktop
echo 2. Claude will ask who you are - say "Howard"
echo 3. Claude will walk you through the system
echo.
echo If you need the vault key, ask Mike.
echo Your Gitea login: howard / (ask Mike for password)
echo.
pause

View File

@@ -163,3 +163,67 @@ Ran the **3-way Multi-AI review** (Gemini via `agy` + Grok + Claude Code Review
- Real second-model backends: `@google/gemini-cli` (`gemini` npm, v0.45.2, Google OAuth) via `ask-gemini.sh`; grok 0.2.22 via `ask-grok.sh`. Both verified `OK`.
- Memory added: `reference_antigravity_agy_not_headless.md`.
- ff.py: `.claude/scripts/ff.py`, daemon `localhost:9333`, profile `~/.claude/ff-profile`.
---
## Update: 2026-06-07 08:13 PDT — GuruRMM beta dashboard: alert-count fix (prod) + 3 sidebar features (rail expand, light-mode theming, resizable spine)
### Summary
Merged the prior session's infra-spine hitbox + pin branch to gururmm `main` (auto-built to beta). Mike then reported the Alerts page summary chips disagreed with the lists they open. Diagnosed TWO predicate mismatches making the list >= the chip: (1) the Critical/Warning chips counted `status != 'resolved'` but clicked `status:""` (all statuses incl. resolved), and (2) `get_alert_summary` scoped counts to the last 7 days while the alert list has NO time window. Fixed both — chips now click `status:"unresolved"`, and dropped the 7-day window from the summary SQL so all four chips deterministically equal their lists. Code Review APPROVED. Merged `6b4cee4`: the dashboard half to beta, the server `get_alert_summary` change to the SHARED API (= prod immediately).
Mike reported Warning still wrong post-deploy. Diagnosed via the live API + a `gururmm` RMM-agent tail of `/var/log/gururmm-build.log` as DEPLOY TIMING, not a bug: the fast Vite dashboard deployed first while the slow Rust server didn't restart with the dropped window until **14:31:33 UTC** (after he looked). Confirmed corrected: `summary.warning` 2->4, `total` 104->152 (the 2 "missing" warnings were just >7 days old; 0 resolved).
Built three sidebar features (Howard/Mike requests), each Coding-Agent-built + reviewed, each on its own branch -> build-verify -> merge to beta:
- **Rail expand** (`a6d355f`): the far-left FunctionRail gets a persistent toggle (localStorage `gururmm.rail.expanded`, cross-tab) widening it w-12->w-52 with inline labels; expanded mode inlines the "More" items; collapsed unchanged. Code Review APPROVED.
- **Sidebar light-mode theming** (`d2c9236`): the left panes were hardcoded always-dark. Gave the light theme a soft-grey `--sidebar-bg` (95%) / border (88%) and swapped sidebar-surface `text-white/N` -> `text-foreground/N` (1:1 opacity) across FunctionRail/InfrastructureSpine/ContextTree, PRESERVING the white-on-red alert badges + the dark hover tooltip. Dark mode unchanged.
- **Resizable spine** (`3c210e0`): drag the spine's right edge (180-480px, persisted `gururmm.spine.width`); width via inline style, transition off mid-drag; `setPointerCapture` + a teardown ref close the release-outside-window and unmount-mid-drag edge cases; keyboard arrows on the handle. Code Review APPROVED + the 2 robustness fixes applied.
### Key Decisions
- **Alert fix Part 2 = Option B (drop the 7-day window), Mike-approved despite prod impact** (the summary SQL is on the shared API; there is no separate beta API server). `status:"unresolved"` == the summary's `status != 'resolved'` because only 3 statuses exist (active/acknowledged/resolved — verified against schema + every write path).
- **Each sidebar feature is self-contained in its component** (FunctionRail/InfrastructureSpine self-manage state; no Layout.tsx change), reflowing via the existing flex row.
- **Theming preserves white-on-colored** (badge, tooltip) — only sidebar-surface text/bg/border became `foreground` tokens.
- **Did NOT promote beta -> prod** (Mike still reviewing); only the unavoidable server alert-count change is live on prod.
- Deferred the review's FunctionRail DRY (hoist PRIMARY_ITEMS) + `aria-current` nits to a future sidebar touch.
### Problems Encountered
- **Warning chip stale post-deploy** — deploy timing (slow Rust server restart at 14:31:33 UTC after the fast dashboard), not a logic bug. Confirmed via live API + RMM build-log tail.
- **First RMM dispatch failed** (`jq: Invalid numeric literal`) from nested JSON escaping in the command payload; rebuilt with `jq -n --arg` per the /rmm skill.
- Every feature branch needed a rebase onto `main` (CI version-bump commits advance `main` after each merge); each was a clean ff/rebase.
### Configuration Changes (submodule `projects/msp-tools/guru-rmm`, repo `azcomputerguru/gururmm` — NOT the claudetools repo)
- `dashboard/src/pages/Alerts.tsx` + `server/src/db/alerts.rs``6b4cee4` (alert chips + drop 7-day window)
- `dashboard/src/components/FunctionRail.tsx``a6d355f` (rail expand)
- `dashboard/src/index.css` + `FunctionRail.tsx`/`InfrastructureSpine.tsx`/`ContextTree.tsx``d2c9236` (theming)
- `dashboard/src/components/InfrastructureSpine.tsx``3c210e0` (resizable)
- All on `origin/main` (gururmm), deployed to beta; the `alerts.rs` change also on prod. The claudetools submodule pointer is left at pinned `226ba9f` (lagging — expected; not bumped).
### Infrastructure & Servers
- gururmm server `172.16.3.30:3001`; webhook build pipeline -> version bumps -> dashboard (beta web root `/var/www/gururmm/dashboard-beta`) + server (shared API restart). Server restarted **14:31:33 UTC** for the alert fix.
- `gururmm` RMM agent id `5e5a7ebc-95ea-40c8-b965-6ec15d63e157` (the server's own agent; used to tail the build log with no SSH).
- Alert data snapshot (2026-06-07): total 152, critical 23, warning 4 (3 active + 1 acknowledged), 0 resolved warnings.
### Commands & Outputs
- Alert diag: `GET /api/alerts/summary`, `GET /api/alerts?severity=warning&status=unresolved&limit=500` (JWT from vault `infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.*`).
- RMM build-log tail: `POST /api/agents/<id>/command` with a `jq -n --arg`-built shell payload, then poll `/api/commands/<id>`.
- Per feature: `git checkout -b` -> Coding Agent -> Code Review Agent -> `npm run build` (exit 0) -> `git push origin <branch>:main` (ff) -> beta.
### Pending / Incomplete Tasks
- **Promote dashboard beta -> prod** (`sudo /opt/gururmm/promote-dashboard.sh --confirm` on `.30`) when Mike's happy — ships the whole redesign + these 4 dashboard changes. The server alert-count change is already on prod.
- FunctionRail DRY refactor (hoist `PRIMARY_ITEMS`) + `aria-current` (deferred review nits).
- Light-sidebar shade (95%) is a default — tweak after Mike's visual review on beta.
- `ff.py` visual verification of the light-mode sidebar offered (needs that Firefox profile logged into beta).
- Alert list `limit:200` pagination edge (a bucket >200 would show a chip number larger than the visible list) — pre-existing, noted.
- Carried: dev_admin re-login for credential reveal; Robert Wolkin printer type; vault GuruRMM `DATABASE_URL`; SPEC-018 errors; rotate MSP360 key.
### Reference Information
- gururmm `origin/main` this segment: `6b4cee4` alerts, `a6d355f` rail expand, `d2c9236` theming, `3c210e0` resizable spine (on top of prior `fa495ed`/`82e91c8` spine pin/hitbox, also merged this segment).
- New localStorage keys: `gururmm.rail.expanded`, `gururmm.spine.width` (+ `gururmm.spine.pins` from prior).
- beta `https://rmm-beta.azcomputerguru.com`; prod `https://rmm.azcomputerguru.com`.