From 8e8dafe5174aac35677b4c79ba19c86726cd1222 Mon Sep 17 00:00:00 2001 From: Kristof Roomp Date: Thu, 24 Sep 2026 08:26:11 +0200 Subject: [PATCH] Make setup safely refresh runtime Stop the daemon before synchronizing its environment, remove incomplete legacy package metadata, use uv copy mode across filesystems, and keep local or stale files out of packaged extensions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- setup.mjs | 26 ++++++++++++++++++++++++-- vscode-codesearch/.vscodeignore | 3 +++ vscode-codesearch/package.json | 3 ++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/setup.mjs b/setup.mjs index f3b4e91..b25af6b 100644 --- a/setup.mjs +++ b/setup.mjs @@ -16,7 +16,7 @@ import { spawnSync } from 'node:child_process'; import { existsSync, readFileSync, writeFileSync, unlinkSync, linkSync, copyFileSync, - readSync } from 'node:fs'; + readSync, readdirSync, rmSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { randomBytes } from 'node:crypto'; @@ -59,6 +59,17 @@ function commandExists(cmd) { return capture(checker, [cmd]) !== null; } +function removeIncompletePackageMetadata(sitePackages) { + if (!existsSync(sitePackages)) return; + for (const entry of readdirSync(sitePackages, { withFileTypes: true })) { + if (!entry.isDirectory() || !entry.name.endsWith('.dist-info')) continue; + const metadataDir = join(sitePackages, entry.name); + if (existsSync(join(metadataDir, 'RECORD'))) continue; + console.log(` Removing incomplete package metadata: ${entry.name}`); + rmSync(metadataDir, { recursive: true, force: true }); + } +} + function prompt(question) { process.stdout.write(question); const buf = Buffer.alloc(4096); @@ -116,6 +127,14 @@ if (uninstall) { // -- Main setup ---------------------------------------------------------------- +// Stop the daemon before changing its Python environment. The stop command +// waits for the process lock to be released, not just for the HTTP port to close. +step(0, 'Stopping running daemon'); +if (existsSync(join(REPO, 'config.json'))) + runOrDie('node', [join(REPO, 'ts.mjs'), 'stop'], 'ts stop'); +else + console.log(' No config.json yet; nothing to stop.'); + // [1] Register MCP step(1, 'Registering MCP server (Claude Code + GitHub Copilot)'); run('claude', ['mcp', 'remove', '--scope', 'user', 'tscodesearch'], { stdio: 'pipe' }); @@ -181,9 +200,12 @@ step(2, 'Creating client venv (.client-venv)'); runOrDie('uv', ['python', 'install', PYTHON_VER], `uv python install ${PYTHON_VER}`); + removeIncompletePackageMetadata(join(clientVenv, 'Lib', 'site-packages')); + const needsCreate = !existsSync(pyExe); console.log(needsCreate ? ' Installing packages...' : ' Synchronizing packages...'); - runOrDie('uv', ['sync', '--locked', '--no-dev', '--python', PYTHON_VER, '--project', REPO], + runOrDie('uv', ['sync', '--locked', '--no-dev', '--link-mode', 'copy', + '--python', PYTHON_VER, '--project', REPO], 'uv sync', { env: { ...process.env, diff --git a/vscode-codesearch/.vscodeignore b/vscode-codesearch/.vscodeignore index 716deb4..dc065c4 100644 --- a/vscode-codesearch/.vscodeignore +++ b/vscode-codesearch/.vscodeignore @@ -1,4 +1,5 @@ .vscode/** +.claude/** src/** out/test/** node_modules/** @@ -8,3 +9,5 @@ node_modules/** tsconfig.json AGENTS.md setup-vscode-ext.cmd +setup-out.txt +test-virtual-scroll.js diff --git a/vscode-codesearch/package.json b/vscode-codesearch/package.json index bfb7bd3..d792b45 100644 --- a/vscode-codesearch/package.json +++ b/vscode-codesearch/package.json @@ -182,8 +182,9 @@ } }, "scripts": { + "clean": "node -e \"require('fs').rmSync('out',{recursive:true,force:true})\"", "prebuild": "node -e \"var d=new Date();require('fs').writeFileSync('src/buildInfo.ts','export const BUILD_DATE = \\\"'+d.toISOString().slice(0,16).replace('T',' ')+' UTC\\\";\\n')\"", - "precompile": "npm run prebuild", + "precompile": "npm run clean && npm run prebuild", "prewatch": "npm run prebuild", "compile": "tsc -p ./", "watch": "tsc -watch -p ./",