#!/usr/bin/env node import { mkdir, rm, writeFile } from 'node:fs/promises'; import { basename, dirname, join, parse, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; import { isMainModule } from './vsix-targets.mjs'; const SAFE_DIRECTORY_NAME = 'vscode-extension-dev'; const scriptDir = dirname(fileURLToPath(import.meta.url)); const monorepoRoot = resolve(scriptDir, '../../..'); const defaultBaseDir = join(monorepoRoot, '.tmp', SAFE_DIRECTORY_NAME); export async function prepareDevEnvironment(baseDir = defaultBaseDir) { const root = resolve(baseDir); assertSafeRoot(root); await rm(root, { recursive: true, force: true }); const paths = { root, userData: join(root, 'user-data'), extensions: join(root, 'extensions'), kimiHome: join(root, 'kimi-home'), workspace: join(root, 'workspace'), }; await Promise.all( Object.values(paths) .filter((path) => path !== root) .map((path) => mkdir(path, { recursive: true })), ); await writeFile( join(paths.workspace, 'README.md'), '# Isolated Kimi Code extension development workspace\n', ); return paths; } function assertSafeRoot(root) { const parsed = parse(root); if (root === parsed.root || basename(root) !== SAFE_DIRECTORY_NAME) { throw new Error( `Refusing to reset unsafe development directory "${root}"; it must end in ${SAFE_DIRECTORY_NAME}.`, ); } } function parseArguments(argv) { let baseDir = defaultBaseDir; let help = false; for (let index = 0; index < argv.length; index += 1) { const argument = argv[index]; if (argument === '--') { continue; } else if (argument === '--help' || argument === '-h') { help = true; } else if (argument === '--base-dir') { const value = argv[++index]; if (value === undefined || value.startsWith('-')) throw new Error('--base-dir requires a value.'); baseDir = value; } else { throw new Error(`Unknown option: ${argument}`); } } return { baseDir, help }; } async function main() { const options = parseArguments(process.argv.slice(2)); if (options.help) { console.log('Usage: node scripts/prepare-dev.mjs [--base-dir <.../vscode-extension-dev>]'); return; } const paths = await prepareDevEnvironment(options.baseDir); console.log(`Prepared isolated VS Code profile: ${paths.root}`); console.log(`KIMI_CODE_HOME=${paths.kimiHome}`); console.log(`Workspace=${paths.workspace}`); } if (isMainModule(import.meta.url)) { main().catch((error) => { console.error(`Development environment setup failed: ${error instanceof Error ? error.message : String(error)}`); process.exitCode = 1; }); }