diff --git a/.claude/commands/syncro.md b/.claude/commands/syncro.md index a787ae4..092e5c8 100644 --- a/.claude/commands/syncro.md +++ b/.claude/commands/syncro.md @@ -706,11 +706,12 @@ echo "$ALERT_OUT" - Do NOT redo any Syncro writes - The Syncro work is complete; the missed alert is informational only -**Message format:** one line — `[SYNCRO] # () — ` +**Message format:** one line — `[SYNCRO] # () - -> ` -- ``: `mike` → Mike, `howard` → Howard (matches `identity.json` user) +- ``: `mike` -> Mike, `howard` -> Howard (matches `identity.json` user) - Use ticket **number** (`#32164`) in the text; build the link from the numeric **id** - One alert per workflow — billing touches ticket + invoice, send one alert linked to the ticket +- **ASCII only** — use `-` not `—` and `->` not `→`. Unicode characters corrupt in Windows Git Bash and cause Discord to reject the JSON body (400 invalid JSON). **Links:** @@ -724,20 +725,20 @@ echo "$ALERT_OUT" ```bash # Ticket created bash "$CLAUDETOOLS_ROOT/.claude/scripts/post-bot-alert.sh" \ - "[SYNCRO] Howard created #32301 (Desert Auto Tech) — Server won't boot → https://computerguru.syncromsp.com/tickets/110736645" + "[SYNCRO] Howard created #32301 (Desert Auto Tech) - Server won't boot -> https://computerguru.syncromsp.com/tickets/110736645" # Success output: [OK] post-bot-alert: posted to #bot-alerts (message_id=1507055781780918404) # Billed + invoiced bash "$CLAUDETOOLS_ROOT/.claude/scripts/post-bot-alert.sh" \ - "[SYNCRO] Mike billed #32164 (Jerry Burger) — 1.0h remote, \$150.00 → https://computerguru.syncromsp.com/tickets/110169036" + "[SYNCRO] Mike billed #32164 (Jerry Burger) - 1.0h remote, \$150.00 -> https://computerguru.syncromsp.com/tickets/110169036" # Prepaid billing bash "$CLAUDETOOLS_ROOT/.claude/scripts/post-bot-alert.sh" \ - "[SYNCRO] Mike billed #32203 (Desert Auto Tech) — 1.5h onsite, applied 1.5 prepay hrs, \$0.00 → https://computerguru.syncromsp.com/tickets/109895882" + "[SYNCRO] Mike billed #32203 (Desert Auto Tech) - 1.5h onsite, applied 1.5 prepay hrs, \$0.00 -> https://computerguru.syncromsp.com/tickets/109895882" # Ticket status updated bash "$CLAUDETOOLS_ROOT/.claude/scripts/post-bot-alert.sh" \ - "[SYNCRO] Mike resolved #32271 (Peaceful Spirit Massage) — IKEv2 VPN setup complete → https://computerguru.syncromsp.com/tickets/110169036" + "[SYNCRO] Mike resolved #32271 (Peaceful Spirit Massage) - IKEv2 VPN setup complete -> https://computerguru.syncromsp.com/tickets/110169036" ``` The script uses `jq` to build the JSON payload, so quotes and `$` in the message are safe. The script has a 15-second curl timeout and soft-fails on token missing, network error, or non-200 Discord response. diff --git a/.claude/memory/MEMORY.md b/.claude/memory/MEMORY.md index 4b5a242..8d716fc 100644 --- a/.claude/memory/MEMORY.md +++ b/.claude/memory/MEMORY.md @@ -27,6 +27,7 @@ - [GuruRMM agent parity rule](feedback_gururmm_agent_parity.md) — "Add feature X to the agent" = Windows + Linux + macOS in the same change, no exceptions. Stub + TODO if real impl not feasible. - [D2TESTNAS SSH Access](feedback_d2testnas_ssh.md) - Use root@192.168.0.9 with Paper123!@#, not sysadmin - [Bypass Permissions Setting](feedback_bypass_permissions_setting.md) - Set permissions.defaultMode to bypassPermissions in settings.json on all machines +- [No indented code blocks](feedback_no_indented_code_blocks.md) — Never indent code inside fences; Howard copy-pastes directly and leading spaces break PowerShell - [365 Remediation Tool](feedback_365_remediation_tool.md) - Always means Graph API app fabb3421, not CIPP - [Ollama Tier-0 Routing](feedback_ollama_tier0_routing.md) - Route drafts/summaries/classifications through Ollama (qwen3:14b). Mike designed ClaudeTools this way — not optional. - [/save writes narrative directly](feedback_save_no_ollama.md) — No Ollama for /save; write all sections inline — too slow diff --git a/.claude/memory/feedback_no_indented_code_blocks.md b/.claude/memory/feedback_no_indented_code_blocks.md new file mode 100644 index 0000000..0b88fe7 --- /dev/null +++ b/.claude/memory/feedback_no_indented_code_blocks.md @@ -0,0 +1,12 @@ +--- +name: feedback_no_indented_code_blocks +description: Never indent code inside code blocks — Howard copy-pastes directly and leading spaces break PowerShell commands +metadata: + type: feedback +--- + +Never indent code inside markdown code blocks. Howard copy-pastes commands directly from the chat and leading spaces cause PowerShell parse errors. All code must start at column 0 inside the fences. + +**Why:** Howard reported that indented code blocks consistently fail when pasted into PowerShell and he has to manually strip the indentation every time. + +**How to apply:** Every PowerShell (and bash/other) code block — start all lines at column 0, no leading spaces or tabs inside the fences. diff --git a/clients/cascades-tucson/scripts/new-home-folder.ps1 b/clients/cascades-tucson/scripts/new-home-folder.ps1 new file mode 100644 index 0000000..d7b183d --- /dev/null +++ b/clients/cascades-tucson/scripts/new-home-folder.ps1 @@ -0,0 +1,17 @@ +function New-HomeFolder { +param([string]$Username) +$path = "D:\Homes\$Username" +if (Test-Path $path) { Write-Host "$path already exists - check ACL manually"; return } +New-Item -ItemType Directory -Path $path -Force | Out-Null +$acl = New-Object System.Security.AccessControl.DirectorySecurity +$acl.SetAccessRuleProtection($true, $false) +$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule("CASCADES\$Username","FullControl","ContainerInherit,ObjectInherit","None","Allow"))) +$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM","FullControl","ContainerInherit,ObjectInherit","None","Allow"))) +$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Administrators","FullControl","ContainerInherit,ObjectInherit","None","Allow"))) +Set-Acl $path $acl +Write-Host "$path created with clean ACL" +} + +# Usage: dot-source this file, then call: +# New-HomeFolder -Username "lauren.hasselman" +# Run on CS-SERVER before adding user to SG-FolderRedirect.