From 28c8399015ce6542f133384677a8dac3aeb0fed3 Mon Sep 17 00:00:00 2001 From: Daksh Gupta Date: Tue, 26 Nov 2024 17:29:22 +0530 Subject: [PATCH] feat: stuff --- .env.example | 2 + bun.lockb | Bin 401237 -> 401581 bytes package.json | 1 + src/chameleon_sandbox.ts | 44 +++++++++++++ src/chameleon_utils.ts | 76 ++++++++++++++++++++++ src/commands/cl.ts | 133 +++++++++++++++++++++++++++++++++++++++ src/commands/index.ts | 3 +- src/greptile.ts | 115 +++++++++++++++++++++++++++++++++ tsconfig.json | 4 +- 9 files changed, 376 insertions(+), 2 deletions(-) create mode 100644 src/chameleon_sandbox.ts create mode 100644 src/chameleon_utils.ts create mode 100644 src/commands/cl.ts create mode 100644 src/greptile.ts diff --git a/.env.example b/.env.example index e69de29..beb9dd8 100644 --- a/.env.example +++ b/.env.example @@ -0,0 +1,2 @@ +GREPTILE_API_KEY="" +GITHUB_TOKEN="" \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 6d1af6bb88bdd39d39d600948e8ffe0ec93b5341..b3d150f0903d1b2afc7ecb18e4ebe22a4aa5199c 100755 GIT binary patch delta 76743 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

On0 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 bqvcJR)`#7<4ka62G+zAmMdQ8oS;qedbzYL| diff --git a/package.json b/package.json index 70ba873..a85d3bd 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ }, "dependencies": { "consola": "^3.2.3", + "date-fns": "^4.1.0", "dotenv": "^16.4.5", "giget": "^1.2.3", "picocolors": "^1.0.1", diff --git a/src/chameleon_sandbox.ts b/src/chameleon_sandbox.ts new file mode 100644 index 0000000..7f5812c --- /dev/null +++ b/src/chameleon_sandbox.ts @@ -0,0 +1,44 @@ +/* eslint-disable no-console */ +import ChangelogGenerator from './chameleon_utils' +import dotenv from 'dotenv' +import path from 'path' + +// Load environment variables with path relative to project root +dotenv.config({ debug: process.env.DEBUG === 'true', path: path.resolve(__dirname, '../.env') }) + +async function runChangelogDemo() { + // Ensure environment variables are set + const githubToken = process.env.GITHUB_TOKEN + const greptileToken = process.env.GREPTILE_API_KEY + + if (!githubToken || !greptileToken) { + throw new Error('Missing required environment variables: GITHUB_TOKEN and/or GREPTILE_API_KEY') + } + + // Initialize the changelog generator + const generator = new ChangelogGenerator(githubToken, greptileToken) + + // Configure the changelog parameters + const config = { + owner: 'greptileai', + repo: 'greptile', + startDate: new Date('2024-11-18'), // Example start date + endDate: new Date(), // Current date + customInstructions: `Generate a user-friendly changelog with no more than 5 items in the following format: + + [changelog content here] +`, + } + + try { + console.log('Generating changelog...') + const changelog = await generator.generateChangelog(config) + console.log('Generated Changelog:') + console.log(changelog) + } catch (error) { + console.error('Error generating changelog:', error) + } +} + +// Run the demo +runChangelogDemo().catch(console.error) diff --git a/src/chameleon_utils.ts b/src/chameleon_utils.ts new file mode 100644 index 0000000..06e46dd --- /dev/null +++ b/src/chameleon_utils.ts @@ -0,0 +1,76 @@ +import { Octokit } from '@octokit/rest' +import GreptileAPI from './greptile' + +interface ChangelogConfig { + owner: string + repo: string + startDate: Date + endDate: Date + customInstructions: string +} + +class ChangelogGenerator { + private octokit: Octokit + private greptile: GreptileAPI + + constructor(githubToken: string, greptileToken: string) { + this.octokit = new Octokit({ auth: githubToken }) + this.greptile = new GreptileAPI(greptileToken, githubToken) + } + + async generateChangelog({ owner, repo, startDate, endDate, customInstructions }: ChangelogConfig): Promise { + // Get commits between dates + const commits = await this.octokit.repos.compareCommits({ + owner, + repo, + base: await this.getCommitFromDate(owner, repo, startDate), + head: await this.getCommitFromDate(owner, repo, endDate), + }) + + // Index repository in Greptile + await this.greptile.indexRepository({ + remote: 'github', + repository: `${owner}/${repo}`, + branch: 'main', // You might want to make this configurable + }) + // Query Greptile with the diff and custom instructions + const queryResponse = await this.greptile.queryRepository({ + messages: [ + { + role: 'user', + content: `${customInstructions}\n\n The response should contain only the changelog with nothing before or after it. There should not be a title. Reference the following changes:\n${commits.data.files + ?.map((file) => `${file.filename}:\n${file.patch}`) + .join('\n\n')}`, + id: Date.now().toString(), + }, + ], + repositories: [ + { + remote: 'github', + repository: `${owner}/${repo}`, + branch: 'main', + }, + ], + sessionId: Date.now().toString(), + }) + + return queryResponse.message + } + + private async getCommitFromDate(owner: string, repo: string, date: Date): Promise { + const commits = await this.octokit.repos.listCommits({ + owner, + repo, + until: date.toISOString(), + per_page: 1, + }) + + if (commits.data.length === 0) { + throw new Error(`No commits found before ${date.toISOString()}`) + } + + return commits.data[0]?.sha || '' + } +} + +export default ChangelogGenerator diff --git a/src/commands/cl.ts b/src/commands/cl.ts new file mode 100644 index 0000000..2cda872 --- /dev/null +++ b/src/commands/cl.ts @@ -0,0 +1,133 @@ +import { Argv } from 'yargs' +import { logger } from '../logger' +import { green } from 'picocolors' +import ChangelogGenerator from '../chameleon_utils' + +import { execSync } from 'child_process' +import path from 'path' +import dotenv from 'dotenv' + +dotenv.config({ debug: process.env.DEBUG === 'true', path: path.resolve(__dirname, '../../.env') }) + +interface CLArgv {} + +export const command = 'cl' +export const describe = 'Generate a changelog for a repository' +export const aliases = ['changelog'] + +export function builder(yargs: Argv): Argv { + return yargs +} + +function getCurrentRepoInfo(): { owner: string; repo: string } | null { + try { + // Get the remote URL + const remoteUrl = execSync('git config --get remote.origin.url', { encoding: 'utf8' }).trim() + + // Extract owner/repo from different Git URL formats + const match = remoteUrl.match(/github\.com[:/]([^/]+)\/([^/.]+)/) + if (match) { + return { + owner: match[1] || '', + repo: match[2] || '', + } + } + } catch (error) { + return null + } + return null +} + +export async function handler() { + const currentRepo = getCurrentRepoInfo() + + // Get repository information + const repoString = await logger.prompt('Enter repository (owner/repo)', { + type: 'text', + default: currentRepo ? `${currentRepo.owner}/${currentRepo.repo}` : undefined, + }) + + const [owner, repo] = repoString.split('/') + if (!owner || !repo) { + logger.error('Invalid repository format. Please use owner/repo format.') + return + } + + // New date range selection + const dateRange = await logger.prompt('Select date range', { + type: 'select', + options: [ + { label: 'Last 24 hours', value: '1' }, + { label: 'Last 7 days', value: '7' }, + { label: 'Last 14 days', value: '14' }, + { label: 'Last 30 days', value: '30' }, + ], + }) + + const endDate = new Date().toISOString().split('T')[0] + const daysAgo = parseInt(dateRange.toString()) // Will be 1, 7, 14, or 30 + const startDate = new Date(Date.now() - daysAgo * 24 * 60 * 60 * 1000).toISOString().split('T')[0] + + // Updated changelog type selection with custom option + const changelogType = await logger.prompt('Select changelog type', { + type: 'select', + options: [ + { label: 'Internal', value: 'internal', hint: 'Technical details for developers' }, + { label: 'External', value: 'external', hint: 'User-facing changes' }, + { label: 'Mintlify', value: 'mintlify', hint: 'Changelog format for Mintlify' }, + ], + }) + const instructions = await (async () => { + switch (changelogType.toString()) { + case 'internal': + return 'Generate a short technical changelog that contains no more than 5 bullet points in markdown.' + case 'external': + return 'Generate a user-friendly changelog that contains no more than 5 bullet points in markdown.' + case 'mintlify': + return `Generate a user-friendly changelog with no more than 5 items in the following format: + + [changelog content in markdown here] +` + default: + return 'Generate a user-friendly changelog that contains no more than 5 bullet points.' + } + })() + + try { + // Load tokens from environment + const githubToken = process.env.GITHUB_TOKEN + const greptileToken = process.env.GREPTILE_API_KEY + + if (!githubToken || !greptileToken) { + logger.error('Missing required environment variables: GITHUB_TOKEN and/or GREPTILE_API_KEY') + return + } + + const generator = new ChangelogGenerator(githubToken, greptileToken) + + const config = { + owner, + repo, + startDate: new Date(startDate as string), + endDate: new Date(endDate as string), + customInstructions: instructions, + } + + const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] + let frameIndex = 0 + const spinner = setInterval(() => { + process.stdout.write(`\r${frames[frameIndex]} Generating changelog...`) + frameIndex = (frameIndex + 1) % frames.length + }, 80) + + const changelog = await generator.generateChangelog(config) + + clearInterval(spinner) + process.stdout.write('\r') // Clear the spinner line + + logger.log('\nChangelog:') + logger.log(green(changelog)) + } catch (error) { + logger.error('Failed to generate changelog:', error instanceof Error ? error.message : String(error)) + } +} diff --git a/src/commands/index.ts b/src/commands/index.ts index 44ce905..38702aa 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -1,5 +1,6 @@ import * as info from './info' import * as greeting from './greeting' import * as create from './create' +import * as cl from './cl' -export const commands = [info, greeting, create] +export const commands = [info, greeting, create, cl] diff --git a/src/greptile.ts b/src/greptile.ts new file mode 100644 index 0000000..4ffc886 --- /dev/null +++ b/src/greptile.ts @@ -0,0 +1,115 @@ +interface RepositoryConfig { + remote: string + repository: string + branch: string + reload?: boolean + notify?: boolean +} + +interface Message { + id: string + content: string + role: string +} + +interface QueryConfig { + messages: Message[] + repositories: RepositoryConfig[] + sessionId: string + stream?: boolean + genius?: boolean +} + +interface RepositoryStatus { + repository: string + remote: string + branch: string + private: boolean + status: string + filesProcessed: number + numFiles: number + sha: string +} + +interface Source { + repository: string + remote: string + branch: string + filepath: string + linestart: number + lineend: number + summary: string +} + +interface QueryResponse { + message: string + sources: Source[] +} + +interface IndexResponse { + message: string + statusEndpoint: string +} + +class GreptileAPI { + private baseUrl = 'https://api.greptile.com/v2' + private token: string + private githubToken: string + + constructor(token: string, githubToken: string) { + this.token = token + this.githubToken = githubToken + } + + private getHeaders(): Record { + return { + Authorization: `Bearer ${this.token}`, + 'X-GitHub-Token': this.githubToken, + 'Content-Type': 'application/json', + } + } + + async indexRepository(config: RepositoryConfig): Promise { + const response = await fetch(`${this.baseUrl}/repositories`, { + method: 'POST', + headers: this.getHeaders(), + body: JSON.stringify(config), + }) + + if (!response.ok) { + throw new Error(`Failed to index repository: ${response.statusText}`) + } + + return response.json() as Promise + } + + async queryRepository(config: QueryConfig): Promise { + const response = await fetch(`${this.baseUrl}/query`, { + method: 'POST', + headers: this.getHeaders(), + body: JSON.stringify(config), + }) + + if (!response.ok) { + throw new Error(`Failed to query repository: ${response.statusText}`) + } + + return response.json() as Promise + } + + async getRepositoryStatus(repository: RepositoryConfig): Promise { + const repositoryId = `${encodeURIComponent(repository.remote)}:${encodeURIComponent(repository.branch)}:${encodeURIComponent(repository.repository)}` + const response = await fetch(`${this.baseUrl}/repositories/${repositoryId}`, { + method: 'GET', + headers: this.getHeaders(), + }) + + if (!response.ok) { + throw new Error(`Failed to get repository status: ${response.statusText}`) + } + + return response.json() as Promise + } +} + +export default GreptileAPI diff --git a/tsconfig.json b/tsconfig.json index 40c18fc..89eba0e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,9 @@ "forceConsistentCasingInFileNames": true, "declaration": true, "sourceMap": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "emitDeclarationOnly": true }, "include": ["src"], "exclude": ["dist", "bundle", "node_modules"],