diff --git a/.github/workflows/ci.yml b/.github/workflows/validate-organization.yml similarity index 91% rename from .github/workflows/ci.yml rename to .github/workflows/validate-organization.yml index 5b01ab1..e57a002 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/validate-organization.yml @@ -1,4 +1,5 @@ -name: CI +name: Validate organization catalog and profile +# Validate the catalog and generated profile, then request the member-profile refresh. on: [push, pull_request, workflow_dispatch] permissions: { contents: read } jobs: diff --git a/.github/workflows/verify.yml b/.github/workflows/verify-project.yml similarity index 99% rename from .github/workflows/verify.yml rename to .github/workflows/verify-project.yml index 01b2876..6b016e3 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify-project.yml @@ -1,4 +1,5 @@ -name: Verify +name: Reusable build, test and package verification +# Reusable manifest-driven build, test, formatting and native-package verification. on: workflow_call: permissions: diff --git a/README.md b/README.md index 172af7e..2cedbca 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ path is included because that workflow is delivered here. ## Shared Verify -`.github/workflows/verify.yml` remains `workflow_call`-only and read-only. The +`.github/workflows/verify-project.yml` remains `workflow_call`-only and read-only. The manifest is the single authority for build options; the catalog holds identity. Preparation validates the manifest before selecting the C++ container or native Python matrix. The canonical caller uses only `workflow_dispatch`: full @@ -116,7 +116,7 @@ files against existing repository formatting policies. Documentation and present ### Shared Verify updates -The five product callers and `templates/ci.yml` use `verify.yml@main`, following the API-verified default branch of this control repository. A merged shared-workflow change is used by their next manually started CI runs; it does not start those runs. Callers pass no secrets unless Verify actually reads one (currently none). Product CI remains `workflow_dispatch`-only, independent of version-tag package pipelines. +The five product callers and `templates/build-and-test.yml` use `verify-project.yml@main`, following the API-verified default branch of this control repository. A merged shared-workflow change is used by their next manually started CI runs; it does not start those runs. Callers pass no secrets unless Verify actually reads one (currently none). Product CI remains `workflow_dispatch`-only, independent of version-tag package pipelines. Existing tags are historical snapshots and are never moved. Page-header, menu and profile generation are separate from build CI; documentation changes require neither a Verify release nor caller updates. `docs-audit` is optional local/PR review tooling and is never a build, signing or publication gate. diff --git a/profile/README.md b/profile/README.md index c141b71..0a9d77e 100644 --- a/profile/README.md +++ b/profile/README.md @@ -34,10 +34,10 @@ SNodeC builds event-driven networking in C++. At its centre is [SNode.C](https:/ | Project | What it is for | Status | | --- | --- | --- | -| **[SNode.C](https://github.com/SNodeC/snode.c#project-overview)** | Write networked programs and your own protocols in C++: event-driven, with HTTP, WebSocket, SSE and MQTT
[Quick start](https://github.com/SNodeC/snode.c#quick-start) · [Install](https://github.com/SNodeC/snode.c#install) · [Releases](https://github.com/SNodeC/snode.c/releases) | [![CI](https://github.com/SNodeC/snode.c/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/SNodeC/snode.c/actions/workflows/ci.yml) | -| **[MQTTSuite](https://github.com/SNodeC/mqttsuite#project-overview)** | Run an MQTT broker, translate topics, bridge brokers and store messages
[Quick start](https://github.com/SNodeC/mqttsuite#quick-start) · [Install](https://github.com/SNodeC/mqttsuite#install) · [Releases](https://github.com/SNodeC/mqttsuite/releases) | [![CI](https://github.com/SNodeC/mqttsuite/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/SNodeC/mqttsuite/actions/workflows/ci.yml) | -| **[AISuite](https://github.com/SNodeC/AISuite#project-overview)** | Connect applications to coding agents: asynchronous C++ and TypeScript
[Quick start](https://github.com/SNodeC/AISuite#quick-start) · [Install](https://github.com/SNodeC/AISuite#install) | [![CI](https://github.com/SNodeC/AISuite/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/SNodeC/AISuite/actions/workflows/ci.yml) | -| **[Codex(W)UI](https://github.com/SNodeC/CodexUI#project-overview)** | Follow a coding agent's work in a native Qt or browser workspace
[Quick start](https://github.com/SNodeC/CodexUI#quick-start) · [Install](https://github.com/SNodeC/CodexUI#install) | [![CI](https://github.com/SNodeC/CodexUI/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/SNodeC/CodexUI/actions/workflows/ci.yml) | +| **[SNode.C](https://github.com/SNodeC/snode.c#project-overview)** | Write networked programs and your own protocols in C++: event-driven, with HTTP, WebSocket, SSE and MQTT
[Quick start](https://github.com/SNodeC/snode.c#quick-start) · [Install](https://github.com/SNodeC/snode.c#install) · [Releases](https://github.com/SNodeC/snode.c/releases) | [![CI](https://github.com/SNodeC/snode.c/actions/workflows/build-and-test.yml/badge.svg?branch=master)](https://github.com/SNodeC/snode.c/actions/workflows/build-and-test.yml) | +| **[MQTTSuite](https://github.com/SNodeC/mqttsuite#project-overview)** | Run an MQTT broker, translate topics, bridge brokers and store messages
[Quick start](https://github.com/SNodeC/mqttsuite#quick-start) · [Install](https://github.com/SNodeC/mqttsuite#install) · [Releases](https://github.com/SNodeC/mqttsuite/releases) | [![CI](https://github.com/SNodeC/mqttsuite/actions/workflows/build-and-test.yml/badge.svg?branch=master)](https://github.com/SNodeC/mqttsuite/actions/workflows/build-and-test.yml) | +| **[AISuite](https://github.com/SNodeC/AISuite#project-overview)** | Connect applications to coding agents: asynchronous C++ and TypeScript
[Quick start](https://github.com/SNodeC/AISuite#quick-start) · [Install](https://github.com/SNodeC/AISuite#install) | [![CI](https://github.com/SNodeC/AISuite/actions/workflows/build-and-test.yml/badge.svg?branch=master)](https://github.com/SNodeC/AISuite/actions/workflows/build-and-test.yml) | +| **[Codex(W)UI](https://github.com/SNodeC/CodexUI#project-overview)** | Follow a coding agent's work in a native Qt or browser workspace
[Quick start](https://github.com/SNodeC/CodexUI#quick-start) · [Install](https://github.com/SNodeC/CodexUI#install) | [![CI](https://github.com/SNodeC/CodexUI/actions/workflows/build-and-qualify.yml/badge.svg?branch=master)](https://github.com/SNodeC/CodexUI/actions/workflows/build-and-qualify.yml) | | **[SNode.C-idp](https://github.com/SNodeC/snode.c-idp)** | SNode.C Identity Provider: OAuth2 and OpenID Connect with TOTP multi-factor authentication | | ## Install diff --git a/profile/github-metadata.json b/profile/github-metadata.json index 229415a..1796a3a 100644 --- a/profile/github-metadata.json +++ b/profile/github-metadata.json @@ -1,18 +1,18 @@ { ".github": { "default_branch": "main", - "workflow": ".github/workflows/ci.yml" + "workflow": ".github/workflows/validate-organization.yml" }, "AISuite": { "default_branch": "master", "readme_anchor": "project-overview", - "source_commit": "2ca800516b45eba7f5fb2c055adebfe7c53ee51f", - "workflow": ".github/workflows/ci.yml" + "source_commit": "45bbc477546bca8055575c17cebbb16db7bb24be", + "workflow": ".github/workflows/build-and-test.yml" }, "AutoTalk": { "default_branch": "main", - "source_commit": "36ab5fb80b029e6ecaf292353c0b6ff9f9ca6671", - "workflow": ".github/workflows/ci.yml" + "source_commit": "cef28ba531e25116ed7b5557886b9d88867f61d2", + "workflow": ".github/workflows/test-and-package.yml" }, "CLI11": { "default_branch": "main", @@ -22,13 +22,13 @@ "CodexUI": { "default_branch": "master", "readme_anchor": "project-overview", - "source_commit": "292d45a616daabc32a58fc4742dfb82657d0d107", - "workflow": ".github/workflows/ci.yml" + "source_commit": "33a5357bee5978ecaa31a2b7dab55b858843e9f7", + "workflow": ".github/workflows/build-and-qualify.yml" }, "DistributionPackages": { "default_branch": "main", - "source_commit": "40d7a9638125de8e384150693cf3328d6afaed72", - "workflow": ".github/workflows/release.yml" + "source_commit": "f941021a88953cf962ac2b926e456cb25d2fda18", + "workflow": ".github/workflows/sign-and-publish-packages.yml" }, "GpsdOsmViewer": { "default_branch": "master", @@ -116,8 +116,8 @@ "prerelease": false, "tag": "v1.0.2" }, - "source_commit": "af349df3a418a046796c80debe1a960e5243793d", - "workflow": ".github/workflows/ci.yml" + "source_commit": "3cfaa5dde4af54970ef3f5132d2cd26c4d5277a8", + "workflow": ".github/workflows/build-and-test.yml" }, "mqttsuite-doc": { "default_branch": "main", @@ -139,8 +139,8 @@ "prerelease": false, "tag": "v2.0.0" }, - "source_commit": "692c914dd8bcfa2cc070cfb589f5b645185efad5", - "workflow": ".github/workflows/ci.yml" + "source_commit": "2ab5974153f7e36641e77791a888debd575b897f", + "workflow": ".github/workflows/build-and-test.yml" }, "snode.c-doc": { "default_branch": "main", diff --git a/templates/build-and-test.yml b/templates/build-and-test.yml new file mode 100644 index 0000000..ec848d0 --- /dev/null +++ b/templates/build-and-test.yml @@ -0,0 +1,6 @@ +name: Build and test project +on: [workflow_dispatch] +permissions: { contents: read } +jobs: + snodec: + uses: SNodeC/.github/.github/workflows/verify-project.yml@main diff --git a/templates/ci.yml b/templates/ci.yml deleted file mode 100644 index dc5ec0d..0000000 --- a/templates/ci.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: CI -on: [workflow_dispatch] -permissions: { contents: read } -jobs: - snodec: - uses: SNodeC/.github/.github/workflows/verify.yml@main diff --git a/tests/test_verify.py b/tests/test_verify.py index 3713388..94ac61a 100644 --- a/tests/test_verify.py +++ b/tests/test_verify.py @@ -12,7 +12,7 @@ import yaml ROOT = Path(__file__).resolve().parents[1] -WORKFLOW = yaml.load((ROOT / ".github/workflows/verify.yml").read_text(), Loader=yaml.BaseLoader) +WORKFLOW = yaml.load((ROOT / ".github/workflows/verify-project.yml").read_text(), Loader=yaml.BaseLoader) def script(job, name): @@ -141,18 +141,18 @@ def test_jobs_have_bounded_timeouts_fixed_linux_and_full_action_pins(self): for step in job["steps"]: if "uses" in step: self.assertRegex(step["uses"], r"^actions/(checkout|setup-python|upload-artifact)@[0-9a-f]{40}$") - text = (ROOT / ".github/workflows/verify.yml").read_text() + text = (ROOT / ".github/workflows/verify-project.yml").read_text() for line in text.splitlines(): if "uses:" in line: self.assertRegex(line, r"@[0-9a-f]{40} # v[0-9]+\.[0-9]+\.[0-9]+$") def test_template_exact_and_control_checks_independent(self): - self.assertEqual((ROOT / "templates/ci.yml").read_text(), - "name: CI\non: [workflow_dispatch]\n" + self.assertEqual((ROOT / "templates/build-and-test.yml").read_text(), + "name: Build and test project\non: [workflow_dispatch]\n" "permissions: { contents: read }\njobs:\n snodec:\n" - " uses: SNodeC/.github/.github/workflows/verify.yml@main\n") - ci = yaml.load((ROOT / ".github/workflows/ci.yml").read_text(), Loader=yaml.BaseLoader) + " uses: SNodeC/.github/.github/workflows/verify-project.yml@main\n") + ci = yaml.load((ROOT / ".github/workflows/validate-organization.yml").read_text(), Loader=yaml.BaseLoader) steps = ci["jobs"]["control"]["steps"] self.assertEqual(ci["on"], ["push", "pull_request", "workflow_dispatch"]) self.assertEqual(ci["jobs"]["control"]["runs-on"], "ubuntu-24.04")