Added box for gh pr's and issues (#558)

* Added box for gh pr's and issues

* only mount for pull and issue

* add title to issue parser

* due to allowing issue analysis, now getPatchUrl allows exceptions to occur and continue

---------

Co-authored-by: josc146 <josStorer@outlook.com>
This commit is contained in:
Jonas Kamsker
2023-11-12 23:47:20 +08:00
committed by GitHub
co-authored by josc146
parent 524b39fd69
commit e82f62ebc6
6 changed files with 121 additions and 5 deletions
+3 -2
View File
@@ -274,14 +274,15 @@ async function prepareForStaticCard() {
)
return
let initSuccess = true
if (siteName in siteConfig) {
const siteAction = siteConfig[siteName].action
if (siteAction && siteAction.init) {
await siteAction.init(location.hostname, userConfig, getInput, mountComponent)
initSuccess = await siteAction.init(location.hostname, userConfig, getInput, mountComponent)
}
}
mountComponent(siteConfig[siteName], userConfig)
if (initSuccess) mountComponent(siteConfig[siteName], userConfig)
}
}
@@ -22,5 +22,6 @@ export default {
} catch (e) {
/* empty */
}
return true
},
}
@@ -15,6 +15,7 @@ export default {
} catch (e) {
/* empty */
}
return true
},
inputQuery: async () => {
try {
@@ -3,7 +3,7 @@ import { config } from '../index.mjs'
const getPatchUrl = async () => {
const patchUrl = location.origin + location.pathname + '.patch'
const response = await fetch(patchUrl, { method: 'HEAD' })
const response = await fetch(patchUrl, { method: 'HEAD' }).catch(() => ({}))
if (response.ok) return patchUrl
return ''
}
@@ -16,6 +16,106 @@ 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 the issue title
const title = document.querySelector('.js-issue-title').textContent.trim()
// Get all messages
const messages = parseAllMessages()
// Get the content of the new comment box
const commentBoxContent = getCommentInputContent()
// Return an object with both results
return {
title: title,
messages: messages,
commentBoxContent: commentBoxContent,
}
}
function createChatGPtSummaryPrompt(issueData, isIssue = true) {
// Destructure the issueData object into messages and commentBoxContent
const { title, 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'
prompt += `Title:\n${title}\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 +123,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)
@@ -33,9 +138,16 @@ export default {
} catch (e) {
/* empty */
}
return (await getPatchUrl()) || isPull() || isIssue()
},
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
+2 -2
View File
@@ -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,
},
@@ -21,6 +21,7 @@ export default {
} catch (e) {
/* empty */
}
return true
},
inputQuery: async () => {
try {