Initial commit
This commit is contained in:
173
skills/pull-request-skill/run.js
Executable file
173
skills/pull-request-skill/run.js
Executable file
@@ -0,0 +1,173 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Universal Pull Request Review Exporter for Claude Code
|
||||
*
|
||||
* Executes the PR review export script with Bun:
|
||||
* - Download PR reviews: node run.js download [PR_NUMBER]
|
||||
* - Help: node run.js --help
|
||||
*
|
||||
* Ensures proper module resolution and dependency installation.
|
||||
*/
|
||||
|
||||
import { execSync, spawn } from 'node:child_process';
|
||||
import { existsSync } from 'node:fs';
|
||||
import { dirname, join } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
|
||||
// Change to skill directory for proper module resolution
|
||||
process.chdir(__dirname);
|
||||
|
||||
/**
|
||||
* Check if Bun is installed
|
||||
*/
|
||||
function checkBunInstalled() {
|
||||
try {
|
||||
execSync('bun --version', { stdio: 'pipe' });
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if dependencies are installed
|
||||
*/
|
||||
function checkDependenciesInstalled() {
|
||||
return existsSync(join(__dirname, 'node_modules'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Install dependencies using Bun
|
||||
*/
|
||||
function installDependencies() {
|
||||
console.log('📦 Dependencies not found. Installing...');
|
||||
try {
|
||||
execSync('bun install', { stdio: 'inherit', cwd: __dirname });
|
||||
console.log('✅ Dependencies installed successfully');
|
||||
return true;
|
||||
} catch (e) {
|
||||
console.error('❌ Failed to install dependencies:', e.message);
|
||||
console.error('Please run manually: cd', __dirname, '&& bun install');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Show help message
|
||||
*/
|
||||
function showHelp() {
|
||||
console.log(`
|
||||
Pull Request Review Exporter - Claude Code Skill
|
||||
|
||||
USAGE:
|
||||
node run.js download [PR_NUMBER] Download CodeRabbit comments for a PR
|
||||
node run.js download Download comments for latest open PR
|
||||
node run.js --help Show this help message
|
||||
|
||||
EXAMPLES:
|
||||
node run.js download 123 Download PR #123 reviews
|
||||
node run.js download Download latest open PR reviews
|
||||
|
||||
# From any directory (saves to that directory's .reviews/)
|
||||
CWD=/path/to/repo node run.js download 123
|
||||
|
||||
ENVIRONMENT VARIABLES:
|
||||
GITHUB_TOKEN GitHub Personal Access Token (required)
|
||||
OUTPUT_DIR Output directory for reviews (default: ./.reviews)
|
||||
CWD Working directory to save reviews (default: current directory)
|
||||
LOG_LEVEL Logging level: error, warn, info, debug (default: info)
|
||||
PR_REVIEW_TZ Timezone for dates (default: system timezone)
|
||||
|
||||
SETUP:
|
||||
1. Create .env file in skill directory:
|
||||
echo "GITHUB_TOKEN=ghp_your_token_here" > .env
|
||||
|
||||
2. Optionally configure output directory and logging:
|
||||
echo "OUTPUT_DIR=./my-reviews" >> .env
|
||||
echo "LOG_LEVEL=debug" >> .env
|
||||
|
||||
For more information, see README.md
|
||||
`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the PR review export script
|
||||
*/
|
||||
function runPRReviewScript(args) {
|
||||
const scriptPath = join(__dirname, 'pr-review.ts');
|
||||
|
||||
if (!existsSync(scriptPath)) {
|
||||
console.error('❌ Error: pr-review.ts not found in skill directory');
|
||||
console.error('Expected at:', scriptPath);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log('🚀 Starting PR Review Exporter...\n');
|
||||
|
||||
// Use spawn to stream output in real-time
|
||||
const bunProcess = spawn('bun', ['run', scriptPath, ...args], {
|
||||
cwd: __dirname,
|
||||
stdio: 'inherit',
|
||||
env: { ...process.env }
|
||||
});
|
||||
|
||||
bunProcess.on('error', (error) => {
|
||||
console.error('❌ Failed to start Bun process:', error.message);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
bunProcess.on('exit', (code) => {
|
||||
process.exit(code || 0);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Main execution
|
||||
*/
|
||||
async function main() {
|
||||
const args = process.argv.slice(2);
|
||||
|
||||
// Show help
|
||||
if (args.includes('--help') || args.includes('-h')) {
|
||||
showHelp();
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
// Check Bun installation
|
||||
if (!checkBunInstalled()) {
|
||||
console.error('❌ Bun is not installed or not in PATH');
|
||||
console.error('Please install Bun from: https://bun.sh');
|
||||
console.error('Or use: curl -fsSL https://bun.sh/install | bash');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Check and install dependencies if needed
|
||||
if (!checkDependenciesInstalled()) {
|
||||
const installed = installDependencies();
|
||||
if (!installed) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Parse command
|
||||
const command = args[0];
|
||||
|
||||
if (command === 'download' || !command) {
|
||||
// Extract PR number if provided
|
||||
const prArgs = args.slice(1);
|
||||
runPRReviewScript(prArgs);
|
||||
} else {
|
||||
console.error(`❌ Unknown command: ${command}`);
|
||||
console.error('Run "node run.js --help" for usage information');
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Run main function
|
||||
main().catch((error) => {
|
||||
console.error('❌ Fatal error:', error.message);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user