mirror of
https://github.com/glittercowboy/get-shit-done
synced 2026-04-25 17:25:23 +02:00
On Windows, child.unref() alone is insufficient for proper process detachment. The child process remains in the parent's process group, causing Claude Code to wait for the hook process tree to exit before accepting input. Adding detached: true allows the child process to fully detach on Windows while maintaining existing behavior on Unix. Closes #466 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
63 lines
2.0 KiB
JavaScript
Executable File
63 lines
2.0 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
// Check for GSD updates in background, write result to cache
|
|
// Called by SessionStart hook - runs once per session
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const os = require('os');
|
|
const { spawn } = require('child_process');
|
|
|
|
const homeDir = os.homedir();
|
|
const cwd = process.cwd();
|
|
const cacheDir = path.join(homeDir, '.claude', 'cache');
|
|
const cacheFile = path.join(cacheDir, 'gsd-update-check.json');
|
|
|
|
// VERSION file locations (check project first, then global)
|
|
const projectVersionFile = path.join(cwd, '.claude', 'get-shit-done', 'VERSION');
|
|
const globalVersionFile = path.join(homeDir, '.claude', 'get-shit-done', 'VERSION');
|
|
|
|
// Ensure cache directory exists
|
|
if (!fs.existsSync(cacheDir)) {
|
|
fs.mkdirSync(cacheDir, { recursive: true });
|
|
}
|
|
|
|
// Run check in background (spawn background process, windowsHide prevents console flash)
|
|
const child = spawn(process.execPath, ['-e', `
|
|
const fs = require('fs');
|
|
const { execSync } = require('child_process');
|
|
|
|
const cacheFile = ${JSON.stringify(cacheFile)};
|
|
const projectVersionFile = ${JSON.stringify(projectVersionFile)};
|
|
const globalVersionFile = ${JSON.stringify(globalVersionFile)};
|
|
|
|
// Check project directory first (local install), then global
|
|
let installed = '0.0.0';
|
|
try {
|
|
if (fs.existsSync(projectVersionFile)) {
|
|
installed = fs.readFileSync(projectVersionFile, 'utf8').trim();
|
|
} else if (fs.existsSync(globalVersionFile)) {
|
|
installed = fs.readFileSync(globalVersionFile, 'utf8').trim();
|
|
}
|
|
} catch (e) {}
|
|
|
|
let latest = null;
|
|
try {
|
|
latest = execSync('npm view get-shit-done-cc version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();
|
|
} catch (e) {}
|
|
|
|
const result = {
|
|
update_available: latest && installed !== latest,
|
|
installed,
|
|
latest: latest || 'unknown',
|
|
checked: Math.floor(Date.now() / 1000)
|
|
};
|
|
|
|
fs.writeFileSync(cacheFile, JSON.stringify(result));
|
|
`], {
|
|
stdio: 'ignore',
|
|
windowsHide: true,
|
|
detached: true // Required on Windows for proper process detachment
|
|
});
|
|
|
|
child.unref();
|