* feat(#607): rebuild get-shit-done-cc → gsd-core migration Leftover get-shit-done-cc installs poisoned the shared update cache, causing a permanent false "update available". Rebuild the migration so a stale old install is both harmless and actively removed. - Per-package update cache filename (gsd-update-check-<slug>.json) in the shared ~/.cache/gsd dir, single-sourced via package-identity; writers stamp package_name and readers reject foreign/absent lineage. Multi- runtime visibility preserved (same shared dir + filename across runtimes). - New get-shit-done/bin/lib/legacy-cleanup.cjs seam: detects code-file references to the old package + the legacy fixed-name cache across home runtime dirs; installer auto-cleans on every install; --dry-run previews and mutates nothing. User hooks and dev-preferences are never touched. - update.md cache-clear globs gsd-update-check*.json across ALL supported runtimes (adds cursor/windsurf/augment/trae/qwen/hermes/codebuddy/cline). - Fix worker MODULE_NOT_FOUND post-install (ship managed-hooks-registry.cjs + degrade gracefully) so the per-package cache is always written. - Diataxis how-to: docs/cleanup-get-shit-done-cc.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(#607): add changeset for PR #611 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(#607): set USERPROFILE alongside HOME in dry-run install test for Windows os.homedir() reads USERPROFILE on win32, so HOME-only isolation let the spawned installer scan the real runner home on windows-latest. Set both. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
67 lines
2.5 KiB
JavaScript
Executable File
67 lines
2.5 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
// gsd-hook-version: {{GSD_VERSION}}
|
|
// 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 { updateCacheFileName } = require('../get-shit-done/bin/lib/package-identity.cjs');
|
|
|
|
const homeDir = os.homedir();
|
|
const cwd = process.cwd();
|
|
|
|
// Detect runtime config directory (supports Claude, OpenCode, Kilo, Gemini)
|
|
// Respects CLAUDE_CONFIG_DIR for custom config directory setups
|
|
function detectConfigDir(baseDir) {
|
|
// Check env override first (supports multi-account setups)
|
|
const envDir = process.env.CLAUDE_CONFIG_DIR;
|
|
if (envDir && fs.existsSync(path.join(envDir, 'get-shit-done', 'VERSION'))) {
|
|
return envDir;
|
|
}
|
|
for (const dir of ['.claude', '.gemini', '.config/kilo', '.kilo', '.config/opencode', '.opencode']) {
|
|
if (fs.existsSync(path.join(baseDir, dir, 'get-shit-done', 'VERSION'))) {
|
|
return path.join(baseDir, dir);
|
|
}
|
|
}
|
|
return envDir || path.join(baseDir, '.claude');
|
|
}
|
|
|
|
const globalConfigDir = detectConfigDir(homeDir);
|
|
const projectConfigDir = detectConfigDir(cwd);
|
|
// Use a shared, tool-agnostic cache directory to avoid multi-runtime
|
|
// resolution mismatches where check-update writes to one runtime's cache
|
|
// but statusline reads from another (#1421).
|
|
const cacheDir = path.join(homeDir, '.cache', 'gsd');
|
|
const cacheFile = path.join(cacheDir, updateCacheFileName);
|
|
|
|
// VERSION file locations (check project first, then global)
|
|
const projectVersionFile = path.join(projectConfigDir, 'get-shit-done', 'VERSION');
|
|
const globalVersionFile = path.join(globalConfigDir, 'get-shit-done', 'VERSION');
|
|
|
|
// Ensure cache directory exists
|
|
if (!fs.existsSync(cacheDir)) {
|
|
fs.mkdirSync(cacheDir, { recursive: true });
|
|
}
|
|
|
|
// Run check in background via a dedicated worker script.
|
|
// Spawning a file (rather than node -e '<inline code>') keeps the worker logic
|
|
// in plain JS with no template-literal regex-escaping concerns, and makes the
|
|
// worker independently testable.
|
|
const workerPath = path.join(__dirname, 'gsd-check-update-worker.js');
|
|
const child = spawn(process.execPath, [workerPath], {
|
|
stdio: 'ignore',
|
|
windowsHide: true,
|
|
detached: true, // Required on Windows for proper process detachment
|
|
env: {
|
|
...process.env,
|
|
GSD_CACHE_FILE: cacheFile,
|
|
GSD_PROJECT_VERSION_FILE: projectVersionFile,
|
|
GSD_GLOBAL_VERSION_FILE: globalVersionFile,
|
|
},
|
|
});
|
|
|
|
child.unref();
|