Skip to repository content

tenant.openagents/omega

No repository description is available.

OpenAgents Git authority 2026-07-28T05:42:04.071Z 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

extension_auto_bump.rs

115 lines · 4.0 KB · rust
1use gh_workflow::{
2    Event, Expression, Input, Job, Level, Permissions, Push, Strategy, UsesJob, Workflow,
3};
4use indoc::indoc;
5use serde_json::json;
6
7use crate::tasks::workflows::{
8    extensions::WithAppSecrets,
9    run_tests::DETECT_CHANGED_EXTENSIONS_SCRIPT,
10    runners,
11    steps::{self, CommonJobConditions, CommonPermissionSets, NamedJob, named},
12    vars::{StepOutput, one_workflow_per_non_main_branch},
13};
14
15/// Generates a workflow that triggers on push to main, detects changed extensions
16/// in the `extensions/` directory, and invokes the `extension_bump` reusable workflow
17/// for each changed extension via a matrix strategy.
18pub(crate) fn extension_auto_bump() -> Workflow {
19    let detect = detect_changed_extensions();
20    let bump = bump_extension_versions(&detect);
21
22    named::workflow()
23        .with_minimal_permissions()
24        .add_event(
25            Event::default().push(
26                Push::default()
27                    .add_branch("main")
28                    .add_path("extensions/**")
29                    .add_path("!extensions/test-extension/**")
30                    .add_path("!extensions/workflows/**")
31                    .add_path("!extensions/*.md"),
32            ),
33        )
34        .concurrency(one_workflow_per_non_main_branch())
35        .add_job(detect.name, detect.job)
36        .add_job(bump.name, bump.job)
37}
38
39fn detect_changed_extensions() -> NamedJob {
40    let preamble = indoc! {r#"
41        COMPARE_REV="$(git rev-parse HEAD~1)"
42        CHANGED_FILES="$(git diff --name-only "$COMPARE_REV" "$GITHUB_SHA")"
43    "#};
44
45    let filter_newly_added = indoc! {r#"
46        # Filter out newly added extensions
47        FILTERED="[]"
48        for ext in $(echo "$EXTENSIONS_JSON" | jq -r '.[]'); do
49            if git show HEAD~1:"$ext/extension.toml" >/dev/null 2>&1; then
50                FILTERED=$(echo "$FILTERED" | jq -c --arg e "$ext" '. + [$e]')
51            fi
52        done
53        echo "changed_extensions=$FILTERED" >> "$GITHUB_OUTPUT"
54    "#};
55
56    let script = format!(
57        "{preamble}{detect}{filter}",
58        preamble = preamble,
59        detect = DETECT_CHANGED_EXTENSIONS_SCRIPT,
60        filter = filter_newly_added,
61    );
62
63    let step = named::bash(script).id("detect");
64
65    let output = StepOutput::new(&step, "changed_extensions");
66
67    let job = Job::default()
68        .with_repository_owner_guard()
69        .runs_on(runners::LINUX_SMALL)
70        .timeout_minutes(5u32)
71        .add_step(steps::checkout_repo().with_custom_fetch_depth(2))
72        .add_step(step)
73        .outputs([("changed_extensions".to_owned(), output.to_string())]);
74
75    named::job(job)
76}
77
78fn bump_extension_versions(detect_job: &NamedJob) -> NamedJob<UsesJob> {
79    let job = Job::default()
80        .needs(vec![detect_job.name.clone()])
81        .cond(Expression::new(format!(
82            "needs.{}.outputs.changed_extensions != '[]'",
83            detect_job.name
84        )))
85        .permissions(
86            Permissions::default()
87                .contents(Level::Write)
88                .issues(Level::Write)
89                .pull_requests(Level::Write)
90                .actions(Level::Write),
91        )
92        .strategy(
93            Strategy::default()
94                .fail_fast(false)
95                // TODO: Remove the limit. We currently need this to workaround the concurrency group issue
96                // where different matrix jobs would be placed in the same concurrency group and thus cancelled.
97                .max_parallel(1u32)
98                .matrix(json!({
99                    "extension": format!(
100                        "${{{{ fromJson(needs.{}.outputs.changed_extensions) }}}}",
101                        detect_job.name
102                    )
103                })),
104        )
105        .uses_local(".github/workflows/extension_bump.yml")
106        .with(
107            Input::default()
108                .add("working-directory", "${{ matrix.extension }}")
109                .add("force-bump", false),
110        )
111        .with_app_secrets();
112
113    named::job(job)
114}
115
Served at tenant.openagents/omega Member data and write actions are omitted.