Skip to repository content

tenant.openagents/omega

No repository description is available.

OpenAgents Git authority 2026-07-28T06:51:17.358Z Public web read
NIP-34 coordinate30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omega
MaintainersHidden in public view
References2 branches · 1 tag
Read-only clonegit clone https://openagents.com/git/tenant.openagents/omega.git
Browse files

autofix_pr.rs

166 lines · 6.0 KB · rust
1use gh_workflow::*;
2
3use crate::tasks::workflows::{
4    runners,
5    steps::{
6        self, CommonPermissionSets, DownloadArtifactStep, FluentBuilder, IfNoFilesFound, NamedJob,
7        RepositoryTarget, TokenPermissions, UploadArtifactStep, ZippyGitIdentity, named, use_clang,
8    },
9    vars::{self, StepOutput, WorkflowInput},
10};
11
12pub fn autofix_pr() -> Workflow {
13    let pr_number = WorkflowInput::string("pr_number", None);
14    let run_clippy = WorkflowInput::bool("run_clippy", Some(true));
15    let run_autofix = run_autofix(&pr_number, &run_clippy);
16    let commit_changes = commit_changes(&pr_number, &run_autofix);
17    named::workflow()
18        .with_minimal_permissions()
19        .run_name(format!("autofix PR #{pr_number}"))
20        .on(Event::default().workflow_dispatch(
21            WorkflowDispatch::default()
22                .add_input(pr_number.name, pr_number.input())
23                .add_input(run_clippy.name, run_clippy.input()),
24        ))
25        .concurrency(
26            Concurrency::new(Expression::new(format!(
27                "${{{{ github.workflow }}}}-{pr_number}"
28            )))
29            .cancel_in_progress(true),
30        )
31        .add_job(run_autofix.name.clone(), run_autofix.job)
32        .add_job(commit_changes.name, commit_changes.job)
33}
34
35const PATCH_ARTIFACT_NAME: &str = "autofix-patch";
36const PATCH_FILE_PATH: &str = "autofix.patch";
37
38fn upload_patch_artifact() -> UploadArtifactStep {
39    steps::upload_artifact(PATCH_ARTIFACT_NAME, PATCH_FILE_PATH)
40        .if_no_files_found(IfNoFilesFound::Ignore)
41        .retention_days(1)
42}
43
44fn download_patch_artifact() -> DownloadArtifactStep {
45    steps::download_artifact().artifact_name(PATCH_ARTIFACT_NAME)
46}
47
48fn run_autofix(pr_number: &WorkflowInput, run_clippy: &WorkflowInput) -> NamedJob {
49    fn checkout_pr(pr_number: &WorkflowInput) -> Step<Run> {
50        named::bash(r#"gh pr checkout "$PR_NUMBER""#)
51            .add_env(("PR_NUMBER", pr_number.to_string()))
52            .add_env(("GITHUB_TOKEN", vars::GITHUB_TOKEN))
53    }
54
55    fn install_cargo_machete() -> Step<Use> {
56        steps::taiki_install_action("cargo-machete@0.7.0")
57    }
58
59    fn run_cargo_fmt() -> Step<Run> {
60        named::bash("cargo fmt --all")
61    }
62
63    fn run_cargo_fix() -> Step<Run> {
64        named::bash("cargo fix --workspace --allow-dirty --allow-staged")
65    }
66
67    fn run_cargo_machete_fix() -> Step<Run> {
68        named::bash("cargo machete --fix")
69    }
70
71    fn run_clippy_fix() -> Step<Run> {
72        named::bash("cargo clippy --workspace --fix --allow-dirty --allow-staged")
73    }
74
75    fn run_prettier_fix() -> Step<Run> {
76        named::bash("./script/prettier --write")
77    }
78
79    fn create_patch() -> Step<Run> {
80        named::bash(indoc::indoc! {r#"
81            if git diff --quiet; then
82                echo "No changes to commit"
83                echo "has_changes=false" >> "$GITHUB_OUTPUT"
84            else
85                git diff > autofix.patch
86                echo "has_changes=true" >> "$GITHUB_OUTPUT"
87            fi
88        "#})
89        .id("create-patch")
90    }
91
92    named::job(use_clang(
93        Job::default()
94            .runs_on(runners::LINUX_DEFAULT)
95            .permissions(
96                Permissions::default()
97                    .contents(Level::Read)
98                    .pull_requests(Level::Read),
99            )
100            .outputs([(
101                "has_changes".to_owned(),
102                "${{ steps.create-patch.outputs.has_changes }}".to_owned(),
103            )])
104            .add_step(steps::checkout_repo())
105            .add_step(checkout_pr(pr_number))
106            .add_step(steps::setup_cargo_config(runners::Platform::Linux))
107            .add_step(steps::cache_rust_dependencies_namespace())
108            .map(steps::install_linux_dependencies)
109            .add_step(steps::setup_pnpm())
110            .add_step(install_cargo_machete().if_condition(Expression::new(run_clippy.to_string())))
111            .add_step(run_cargo_fix().if_condition(Expression::new(run_clippy.to_string())))
112            .add_step(run_cargo_machete_fix().if_condition(Expression::new(run_clippy.to_string())))
113            .add_step(run_clippy_fix().if_condition(Expression::new(run_clippy.to_string())))
114            .add_step(run_prettier_fix())
115            .add_step(run_cargo_fmt())
116            .add_step(create_patch())
117            .add_step(upload_patch_artifact())
118            .add_step(steps::cleanup_cargo_config(runners::Platform::Linux)),
119    ))
120}
121
122fn commit_changes(pr_number: &WorkflowInput, autofix_job: &NamedJob) -> NamedJob {
123    fn checkout_pr(pr_number: &WorkflowInput, token: &StepOutput) -> Step<Run> {
124        named::bash(r#"gh pr checkout "$PR_NUMBER""#)
125            .add_env(("PR_NUMBER", pr_number.to_string()))
126            .add_env(("GITHUB_TOKEN", token))
127    }
128
129    fn apply_patch() -> Step<Run> {
130        named::bash("git apply autofix.patch")
131    }
132
133    fn commit_and_push(token: &StepOutput) -> Step<Run> {
134        named::bash(indoc::indoc! {r#"
135            git commit -am "Autofix"
136            git push
137        "#})
138        .with_zippy_git_identity()
139        .add_env(("GITHUB_TOKEN", token))
140    }
141
142    let (authenticate, token) = steps::authenticate_as_zippy()
143        .for_repository(RepositoryTarget::current())
144        .with_permissions([
145            (TokenPermissions::Contents, Level::Write),
146            (TokenPermissions::Workflows, Level::Write),
147        ])
148        .into();
149
150    named::job(
151        Job::default()
152            .runs_on(runners::LINUX_SMALL)
153            .needs(vec![autofix_job.name.clone()])
154            .cond(Expression::new(format!(
155                "needs.{}.outputs.has_changes == 'true'",
156                autofix_job.name
157            )))
158            .add_step(authenticate)
159            .add_step(steps::checkout_repo().with_token(&token))
160            .add_step(checkout_pr(pr_number, &token))
161            .add_step(download_patch_artifact())
162            .add_step(apply_patch())
163            .add_step(commit_and_push(&token)),
164    )
165}
166
Served at tenant.openagents/omega Member data and write actions are omitted.