Files
claudetools/.claude/PERIODIC_SAVE_INVISIBLE_SETUP.md
Mike Swanson 25f3759ecc [Config] Add coding guidelines and code-fixer agent
Major additions:
- Add CODING_GUIDELINES.md with "NO EMOJIS" rule
- Create code-fixer agent for automated violation fixes
- Add offline mode v2 hooks with local caching/queue
- Add periodic context save with invisible Task Scheduler setup
- Add agent coordination rules and database connection docs

Infrastructure:
- Update hooks: task-complete-v2, user-prompt-submit-v2
- Add periodic_save_check.py for auto-save every 5min
- Add PowerShell scripts: setup_periodic_save.ps1, update_to_invisible.ps1
- Add sync-contexts script for queue synchronization

Documentation:
- OFFLINE_MODE.md, PERIODIC_SAVE_INVISIBLE_SETUP.md
- Migration procedures and verification docs
- Fix flashing window guide

Updates:
- Update agent configs (backup, code-review, coding, database, gitea, testing)
- Update claude.md with coding guidelines reference
- Update .gitignore for new cache/queue directories

Status: Pre-automated-fixer baseline commit

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-17 12:51:43 -07:00

4.6 KiB

Making Periodic Save Task Invisible

Problem

The periodic_save_check.py script shows a flashing console window every minute when run via Task Scheduler.

Solution

Use pythonw.exe instead of python.exe and configure the task to run hidden.


Simply re-run the setup script to recreate the task with invisible settings:

# Run from PowerShell in D:\ClaudeTools
.\.claude\hooks\setup_periodic_save.ps1

This will:

  1. Remove the old task
  2. Create a new task using pythonw.exe (no console window)
  3. Set the task to run hidden
  4. Use S4U logon type (background, no interactive window)

Manual Update (If Automatic Doesn't Work)

Option 1: Via PowerShell

# Get the task
$TaskName = "ClaudeTools - Periodic Context Save"
$Task = Get-ScheduledTask -TaskName $TaskName

# Find pythonw.exe path
$PythonExe = (Get-Command python).Source
$PythonDir = Split-Path $PythonExe -Parent
$PythonwPath = Join-Path $PythonDir "pythonw.exe"

# Update the action to use pythonw.exe
$NewAction = New-ScheduledTaskAction -Execute $PythonwPath `
    -Argument "D:\ClaudeTools\.claude\hooks\periodic_save_check.py" `
    -WorkingDirectory "D:\ClaudeTools"

# Update settings to be hidden
$NewSettings = New-ScheduledTaskSettingsSet `
    -AllowStartIfOnBatteries `
    -DontStopIfGoingOnBatteries `
    -StartWhenAvailable `
    -ExecutionTimeLimit (New-TimeSpan -Minutes 5) `
    -Hidden

# Update principal to run in background (S4U = Service-For-User)
$NewPrincipal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" -LogonType S4U

# Update the task
Set-ScheduledTask -TaskName $TaskName `
    -Action $NewAction `
    -Settings $NewSettings `
    -Principal $NewPrincipal

Option 2: Via Task Scheduler GUI

  1. Open Task Scheduler (taskschd.msc)
  2. Find "ClaudeTools - Periodic Context Save" in Task Scheduler Library
  3. Right-click → Properties

Actions Tab:

  • Click "Edit"
  • Change Program/script from python.exe to pythonw.exe
  • Keep Arguments: D:\ClaudeTools\.claude\hooks\periodic_save_check.py
  • Click OK

General Tab:

  • Check "Hidden" checkbox
  • Under "Configure for:" select "Windows 10" (or your OS version)

Settings Tab:

  • Ensure "Run task as soon as possible after a scheduled start is missed" is checked
  • Ensure "Stop the task if it runs longer than:" is set to 5 minutes
  1. Click OK to save

Verification

Check that the task is configured correctly:

# View task settings
$TaskName = "ClaudeTools - Periodic Context Save"
Get-ScheduledTask -TaskName $TaskName | Select-Object -ExpandProperty Settings

# Should show:
# Hidden: True

# View task action
Get-ScheduledTask -TaskName $TaskName | Select-Object -ExpandProperty Actions

# Should show:
# Execute: ...pythonw.exe  (NOT python.exe)

Key Changes Made

1. pythonw.exe vs python.exe

  • python.exe - Console application (shows command window)
  • pythonw.exe - Windowless application (no console, runs silently)

2. Task Settings

  • Added -Hidden flag to task settings
  • Changed LogonType from Interactive to S4U (Service-For-User)
  • S4U runs tasks in the background without requiring an interactive session

3. Updated Output

The setup script now displays:

  • Confirmation that pythonw.exe is being used
  • Instructions to verify the task is hidden

Troubleshooting

Script still shows window:

  • Verify pythonw.exe is being used: Get-ScheduledTask -TaskName "ClaudeTools - Periodic Context Save" | Select-Object -ExpandProperty Actions
  • Check Hidden setting: Get-ScheduledTask -TaskName "ClaudeTools - Periodic Context Save" | Select-Object -ExpandProperty Settings
  • Ensure LogonType is S4U: Get-ScheduledTask -TaskName "ClaudeTools - Periodic Context Save" | Select-Object -ExpandProperty Principal

pythonw.exe not found:

  • Should be in same directory as python.exe
  • Check: Get-Command python | Select-Object -ExpandProperty Source
  • Then verify pythonw.exe exists in that directory
  • If missing, reinstall Python

Task not running:

  • Check logs: Get-Content D:\ClaudeTools\.claude\periodic-save.log -Tail 20
  • Check task history in Task Scheduler GUI
  • Verify the task is enabled: Get-ScheduledTask -TaskName "ClaudeTools - Periodic Context Save"

Testing

After updating, wait 1 minute and check the logs:

# View recent log entries
Get-Content D:\ClaudeTools\.claude\periodic-save.log -Tail 20

# Should see entries without any console window appearing

Updated: 2026-01-17 Script Location: D:\ClaudeTools\.claude\hooks\setup_periodic_save.ps1