diff --git a/src/content-script/site-adapters/github/index.mjs b/src/content-script/site-adapters/github/index.mjs index bf1bb7fb..0fd1171d 100644 --- a/src/content-script/site-adapters/github/index.mjs +++ b/src/content-script/site-adapters/github/index.mjs @@ -16,6 +16,100 @@ const getPatchData = async (patchUrl) => { return patchData } +const isPull = () => { + return location.href.match(/\/pull\/\d+$/) +} + +const isIssue = () => { + return location.href.match(/\/issues\/\d+$/) +} + +function parseGitHubIssueData() { + // Function to parse a single comment + function parseComment(commentElement) { + // Parse the date + const dateElement = commentElement.querySelector('relative-time') + const date = dateElement.getAttribute('datetime') + + // Parse the author + const authorElement = + commentElement.querySelector('.author') || commentElement.querySelector('.author-name') + const author = authorElement.textContent.trim() + + // Parse the body + const bodyElement = commentElement.querySelector('.comment-body') + const body = bodyElement.textContent.trim() + + return { date, author, body } + } + + // Function to parse all messages on the page + function parseAllMessages() { + // Find all comment containers + const commentElements = document.querySelectorAll('.timeline-comment-group') + const messages = Array.from(commentElements).map(parseComment) + + // The initial post is not a ".timeline-comment-group", so we need to handle it separately + const initialPostElement = document.querySelector('.js-comment-container') + const initialPost = parseComment(initialPostElement) + + // Combine the initial post with the rest of the comments + return [initialPost, ...messages] + } + + // Function to get the content of the comment input box + function getCommentInputContent() { + const commentInput = document.querySelector('.js-new-comment-form textarea') + return commentInput ? commentInput.value : '' + } + + // Get all messages + const messages = parseAllMessages() + + // Get the content of the new comment box + const commentBoxContent = getCommentInputContent() + + // Return an object with both results + return { + messages: messages, + commentBoxContent: commentBoxContent, + } +} + +function createChatGPtSummaryPrompt(issueData, isIssue = true) { + // Destructure the issueData object into messages and commentBoxContent + const { messages, commentBoxContent } = issueData + + // Start crafting the prompt + let prompt = '' + + if (isIssue) { + prompt = + 'Please summarize the following GitHub issue thread.\nWhat is the main issue and key points discussed in this thread?\n\n' + } else { + prompt = + 'Please summarize the following GitHub pull request thread.\nWhat is the main issue this pull request is trying to solve?\n\n' + } + + prompt += '---\n\n' + + // Add each message to the prompt + messages.forEach((message, index) => { + prompt += `Message ${index + 1} by ${message.author} on ${message.date}:\n${message.body}\n\n` + }) + + // If there's content in the comment box, add it as a draft message + if (commentBoxContent) { + prompt += '---\n\n' + prompt += `Draft message in comment box:\n${commentBoxContent}\n\n` + } + + // Add a request for summary at the end of the prompt + // prompt += 'What is the main issue and key points discussed in this thread?' + + return prompt +} + export default { init: async (hostname, userConfig, getInput, mountComponent) => { try { @@ -23,6 +117,11 @@ export default { const checkUrlChange = async () => { if (location.href !== oldUrl) { oldUrl = location.href + if (isPull() || isIssue()) { + mountComponent(config.github, userConfig) + return + } + const patchUrl = await getPatchUrl() if (patchUrl) { mountComponent(config.github, userConfig) @@ -36,6 +135,12 @@ export default { }, inputQuery: async () => { try { + if (isPull() || isIssue()) { + const issueData = parseGitHubIssueData() + const summaryPrompt = createChatGPtSummaryPrompt(issueData, isIssue()) + + return await cropText(summaryPrompt) + } const patchUrl = await getPatchUrl() const patchData = await getPatchData(patchUrl) if (!patchData) return diff --git a/src/content-script/site-adapters/index.mjs b/src/content-script/site-adapters/index.mjs index 978ae753..52ef58c8 100644 --- a/src/content-script/site-adapters/index.mjs +++ b/src/content-script/site-adapters/index.mjs @@ -137,9 +137,9 @@ export const config = { }, github: { inputQuery: github.inputQuery, - sidebarContainerQuery: ['#diff', '.commit'], + sidebarContainerQuery: ['#diff', '.commit', '.Layout-main'], appendContainerQuery: [], - resultsContainerQuery: ['#diff', '.commit'], + resultsContainerQuery: ['#diff', '.commit', '.Layout-main'], action: { init: github.init, },