mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 00:55:31 +00:00
refactor and optimize git operations for commit messages and failure analysis (#7412)
This commit is contained in:
parent
2ae4ac8d0a
commit
24d7b05c0d
4 changed files with 264 additions and 33 deletions
17
genaisrc/gai.genai.mts
Normal file
17
genaisrc/gai.genai.mts
Normal file
|
@ -0,0 +1,17 @@
|
|||
script({
|
||||
tools: ["agent_fs", "agent_git", "agent_github"],
|
||||
})
|
||||
|
||||
const {
|
||||
workflow = "latest failed",
|
||||
failure_run_id = "latest",
|
||||
branch = await git.defaultBranch(),
|
||||
} = env.vars
|
||||
|
||||
$`Investigate the status of the ${workflow} workflow and identify the root cause of the failure of run ${failure_run_id} in branch ${branch}.
|
||||
|
||||
- Correlate the failure with the relevant commits, pull requests or issues.
|
||||
- Compare the source code between the failed run commit and the last successful run commit before that run.
|
||||
|
||||
In your report, include html links to the relevant runs, commits, pull requests or issues.
|
||||
`
|
|
@ -6,28 +6,16 @@ script({
|
|||
description: "Generate a commit message for all staged changes",
|
||||
})
|
||||
|
||||
// TODO: update this diff command to match your workspace
|
||||
const diffCmd = "git diff --cached -- . :!**/genaiscript.d.ts"
|
||||
|
||||
// Check for staged changes and stage all changes if none are staged
|
||||
let diff = await host.exec(diffCmd)
|
||||
if (!diff.stdout) {
|
||||
/**
|
||||
* Ask user to stage all changes if none are staged
|
||||
*/
|
||||
const stage = await host.confirm("No staged changes. Stage all changes?", {
|
||||
default: true,
|
||||
})
|
||||
if (stage) {
|
||||
// Stage all changes and recompute diff
|
||||
await host.exec("git add .")
|
||||
diff = await host.exec(diffCmd)
|
||||
}
|
||||
if (!diff.stdout) cancel("no staged changes")
|
||||
}
|
||||
const diff = await git.diff({
|
||||
staged: true,
|
||||
excludedPaths: "**/genaiscript.d.ts",
|
||||
askStageOnEmpty: true,
|
||||
})
|
||||
if (!diff) cancel("no staged changes")
|
||||
|
||||
// show diff in the console
|
||||
console.log(diff.stdout)
|
||||
console.log(diff)
|
||||
|
||||
let choice
|
||||
let message
|
||||
|
@ -79,9 +67,9 @@ Please generate a concise, one-line commit message for these changes.
|
|||
}
|
||||
// Regenerate message
|
||||
if (choice === "commit" && message) {
|
||||
console.log((await host.exec("git", ["commit", "-m", message])).stdout)
|
||||
console.log(await git.exec(["commit", "-m", message]))
|
||||
if (await host.confirm("Push changes?", { default: true }))
|
||||
console.log((await host.exec("git push")).stdout)
|
||||
console.log(await git.exec("push"))
|
||||
break
|
||||
}
|
||||
} while (choice !== "commit")
|
||||
|
|
247
genaisrc/genaiscript.d.ts
generated
vendored
247
genaisrc/genaiscript.d.ts
generated
vendored
|
@ -71,6 +71,11 @@ interface PromptLike extends PromptDefinition {
|
|||
|
||||
type SystemPromptId = OptionsOrString<
|
||||
| "system"
|
||||
| "system.agent_fs"
|
||||
| "system.agent_git"
|
||||
| "system.agent_github"
|
||||
| "system.agent_interpreter"
|
||||
| "system.agent_user_input"
|
||||
| "system.annotations"
|
||||
| "system.changelog"
|
||||
| "system.diagrams"
|
||||
|
@ -78,8 +83,15 @@ type SystemPromptId = OptionsOrString<
|
|||
| "system.explanations"
|
||||
| "system.files"
|
||||
| "system.files_schema"
|
||||
| "system.fs_diff_files"
|
||||
| "system.fs_find_files"
|
||||
| "system.fs_read_file"
|
||||
| "system.git"
|
||||
| "system.github_actions"
|
||||
| "system.github_files"
|
||||
| "system.github_info"
|
||||
| "system.github_issues"
|
||||
| "system.github_pulls"
|
||||
| "system.math"
|
||||
| "system.md_frontmatter"
|
||||
| "system.python"
|
||||
|
@ -92,18 +104,47 @@ type SystemPromptId = OptionsOrString<
|
|||
| "system.technical"
|
||||
| "system.tools"
|
||||
| "system.typescript"
|
||||
| "system.user_input"
|
||||
| "system.zero_shot_cot"
|
||||
>
|
||||
|
||||
type SystemToolId = OptionsOrString<
|
||||
| "agent_fs"
|
||||
| "agent_git"
|
||||
| "agent_github"
|
||||
| "agent_interpreter"
|
||||
| "agent_user_input"
|
||||
| "fs_diff_files"
|
||||
| "fs_find_files"
|
||||
| "fs_read_file"
|
||||
| "git_branch_current"
|
||||
| "git_branch_list"
|
||||
| "git_diff"
|
||||
| "git_last_tag"
|
||||
| "git_log"
|
||||
| "git_status"
|
||||
| "github_actions_job_logs_diff"
|
||||
| "github_actions_job_logs_get"
|
||||
| "github_actions_jobs_list"
|
||||
| "github_actions_workflows_list"
|
||||
| "github_files_get"
|
||||
| "github_files_list"
|
||||
| "github_issues_comments_list"
|
||||
| "github_issues_get"
|
||||
| "github_issues_list"
|
||||
| "github_pulls_get"
|
||||
| "github_pulls_list"
|
||||
| "github_pulls_review_comments_list"
|
||||
| "math_eval"
|
||||
| "md_read_frontmatter"
|
||||
| "python_code_interpreter"
|
||||
| "python_code_interpreter_copy_files"
|
||||
| "python_code_interpreter_run"
|
||||
| "retrieval_fuzz_search"
|
||||
| "retrieval_vector_search"
|
||||
| "retrieval_web_search"
|
||||
| "user_input_confirm"
|
||||
| "user_input_select"
|
||||
| "user_input_text"
|
||||
>
|
||||
|
||||
type FileMergeHandler = (
|
||||
|
@ -419,6 +460,11 @@ interface PromptScript
|
|||
* Set if this is a system prompt.
|
||||
*/
|
||||
isSystem?: boolean
|
||||
|
||||
/**
|
||||
* List of tools defined in the script
|
||||
*/
|
||||
defTools?: { id: string, description: string }[]
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -607,10 +653,25 @@ interface WorkspaceFileSystem {
|
|||
*/
|
||||
readJSON(path: string | Awaitable<WorkspaceFile>): Promise<any>
|
||||
|
||||
/**
|
||||
* Reads the content of a file and parses to YAML.
|
||||
* @param path
|
||||
*/
|
||||
readYAML(path: string | Awaitable<WorkspaceFile>): Promise<any>
|
||||
|
||||
/**
|
||||
* Reads the content of a file and parses to XML, using the XML parser.
|
||||
*/
|
||||
readXML(path: string | Awaitable<WorkspaceFile>): Promise<any>
|
||||
readXML(path: string | Awaitable<WorkspaceFile>, options?: XMLParseOptions): Promise<any>
|
||||
|
||||
/**
|
||||
* Reads the content of a CSV file.
|
||||
* @param path
|
||||
*/
|
||||
readCSV<T extends object>(
|
||||
path: string | Awaitable<WorkspaceFile>,
|
||||
options?: CSVParseOptions
|
||||
): Promise<T[]>
|
||||
|
||||
/**
|
||||
* Writes a file as text to the file system
|
||||
|
@ -630,6 +691,7 @@ interface WorkspaceFileSystem {
|
|||
}
|
||||
|
||||
interface ToolCallContext {
|
||||
log(message: string): void
|
||||
trace: ToolCallTrace
|
||||
}
|
||||
|
||||
|
@ -701,7 +763,7 @@ interface ExpansionVariables {
|
|||
|
||||
type MakeOptional<T, P extends keyof T> = Partial<Pick<T, P>> & Omit<T, P>
|
||||
|
||||
type PromptArgs = Omit<PromptScript, "text" | "id" | "jsSource" | "activation">
|
||||
type PromptArgs = Omit<PromptScript, "text" | "id" | "jsSource" | "activation" | "defTools">
|
||||
|
||||
type PromptSystemArgs = Omit<
|
||||
PromptArgs,
|
||||
|
@ -717,6 +779,7 @@ type PromptSystemArgs = Omit<
|
|||
| "responseSchema"
|
||||
| "files"
|
||||
| "modelConcurrency"
|
||||
| "parameters"
|
||||
>
|
||||
|
||||
type StringLike = string | WorkspaceFile | WorkspaceFile[]
|
||||
|
@ -764,18 +827,22 @@ interface ContextExpansionOptions {
|
|||
* It defaults to 1 on all elements.
|
||||
*/
|
||||
flex?: number
|
||||
/**
|
||||
* This text is likely to change and will probably break the prefix cache.
|
||||
*/
|
||||
ephemeral?: boolean
|
||||
}
|
||||
|
||||
interface DefOptions extends FenceOptions, ContextExpansionOptions, DataFilter {
|
||||
/**
|
||||
* Filename filter based on file suffix. Case insensitive.
|
||||
*/
|
||||
endsWith?: string
|
||||
endsWith?: ElementOrArray<string>
|
||||
|
||||
/**
|
||||
* Filename filter using glob syntax.
|
||||
*/
|
||||
glob?: string
|
||||
glob?: ElementOrArray<string>
|
||||
|
||||
/**
|
||||
* By default, throws an error if the value in def is empty.
|
||||
|
@ -832,6 +899,7 @@ type JSONSchemaType =
|
|||
|
||||
interface JSONSchemaString {
|
||||
type: "string"
|
||||
enum?: string[]
|
||||
description?: string
|
||||
default?: string
|
||||
}
|
||||
|
@ -900,6 +968,7 @@ interface RunPromptResult {
|
|||
| "content_filter"
|
||||
| "cancel"
|
||||
| "fail"
|
||||
usages?: ChatCompletionUsages
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1002,6 +1071,11 @@ interface ParseZipOptions {
|
|||
|
||||
type TokenEncoder = (text: string) => number[]
|
||||
|
||||
interface CSVParseOptions {
|
||||
delimiter?: string
|
||||
headers?: string[]
|
||||
}
|
||||
|
||||
interface Parsers {
|
||||
/**
|
||||
* Parses text as a JSON5 payload
|
||||
|
@ -1067,7 +1141,7 @@ interface Parsers {
|
|||
*/
|
||||
CSV(
|
||||
content: string | WorkspaceFile,
|
||||
options?: { delimiter?: string; headers?: string[] }
|
||||
options?: CSVParseOptions
|
||||
): object[] | undefined
|
||||
|
||||
/**
|
||||
|
@ -1177,6 +1251,11 @@ interface Parsers {
|
|||
* Renders a jinja template
|
||||
*/
|
||||
jinja(text: string | WorkspaceFile, data: Record<string, any>): string
|
||||
|
||||
/**
|
||||
* Computes a diff between two files
|
||||
*/
|
||||
diff(left: WorkspaceFile, right: WorkspaceFile, options?: DefDiffOptions): string
|
||||
}
|
||||
|
||||
interface AICIGenOptions {
|
||||
|
@ -1292,6 +1371,90 @@ interface HTML {
|
|||
convertToMarkdown(html: string): Promise<string>
|
||||
}
|
||||
|
||||
interface GitCommit {
|
||||
sha: string
|
||||
message: string
|
||||
}
|
||||
|
||||
interface Git {
|
||||
/**
|
||||
* Resolves the default branch for this repository
|
||||
*/
|
||||
defaultBranch(): Promise<string>
|
||||
|
||||
/**
|
||||
* Gets the last tag in the repository
|
||||
*/
|
||||
lastTag(): Promise<string>
|
||||
|
||||
/**
|
||||
* Gets the current branch of the repository
|
||||
*/
|
||||
branch(): Promise<string>
|
||||
|
||||
/**
|
||||
* Executes a git command in the repository and returns the stdout
|
||||
* @param cmd
|
||||
*/
|
||||
exec(args: string[] | string, options?: { label?: string }): Promise<string>
|
||||
|
||||
/**
|
||||
* Lists the branches in the git repository
|
||||
*/
|
||||
listBranches(): Promise<string[]>
|
||||
|
||||
/**
|
||||
* Finds specific files in the git repository.
|
||||
* By default, work
|
||||
* @param options
|
||||
*/
|
||||
listFiles(
|
||||
scope: "modified-base" | "staged" | "modified",
|
||||
options?: {
|
||||
base?: string
|
||||
/**
|
||||
* Ask the user to stage the changes if the diff is empty.
|
||||
*/
|
||||
askStageOnEmpty?: boolean
|
||||
paths?: ElementOrArray<string>
|
||||
excludedPaths?: ElementOrArray<string>
|
||||
}
|
||||
): Promise<WorkspaceFile[]>
|
||||
|
||||
/**
|
||||
*
|
||||
* @param options
|
||||
*/
|
||||
diff(options?: {
|
||||
staged?: boolean
|
||||
/**
|
||||
* Ask the user to stage the changes if the diff is empty.
|
||||
*/
|
||||
askStageOnEmpty?: boolean
|
||||
base?: string
|
||||
head?: string
|
||||
paths?: ElementOrArray<string>
|
||||
excludedPaths?: ElementOrArray<string>
|
||||
unified?: number
|
||||
/**
|
||||
* Modifies the diff to be in a more LLM friendly format
|
||||
*/
|
||||
llmify?: boolean
|
||||
}): Promise<string>
|
||||
|
||||
/**
|
||||
* Lists the commits in the git repository
|
||||
*/
|
||||
log(options?: {
|
||||
base?: string
|
||||
head?: string
|
||||
merges?: boolean
|
||||
excludedGrep?: string | RegExp
|
||||
paths?: ElementOrArray<string>
|
||||
excludedPaths?: ElementOrArray<string>
|
||||
}): Promise<GitCommit[]>
|
||||
}
|
||||
|
||||
interface GitHubOptions {
|
||||
owner: string
|
||||
repo: string
|
||||
|
@ -1350,7 +1513,22 @@ interface GitHubIssue {
|
|||
number: number
|
||||
state: string
|
||||
state_reason?: "completed" | "reopened" | "not_planned" | null
|
||||
html_url: string
|
||||
html_url: string
|
||||
draft?: boolean
|
||||
reactions?: GitHubReactions
|
||||
}
|
||||
|
||||
interface GitHubReactions {
|
||||
url: string
|
||||
total_count: number
|
||||
"+1": number
|
||||
"-1": number
|
||||
laugh: number
|
||||
confused: number
|
||||
heart: number
|
||||
hooray: number
|
||||
eyes: number
|
||||
rocket: number
|
||||
}
|
||||
|
||||
interface GitHubComment {
|
||||
|
@ -1359,9 +1537,11 @@ interface GitHubComment {
|
|||
created_at: string
|
||||
updated_at: string
|
||||
html_url: string
|
||||
reactions?: GitHubReactions
|
||||
}
|
||||
|
||||
interface GitHubPullRequest extends GitHubIssue {}
|
||||
interface GitHubPullRequest extends GitHubIssue {
|
||||
}
|
||||
|
||||
interface GitHubCodeSearchResult {
|
||||
name: string
|
||||
|
@ -1379,8 +1559,10 @@ interface GitHubWorkflow {
|
|||
}
|
||||
|
||||
interface GitHubPaginationOptions {
|
||||
page?: number
|
||||
per_page?: number
|
||||
/**
|
||||
* Default number of items to fetch, default is 50.
|
||||
*/
|
||||
count?: number
|
||||
}
|
||||
|
||||
interface GitHubFile extends WorkspaceFile {
|
||||
|
@ -1388,6 +1570,10 @@ interface GitHubFile extends WorkspaceFile {
|
|||
size: number
|
||||
}
|
||||
|
||||
interface GitHubUser {
|
||||
login: string
|
||||
}
|
||||
|
||||
interface GitHub {
|
||||
/**
|
||||
* Gets connection information for octokit
|
||||
|
@ -1422,6 +1608,20 @@ interface GitHub {
|
|||
options?: GitHubPaginationOptions
|
||||
): Promise<GitHubWorkflowJob[]>
|
||||
|
||||
/**
|
||||
* Downloads a GitHub Action workflow run log
|
||||
* @param jobId
|
||||
*/
|
||||
downloadWorkflowJobLog(
|
||||
jobId: number,
|
||||
options?: { llmify?: boolean }
|
||||
): Promise<string>
|
||||
|
||||
/**
|
||||
* Diffs two GitHub Action workflow job logs
|
||||
*/
|
||||
diffWorkflowJobLogs(job_id: number, other_job_id: number): Promise<string>
|
||||
|
||||
/**
|
||||
* Lists issues for a given repository
|
||||
* @param options
|
||||
|
@ -1435,6 +1635,13 @@ interface GitHub {
|
|||
} & GitHubPaginationOptions
|
||||
): Promise<GitHubIssue[]>
|
||||
|
||||
|
||||
/**
|
||||
* Gets the details of a GitHub issue
|
||||
* @param number issue number (not the issue id!)
|
||||
*/
|
||||
async getIssue(number: number): Promise<GitHubIssue>
|
||||
|
||||
/**
|
||||
* Lists comments for a given issue
|
||||
* @param issue_number
|
||||
|
@ -1457,6 +1664,12 @@ interface GitHub {
|
|||
} & GitHubPaginationOptions
|
||||
): Promise<GitHubPullRequest[]>
|
||||
|
||||
/**
|
||||
* Gets the details of a GitHub pull request
|
||||
* @param pull_number pull request number (not the pull request id!)
|
||||
*/
|
||||
getPullRequest(pull_number: number): Promise<GitHubPullRequest>
|
||||
|
||||
/**
|
||||
* Lists comments for a given pull request
|
||||
* @param pull_number
|
||||
|
@ -1511,6 +1724,11 @@ interface GitHub {
|
|||
type?: (typeof GitHubFile)["type"]
|
||||
}
|
||||
): Promise<GitHubFile[]>
|
||||
|
||||
/**
|
||||
* Gets the underlying Octokit client
|
||||
*/
|
||||
client(): Promise<any>
|
||||
}
|
||||
|
||||
interface MD {
|
||||
|
@ -1882,7 +2100,7 @@ interface ChatGenerationContext extends ChatTurnGenerationContext {
|
|||
options?: ChatParticipantOptions
|
||||
): void
|
||||
defFileOutput(
|
||||
pattern: string | string[],
|
||||
pattern: ElementOrArray<string | WorkspaceFile>,
|
||||
description?: string,
|
||||
options?: FileOutputOptions
|
||||
): void
|
||||
|
@ -2765,7 +2983,7 @@ declare function def(
|
|||
* @param options expectations about the generated file content
|
||||
*/
|
||||
declare function defFileOutput(
|
||||
pattern: string | string[],
|
||||
pattern: ElementOrArray<string | WorkspaceFile>,
|
||||
description?: string,
|
||||
options?: FileOutputOptions
|
||||
): void
|
||||
|
@ -2869,6 +3087,11 @@ declare var host: PromptHost
|
|||
*/
|
||||
declare var github: GitHub
|
||||
|
||||
/**
|
||||
* Access to Git operations for the current repository
|
||||
*/
|
||||
declare var git: Git
|
||||
|
||||
/**
|
||||
* Fetches a given URL and returns the response.
|
||||
* @param url
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue