diff --git a/changelog.md b/changelog.md index 38cf11a..ae90f75 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,12 @@ # Changelog +## 2025-05-26 - 2.3.0 - feat(cli) +Add '--version' option and warn against global tstest usage in the tstest project + +- Introduced a new '--version' CLI flag that prints the version from package.json +- Added logic in ts/index.ts to detect if tstest is run globally within its own project and issue a warning +- Added .claude/settings.local.json to configure allowed permissions for various commands + ## 2025-05-26 - 2.2.6 - fix(tstest) Improve timeout warning timer management and summary output formatting in the test runner. diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 8f9cc88..6c16438 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@git.zone/tstest', - version: '2.2.6', + version: '2.3.0', description: 'a test utility to run tests that match test/**/*.ts' } diff --git a/ts/index.ts b/ts/index.ts index 3c98711..806f01c 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -8,6 +8,40 @@ export enum TestExecutionMode { } export const runCli = async () => { + // Check if we're using global tstest in the tstest project itself + try { + const packageJsonPath = `${process.cwd()}/package.json`; + const fs = await import('fs'); + if (fs.existsSync(packageJsonPath)) { + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); + if (packageJson.name === '@git.zone/tstest') { + // Check if we're running from a global installation + const execPath = process.argv[1]; + // Debug: log the paths (uncomment for debugging) + // console.log('DEBUG: Checking global tstest usage...'); + // console.log('execPath:', execPath); + // console.log('cwd:', process.cwd()); + // console.log('process.argv:', process.argv); + + // Check if this is running from global installation + const isLocalCli = execPath.includes(process.cwd()); + const isGlobalPnpm = process.argv.some(arg => arg.includes('.pnpm') && !arg.includes(process.cwd())); + const isGlobalNpm = process.argv.some(arg => arg.includes('npm/node_modules') && !arg.includes(process.cwd())); + + if (!isLocalCli && (isGlobalPnpm || isGlobalNpm || !execPath.includes('node_modules'))) { + console.error('\n⚠️ WARNING: You are using a globally installed tstest in the tstest project itself!'); + console.error(' This means you are NOT testing your local changes.'); + console.error(' Please use one of these commands instead:'); + console.error(' • node cli.js '); + console.error(' • pnpm test '); + console.error(' • ./cli.js (if executable)\n'); + } + } + } + } catch (error) { + // Silently ignore any errors in this check + } + // Parse command line arguments const args = process.argv.slice(2); const logOptions: LogOptions = {}; @@ -24,6 +58,18 @@ export const runCli = async () => { const arg = args[i]; switch (arg) { + case '--version': + // Get version from package.json + try { + const fs = await import('fs'); + const packagePath = new URL('../package.json', import.meta.url).pathname; + const packageData = JSON.parse(await fs.promises.readFile(packagePath, 'utf8')); + console.log(`tstest version ${packageData.version}`); + } catch (error) { + console.log('tstest version unknown'); + } + process.exit(0); + break; case '--quiet': case '-q': logOptions.quiet = true; @@ -115,6 +161,7 @@ export const runCli = async () => { console.error('You must specify a test directory/file/pattern as argument. Please try again.'); console.error('\nUsage: tstest [options]'); console.error('\nOptions:'); + console.error(' --version Show version information'); console.error(' --quiet, -q Minimal output'); console.error(' --verbose, -v Verbose output'); console.error(' --no-color Disable colored output');