Hi Charlie;
You might need to:
1. create an extension.bzl that defines a repository_rule() that includes attrs={"macros": attr.label(allow_single_file=True, ...)}
2. the implementation of that repository_rule:
a. reads the contents (can we?) of the repository_ctx.attr.macro value,
b. creates a repository_ctx/file for the BUILD
c. uses a template expansion to use the macros' values to create a macros.bzl (say that defines SHIP_CONFIG as a JSON object)
3. use this extension in your MODULE.bazel
4. use_repo(instance_of_extension, name_of_repo)
5. your `apps` repo's BUILD.bazel can now load(@name_of_repo//macros.bzl, config="SHIP_CONFIG"), then use "config" as a local variable
something like this might work if it makes sense; otherwise, create a basic repo for the "rules" and "apps", and include a BUILD in the apps that you want to use something that "rules" creates base on apps' config.