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 ./",