@cldmv/gh-broker 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +134 -40
- package/config.example.json +21 -8
- package/config.sample.json +45 -0
- package/deploy/README.md +73 -15
- package/deploy/install.mjs +166 -101
- package/deploy/install.sh +0 -0
- package/deploy/lib/config-merge.mjs +174 -16
- package/deploy/lib/credentials.mjs +143 -0
- package/deploy/lib/install-args.mjs +144 -0
- package/deploy/lib/npm-setup.mjs +164 -0
- package/deploy/lib/secret-store.mjs +20 -2
- package/deploy/lib/system.mjs +26 -2
- package/dist/index.mjs +1638 -202
- package/dist/index.mjs.map +4 -4
- package/docs/TOOLS.md +192 -1
- package/docs/changelog/v0/v0.8.0.md +115 -0
- package/docs/deploy-architecture.md +13 -11
- package/package.json +7 -7
- package/src/availability.ts +42 -0
- package/src/catalog.ts +18 -1
- package/src/config.ts +29 -2
- package/src/router.ts +43 -2
- package/src/secrets.ts +34 -4
- package/src/types.ts +25 -1
- package/src/verbs/ghcr/archive.ts +314 -0
- package/src/verbs/ghcr/config.ts +142 -0
- package/src/verbs/ghcr/jobs.ts +141 -0
- package/src/verbs/ghcr/push.ts +192 -0
- package/src/verbs/ghcr/registry.ts +275 -0
- package/src/verbs/ghcr/tar.ts +203 -0
- package/src/verbs/ghcr_push.ts +264 -0
- package/src/verbs/npm-registry.ts +168 -0
- package/src/verbs/npm-tarball.ts +76 -0
- package/src/verbs/npm_scaffold.ts +325 -0
- package/src/verbs/release-analysis.ts +3 -1
- package/tests/catalog.test.vitest.mts +55 -1
- package/tests/config-merge.test.vitest.mts +275 -8
- package/tests/config.test.vitest.mts +75 -1
- package/tests/credentials.test.vitest.mts +127 -0
- package/tests/ghcr-archive.test.vitest.mts +439 -0
- package/tests/ghcr-config.test.vitest.mts +96 -0
- package/tests/ghcr-push.test.vitest.mts +526 -0
- package/tests/ghcr-registry.test.vitest.mts +206 -0
- package/tests/helpers/ghcr-fixtures.mts +373 -0
- package/tests/install-args.test.vitest.mts +152 -0
- package/tests/issue-labels.test.vitest.mts +15 -0
- package/tests/npm-scaffold.test.vitest.mts +479 -0
- package/tests/npm-setup.test.vitest.mts +196 -0
- package/tests/paths.test.vitest.mts +5 -0
- package/tests/prompt.test.vitest.mts +128 -0
- package/tests/release-prs.test.vitest.mts +10 -0
- package/tests/router.test.vitest.mts +108 -2
- package/tests/secret-store.test.vitest.mts +64 -3
- package/tests/secrets.test.vitest.mts +53 -0
- package/tests/security-alerts.test.vitest.mts +10 -0
- package/tests/server.test.vitest.mts +187 -7
- package/tests/smoke.test.vitest.mts +177 -0
- package/tests/system.test.vitest.mts +355 -0
- package/tests/verb-helpers.test.vitest.mts +46 -0
- package/.configs/fix-headers.json +0 -3
- package/.configs/vitest.config.mjs +0 -44
- package/.github/dependabot.yml +0 -111
- package/.github/workflows/branch-retention.yml +0 -44
- package/.github/workflows/bundle-size.yml +0 -52
- package/.github/workflows/ci.yml +0 -389
- package/.github/workflows/cla.yml +0 -66
- package/.github/workflows/codeql.yml +0 -87
- package/.github/workflows/dependabot-auto-merge.yml +0 -62
- package/.github/workflows/dependabot-recreate.yml +0 -67
- package/.github/workflows/dependency-review.yml +0 -46
- package/.github/workflows/feature-pr.yml +0 -75
- package/.github/workflows/hotfix-redirector.yml +0 -67
- package/.github/workflows/hotfixes-release.yml +0 -70
- package/.github/workflows/labeler.yml +0 -48
- package/.github/workflows/master-commit-audit.yml +0 -56
- package/.github/workflows/member-auto-merge.yml +0 -75
- package/.github/workflows/next-release.yml +0 -76
- package/.github/workflows/next-reset.yml +0 -50
- package/.github/workflows/pr-notify.yml +0 -44
- package/.github/workflows/pr-title-normalizer.yml +0 -52
- package/.github/workflows/provenance.yml +0 -51
- package/.github/workflows/publish.yml +0 -146
- package/.github/workflows/release-merge.yml +0 -104
- package/.github/workflows/release-notify.yml +0 -41
- package/.github/workflows/scorecard.yml +0 -64
- package/.github/workflows/stale.yml +0 -50
- package/.github/workflows/tag-health.yml +0 -70
- package/.github/workflows/update-major-version-tags.yml +0 -94
- package/.github/workflows/v4-bootstrap.yml +0 -115
- package/.github/workflows/welcome.yml +0 -42
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# @Project: @cldmv/gh-broker
|
|
3
|
-
# @Filename: /.github/workflows/pr-notify.yml
|
|
4
|
-
# @Date: 2026-05-26T00:00:00-07:00 (1779778800)
|
|
5
|
-
# @Author: Nate Corcoran <CLDMV>
|
|
6
|
-
# @Email: <Shinrai@users.noreply.github.com>
|
|
7
|
-
# -----
|
|
8
|
-
# @Last modified by: Nate Corcoran <CLDMV> (Shinrai@users.noreply.github.com)
|
|
9
|
-
# @Last modified time: 2026-10-02T11:30:57-07:00 (1790965857)
|
|
10
|
-
# -----
|
|
11
|
-
# @Copyright: Copyright (c) 2013-2026 Catalyzed Motivation Inc. All rights reserved.
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
# Individual repo: .github/workflows/pr-notify.yml
|
|
15
|
-
#
|
|
16
|
-
# Fires once per PR open. Targets ALL PRs in the repo (including the release
|
|
17
|
-
# PRs opened by the release-flow workflows) — exactly one notification per
|
|
18
|
-
# PR-open event.
|
|
19
|
-
#
|
|
20
|
-
# Channels are addressed by secret name; no config file. Set the secret to
|
|
21
|
-
# enable the channel, leave it unset to skip:
|
|
22
|
-
#
|
|
23
|
-
# DISCORD_PR_PUBLIC_WEBHOOK / DISCORD_PR_PRIVATE_WEBHOOK
|
|
24
|
-
# SLACK_PR_PUBLIC_WEBHOOK / SLACK_PR_PRIVATE_WEBHOOK
|
|
25
|
-
# GENERIC_PR_PUBLIC_WEBHOOK / GENERIC_PR_PRIVATE_WEBHOOK
|
|
26
|
-
#
|
|
27
|
-
# Visibility is determined automatically from the repo: GitHub `public` →
|
|
28
|
-
# PUBLIC, `private` or `internal` → PRIVATE. Set the org-level secret in
|
|
29
|
-
# CLDMV for the default URL; set a repo-level secret with the same name to
|
|
30
|
-
# override (or to an empty string to mute that channel for this repo).
|
|
31
|
-
name: 📥 PR Notify
|
|
32
|
-
|
|
33
|
-
on:
|
|
34
|
-
pull_request:
|
|
35
|
-
types: [opened]
|
|
36
|
-
|
|
37
|
-
permissions:
|
|
38
|
-
contents: read
|
|
39
|
-
pull-requests: read
|
|
40
|
-
|
|
41
|
-
jobs:
|
|
42
|
-
notify:
|
|
43
|
-
uses: CLDMV/.github/.github/workflows/reusable-pr-notifier.yml@v4
|
|
44
|
-
secrets: inherit
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# @Project: @cldmv/gh-broker
|
|
3
|
-
# @Filename: /.github/workflows/pr-title-normalizer.yml
|
|
4
|
-
# @Date: 2026-05-22T00:00:00-07:00 (1779433200)
|
|
5
|
-
# @Author: Nate Corcoran <CLDMV>
|
|
6
|
-
# @Email: <Shinrai@users.noreply.github.com>
|
|
7
|
-
# -----
|
|
8
|
-
# @Last modified by: Nate Corcoran <CLDMV> (Shinrai@users.noreply.github.com)
|
|
9
|
-
# @Last modified time: 2026-10-02T11:30:57-07:00 (1790965857)
|
|
10
|
-
# -----
|
|
11
|
-
# @Copyright: Copyright (c) 2013-2026 Catalyzed Motivation Inc. All rights reserved.
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
# Individual repo: .github/workflows/pr-title-normalizer.yml
|
|
15
|
-
#
|
|
16
|
-
# Normalize contributor PR titles to Conventional Commits format, derived from
|
|
17
|
-
# the highest-priority commit in the PR. The release flow expects this shape, so
|
|
18
|
-
# a v4 repo wants this enabled. (Also backportable to v3 repos — the underlying
|
|
19
|
-
# action shipped in v3.3.0; it owns all skip logic: bot authors, the
|
|
20
|
-
# long-running release PRs, titles already starting with `release:`, and titles
|
|
21
|
-
# that already conform.)
|
|
22
|
-
#
|
|
23
|
-
# Thin caller: all job logic lives in the reusable, pinned at @v4. Bumping the
|
|
24
|
-
# pin carries fixes without editing this file.
|
|
25
|
-
name: 🏷️ PR Title Normalizer
|
|
26
|
-
|
|
27
|
-
# SECURITY NOTE: pull_request_target runs in the BASE repo's context with WRITE
|
|
28
|
-
# permissions and access to secrets. SAFE — the reusable's path is API-only (it
|
|
29
|
-
# never checks out or executes PR content). Triggers on opened + synchronize
|
|
30
|
-
# only (NOT edited): a maintainer hand-editing the title must not kick off a
|
|
31
|
-
# re-normalize loop.
|
|
32
|
-
on:
|
|
33
|
-
pull_request_target:
|
|
34
|
-
types: [opened, synchronize]
|
|
35
|
-
|
|
36
|
-
concurrency:
|
|
37
|
-
group: pr-title-normalizer-${{ github.event.pull_request.number }}
|
|
38
|
-
cancel-in-progress: true
|
|
39
|
-
|
|
40
|
-
permissions:
|
|
41
|
-
contents: read
|
|
42
|
-
|
|
43
|
-
jobs:
|
|
44
|
-
normalize:
|
|
45
|
-
permissions:
|
|
46
|
-
contents: read
|
|
47
|
-
pull-requests: write
|
|
48
|
-
uses: CLDMV/.github/.github/workflows/workflow-pr-title-normalizer.yml@v4
|
|
49
|
-
secrets:
|
|
50
|
-
# Map your repo/org secrets to the expected names.
|
|
51
|
-
BOT_APP_CLIENT_ID: ${{ secrets.CLDMV_BOT_APP_CLIENT_ID }}
|
|
52
|
-
BOT_APP_PRIVATE_KEY: ${{ secrets.CLDMV_BOT_APP_PRIVATE_KEY }}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# @Project: @cldmv/gh-broker
|
|
3
|
-
# @Filename: /.github/workflows/provenance.yml
|
|
4
|
-
# @Date: 2026-09-05T00:00:00-07:00 (1788591600)
|
|
5
|
-
# @Author: Nate Corcoran <CLDMV>
|
|
6
|
-
# @Email: <Shinrai@users.noreply.github.com>
|
|
7
|
-
# -----
|
|
8
|
-
# @Last modified by: Nate Corcoran <CLDMV> (Shinrai@users.noreply.github.com)
|
|
9
|
-
# @Last modified time: 2026-10-02T11:30:57-07:00 (1790965857)
|
|
10
|
-
# -----
|
|
11
|
-
# @Copyright: Copyright (c) 2013-2026 Catalyzed Motivation Inc. All rights reserved.
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
# SLSA build provenance (.intoto.jsonl) for this repo's published releases.
|
|
15
|
-
# Decoupled from the publish workflow on purpose (see reusable-provenance.yml):
|
|
16
|
-
# the SLSA generator is a reusable-workflow call and cannot carry
|
|
17
|
-
# `continue-on-error`, so running it here — on its own `release: published`
|
|
18
|
-
# trigger — keeps a provenance failure from ever turning a release run red
|
|
19
|
-
# (issue #268). It re-packs the SAME build artifact the publish run uploaded, so
|
|
20
|
-
# the signed subjects are byte-identical to what was published.
|
|
21
|
-
#
|
|
22
|
-
# Prereq: the org's allowed actions/reusable-workflows policy must permit
|
|
23
|
-
# slsa-framework/*.
|
|
24
|
-
name: 🔏 SLSA Provenance
|
|
25
|
-
|
|
26
|
-
on:
|
|
27
|
-
release:
|
|
28
|
-
types: [published]
|
|
29
|
-
|
|
30
|
-
jobs:
|
|
31
|
-
provenance:
|
|
32
|
-
# Public, real releases only — SLSA provenance is recorded in the public
|
|
33
|
-
# Rekor transparency log. Skip drafts, prereleases, and private repos.
|
|
34
|
-
if: |
|
|
35
|
-
!github.event.repository.private &&
|
|
36
|
-
!github.event.release.draft &&
|
|
37
|
-
!github.event.release.prerelease
|
|
38
|
-
permissions:
|
|
39
|
-
actions: read # look up the publish run's build artifact
|
|
40
|
-
id-token: write # provenance signing (OIDC)
|
|
41
|
-
contents: write # upload the .intoto.jsonl release asset
|
|
42
|
-
uses: CLDMV/.github/.github/workflows/reusable-provenance.yml@v4
|
|
43
|
-
with:
|
|
44
|
-
tag: ${{ github.event.release.tag_name }}
|
|
45
|
-
# CUSTOMIZE: these MUST match your publish.yml so the re-packed
|
|
46
|
-
# tarballs are byte-identical to what was published.
|
|
47
|
-
package_name: "@cldmv/gh-broker"
|
|
48
|
-
node_version: "lts/*"
|
|
49
|
-
# Satellite packages (same value as publish.yml's extra_packages);
|
|
50
|
-
# empty disables. See docs/conventions/satellite-packages.md.
|
|
51
|
-
extra_packages: ""
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# @Project: @cldmv/gh-broker
|
|
3
|
-
# @Filename: /.github/workflows/publish.yml
|
|
4
|
-
# @Date: 2026-05-20T00:00:00-07:00 (1779260400)
|
|
5
|
-
# @Author: Nate Corcoran <CLDMV>
|
|
6
|
-
# @Email: <Shinrai@users.noreply.github.com>
|
|
7
|
-
# -----
|
|
8
|
-
# @Last modified by: Nate Corcoran <CLDMV> (Shinrai@users.noreply.github.com)
|
|
9
|
-
# @Last modified time: 2026-10-02T11:30:57-07:00 (1790965857)
|
|
10
|
-
# -----
|
|
11
|
-
# @Copyright: Copyright (c) 2013-2026 Catalyzed Motivation Inc. All rights reserved.
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
# Individual repo: .github/workflows/publish.yml
|
|
15
|
-
name: 📦 Release and Publish
|
|
16
|
-
|
|
17
|
-
on:
|
|
18
|
-
push:
|
|
19
|
-
branches: [master, main]
|
|
20
|
-
paths-ignore:
|
|
21
|
-
- "**.md"
|
|
22
|
-
- ".github/ISSUE_TEMPLATE/**"
|
|
23
|
-
- ".github/PULL_REQUEST_TEMPLATE/**"
|
|
24
|
-
workflow_dispatch:
|
|
25
|
-
inputs:
|
|
26
|
-
debug:
|
|
27
|
-
description: "Enable debug logging for troubleshooting"
|
|
28
|
-
type: boolean
|
|
29
|
-
required: false
|
|
30
|
-
default: false
|
|
31
|
-
dry_run:
|
|
32
|
-
description: "Dry run mode - validate everything but don't publish or create releases"
|
|
33
|
-
type: boolean
|
|
34
|
-
required: false
|
|
35
|
-
default: false
|
|
36
|
-
node_version:
|
|
37
|
-
description: "Node.js version to use (default: lts/*)"
|
|
38
|
-
type: string
|
|
39
|
-
required: false
|
|
40
|
-
default: "lts/*"
|
|
41
|
-
package_manager:
|
|
42
|
-
description: "Package manager (npm or yarn)"
|
|
43
|
-
type: string
|
|
44
|
-
required: false
|
|
45
|
-
default: "npm"
|
|
46
|
-
test_environment:
|
|
47
|
-
description: "Environment for tests (affects NODE_ENV and NODE_OPTIONS --conditions flag)"
|
|
48
|
-
type: string
|
|
49
|
-
required: false
|
|
50
|
-
default: "development"
|
|
51
|
-
version:
|
|
52
|
-
description: "Version to publish (auto-detected from package.json if not provided)"
|
|
53
|
-
type: string
|
|
54
|
-
required: false
|
|
55
|
-
default: ""
|
|
56
|
-
publish_to_npm:
|
|
57
|
-
description: "Publish to NPM registry"
|
|
58
|
-
type: boolean
|
|
59
|
-
required: false
|
|
60
|
-
default: true
|
|
61
|
-
publish_to_github_packages:
|
|
62
|
-
description: "Publish to GitHub Packages registry"
|
|
63
|
-
type: boolean
|
|
64
|
-
required: false
|
|
65
|
-
default: true
|
|
66
|
-
min_node_version:
|
|
67
|
-
description: "Minimum Node.js version for matrix testing (enables matrix when set; default: 22.12.0 — the floor vitest 5 actually runs on)"
|
|
68
|
-
type: string
|
|
69
|
-
required: false
|
|
70
|
-
default: "22.12.0"
|
|
71
|
-
max_node_major:
|
|
72
|
-
description: "Max Node.js major version for the test matrix. Leave blank (the default) to inherit the CLDMV/.github reusable workflow's default; set a value only to pin/override for a specific run."
|
|
73
|
-
type: string
|
|
74
|
-
required: false
|
|
75
|
-
default: ""
|
|
76
|
-
use_gpg:
|
|
77
|
-
description: "Enable GPG signing (if GPG secrets provided)"
|
|
78
|
-
type: boolean
|
|
79
|
-
required: false
|
|
80
|
-
default: false
|
|
81
|
-
|
|
82
|
-
# NEVER cancel an in-flight publish — half-published versions are nasty to
|
|
83
|
-
# clean up. Concurrent publishes for the same ref queue instead so they
|
|
84
|
-
# serialize naturally.
|
|
85
|
-
concurrency:
|
|
86
|
-
group: publish-${{ github.workflow }}-${{ github.ref }}
|
|
87
|
-
cancel-in-progress: false
|
|
88
|
-
|
|
89
|
-
permissions:
|
|
90
|
-
contents: read
|
|
91
|
-
|
|
92
|
-
jobs:
|
|
93
|
-
publish-package:
|
|
94
|
-
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
|
95
|
-
permissions:
|
|
96
|
-
contents: write
|
|
97
|
-
packages: write
|
|
98
|
-
id-token: write
|
|
99
|
-
uses: CLDMV/.github/.github/workflows/workflow-publish.yml@v4
|
|
100
|
-
with:
|
|
101
|
-
package_name: "@cldmv/gh-broker" # Required: replace with your NPM package name
|
|
102
|
-
debug: ${{ github.event.inputs.debug == 'true' }}
|
|
103
|
-
dry_run: ${{ github.event.inputs.dry_run == 'true' }}
|
|
104
|
-
node_version: ${{ github.event.inputs.node_version || 'lts/*' }}
|
|
105
|
-
package_manager: ${{ github.event.inputs.package_manager || 'npm' }}
|
|
106
|
-
version: ${{ github.event.inputs.version || '' }}
|
|
107
|
-
publish_to_npm: ${{ github.event.inputs.publish_to_npm != 'false' }}
|
|
108
|
-
publish_to_github_packages: ${{ github.event.inputs.publish_to_github_packages != 'false' }}
|
|
109
|
-
publish_command: ""
|
|
110
|
-
github_packages_publish_command: ""
|
|
111
|
-
min_node_version: ${{ github.event.inputs.min_node_version || '22.12.0' }}
|
|
112
|
-
max_node_major: ${{ github.event.inputs.max_node_major || '' }} # blank ⇒ inherit the CLDMV/.github reusable default
|
|
113
|
-
test_command: "npm test" # Use defaults: NODE_ENV=development, NODE_OPTIONS=--conditions=development
|
|
114
|
-
# test_command: "NODE_OPTIONS='--conditions=slothlet-dev' npm test" # Override NODE_OPTIONS only
|
|
115
|
-
# test_command: "NODE_ENV=test npm test" # Override NODE_ENV only
|
|
116
|
-
# test_command: "NODE_ENV=test NODE_OPTIONS='--conditions=slothlet-dev' npm test" # Override both
|
|
117
|
-
test_environment: ${{ github.event.inputs.test_environment || 'development' }} # Alternative to setting in test_command
|
|
118
|
-
build_command: "npm run build:ci"
|
|
119
|
-
# --- Satellite packages (optional) ----------------------------------------
|
|
120
|
-
# Publish extra packages carved from this build's output (e.g. locale JSON,
|
|
121
|
-
# generated types) at the SAME version/commit as the core, each with its own
|
|
122
|
-
# @scope/name@version tag + GitHub Release. Uncomment to opt in.
|
|
123
|
-
# extra_packages: a JSON [{ name, dir }] array, OR a glob (single '*' in the
|
|
124
|
-
# final path segment, e.g. "dist-packages/*"). Empty = disabled.
|
|
125
|
-
# build_subpackages_command: runs after build_command to produce
|
|
126
|
-
# dist-packages/<name>/ — omit if build_command already does the carve.
|
|
127
|
-
# First publish of each new @scope/name needs a one-time token publish +
|
|
128
|
-
# trusted-publisher setup. Full details + the contract:
|
|
129
|
-
# docs/conventions/satellite-packages.md
|
|
130
|
-
# extra_packages: "dist-packages/*"
|
|
131
|
-
# build_subpackages_command: "npm run build:subpackages"
|
|
132
|
-
# --------------------------------------------------------------------------
|
|
133
|
-
is_prerelease: false
|
|
134
|
-
release_source_only: false
|
|
135
|
-
create_documentation: true
|
|
136
|
-
skip_performance_tests: false
|
|
137
|
-
skip_matrix_tests: false
|
|
138
|
-
use_gpg: ${{ github.event.inputs.use_gpg == 'true' }}
|
|
139
|
-
secrets:
|
|
140
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
141
|
-
BOT_APP_CLIENT_ID: ${{ secrets.CLDMV_BOT_APP_CLIENT_ID }}
|
|
142
|
-
BOT_APP_PRIVATE_KEY: ${{ secrets.CLDMV_BOT_APP_PRIVATE_KEY }}
|
|
143
|
-
TAGGER_NAME: ${{ secrets.CLDMV_BOT_NAME }}
|
|
144
|
-
TAGGER_EMAIL: ${{ secrets.CLDMV_BOT_EMAIL }}
|
|
145
|
-
GPG_PRIVATE_KEY: ${{ secrets.CLDMV_BOT_GPG_PRIVATE_KEY }}
|
|
146
|
-
GPG_PASSPHRASE: ${{ secrets.CLDMV_BOT_GPG_PASSPHRASE }}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# @Project: @cldmv/gh-broker
|
|
3
|
-
# @Filename: /.github/workflows/release-merge.yml
|
|
4
|
-
# @Date: 2026-09-29T02:39:40+00:00 (1790649580)
|
|
5
|
-
# @Author: Nate Corcoran <CLDMV>
|
|
6
|
-
# @Email: <Shinrai@users.noreply.github.com>
|
|
7
|
-
# -----
|
|
8
|
-
# @Last modified by: Nate Corcoran <CLDMV> (Shinrai@users.noreply.github.com)
|
|
9
|
-
# @Last modified time: 2026-10-02T11:30:57-07:00 (1790965857)
|
|
10
|
-
# -----
|
|
11
|
-
# @Copyright: Copyright (c) 2013-2026 Catalyzed Motivation Inc. All rights reserved.
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
# Individual repo: .github/workflows/release-merge.yml
|
|
15
|
-
#
|
|
16
|
-
# v4 core (optional): squash-merge the persistent `next → master` release PR on
|
|
17
|
-
# YOUR APPROVAL, via the REST merge API with the PR body as the commit message.
|
|
18
|
-
#
|
|
19
|
-
# Why not just click "Squash and merge"? The mobile Default path can land a
|
|
20
|
-
# title-only commit (dropping the curated changelog + coverage), and the web/
|
|
21
|
-
# mobile squash UI auto-appends its own `Co-authored-by:` list (not deduped, not
|
|
22
|
-
# bot-stripped). An explicit-message API merge avoids both — the release commit
|
|
23
|
-
# is exactly the curated PR body. It also merges only once EVERY check (required
|
|
24
|
-
# AND non-required, e.g. the coverage badge and the release-PR body refresh) has
|
|
25
|
-
# finished and passed, so the body it captures is never stale.
|
|
26
|
-
#
|
|
27
|
-
# How you use it: approve the release PR as you normally do. The merge fires when
|
|
28
|
-
# CI is green — if you approve before CI finishes, it re-evaluates once CI
|
|
29
|
-
# actually finishes and merges once the last check passes. Nothing auto-merges
|
|
30
|
-
# without your approval.
|
|
31
|
-
#
|
|
32
|
-
# Re-evaluation uses `workflow_run`, not `check_suite` — GitHub does not send
|
|
33
|
-
# `check_suite: completed` for a suite created by GitHub Actions itself, which
|
|
34
|
-
# is every check your own ci.yml produces; it only fires for a suite created
|
|
35
|
-
# by a third-party App. See CLDMV/.github#318: an approval given before CI
|
|
36
|
-
# finished left a release PR stuck fully green with nothing re-firing the
|
|
37
|
-
# merge check, because check_suite silently never fired for that case at all.
|
|
38
|
-
# `workflow_run` is GitHub's documented replacement for exactly this pattern.
|
|
39
|
-
#
|
|
40
|
-
# IMPORTANT: the merge gate waits on EVERY check-run on the release PR's head
|
|
41
|
-
# commit, from any workflow — so `workflows:` below must name every workflow in
|
|
42
|
-
# your repo that puts a check on that commit, not just ci.yml. Only the one that
|
|
43
|
-
# finishes LAST can see a fully green head; if it isn't listed, nothing re-fires
|
|
44
|
-
# and the PR sits approved + green until you dispatch this workflow by hand.
|
|
45
|
-
# CodeQL in particular routinely outlasts ci.yml (CLDMV/.github PR #322 stuck
|
|
46
|
-
# exactly this way). The list below covers the standard v4 template set by their
|
|
47
|
-
# template `name:`s — names are matched literally (not by filename), so fix any
|
|
48
|
-
# you renamed, and add any extra PR-triggered workflow your repo has. Listing a
|
|
49
|
-
# workflow your repo doesn't have is harmless. `branches:` limits re-fires to
|
|
50
|
-
# runs on the integration branches, so feature-branch CI doesn't wake this up.
|
|
51
|
-
#
|
|
52
|
-
# Thin caller: all logic lives in the reusable, pinned at @v4.
|
|
53
|
-
# NOTE: pull_request_review / workflow_run events run the copy of this file on
|
|
54
|
-
# the DEFAULT branch, so it takes effect once it ships to master with a release.
|
|
55
|
-
name: 🚦 Release Merge (v4)
|
|
56
|
-
|
|
57
|
-
on:
|
|
58
|
-
pull_request_review:
|
|
59
|
-
types: [submitted] # your approval arms it
|
|
60
|
-
workflow_run: # re-evaluate as each check-producing workflow finishes — see #318
|
|
61
|
-
workflows: # ← must match your workflows' `name:`s — see IMPORTANT above
|
|
62
|
-
- "🧪 CI Tests & Build"
|
|
63
|
-
- "🔍 CodeQL"
|
|
64
|
-
- "🔒 Dependency Review"
|
|
65
|
-
- "📊 Bundle Size"
|
|
66
|
-
- "🚀 Next Release (v4)"
|
|
67
|
-
- "🚑 Hotfixes Release (v4)"
|
|
68
|
-
- "🌿 Branch Retention"
|
|
69
|
-
- "🏷️ PR Labeler"
|
|
70
|
-
- "🏷️ PR Title Normalizer"
|
|
71
|
-
- "👋 Welcome Contributor"
|
|
72
|
-
- "🔀 Hotfix PR Redirector (v4)"
|
|
73
|
-
- "🚀 Member Auto-Enable Auto-Merge"
|
|
74
|
-
- "🤖 Dependabot Auto-Merge"
|
|
75
|
-
- "🔁 Dependabot Auto-Recreate"
|
|
76
|
-
- "📜 CLA"
|
|
77
|
-
- "📥 PR Notify"
|
|
78
|
-
types: [completed]
|
|
79
|
-
branches: [next, hotfixes]
|
|
80
|
-
workflow_dispatch: # manual re-evaluation
|
|
81
|
-
|
|
82
|
-
# Serialize per repo: each run re-resolves the release PR + re-gates the head,
|
|
83
|
-
# so queue (don't cancel) to avoid racing a merge that's already in flight.
|
|
84
|
-
# GitHub keeps one pending run per group and a newer arrival replaces it — that
|
|
85
|
-
# is harmless, since every run re-reads approval + check state from the API.
|
|
86
|
-
concurrency:
|
|
87
|
-
group: release-merge-${{ github.repository }}
|
|
88
|
-
cancel-in-progress: false
|
|
89
|
-
|
|
90
|
-
permissions:
|
|
91
|
-
contents: read
|
|
92
|
-
|
|
93
|
-
jobs:
|
|
94
|
-
merge:
|
|
95
|
-
permissions:
|
|
96
|
-
contents: write
|
|
97
|
-
pull-requests: write
|
|
98
|
-
checks: read
|
|
99
|
-
statuses: read
|
|
100
|
-
uses: CLDMV/.github/.github/workflows/workflow-release-merge.yml@v4
|
|
101
|
-
secrets:
|
|
102
|
-
# Map your repo/org secrets to the expected names.
|
|
103
|
-
BOT_APP_CLIENT_ID: ${{ secrets.CLDMV_BOT_APP_CLIENT_ID }}
|
|
104
|
-
BOT_APP_PRIVATE_KEY: ${{ secrets.CLDMV_BOT_APP_PRIVATE_KEY }}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# @Project: @cldmv/gh-broker
|
|
3
|
-
# @Filename: /.github/workflows/release-notify.yml
|
|
4
|
-
# @Date: 2026-07-19T00:00:00-07:00 (1784444400)
|
|
5
|
-
# @Author: Nate Corcoran <CLDMV>
|
|
6
|
-
# @Email: <Shinrai@users.noreply.github.com>
|
|
7
|
-
# -----
|
|
8
|
-
# @Last modified by: Nate Corcoran <CLDMV> (Shinrai@users.noreply.github.com)
|
|
9
|
-
# @Last modified time: 2026-10-02T11:30:57-07:00 (1790965857)
|
|
10
|
-
# -----
|
|
11
|
-
# @Copyright: Copyright (c) 2013-2026 Catalyzed Motivation Inc. All rights reserved.
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
# Individual repo: .github/workflows/release-notify.yml
|
|
15
|
-
#
|
|
16
|
-
# Fires on `release: published` and dispatches the release announcement to
|
|
17
|
-
# any enabled webhook. No config file — each channel is just a secret:
|
|
18
|
-
#
|
|
19
|
-
# DISCORD_RELEASES_PUBLIC_WEBHOOK / DISCORD_RELEASES_PRIVATE_WEBHOOK
|
|
20
|
-
# SLACK_RELEASES_PUBLIC_WEBHOOK / SLACK_RELEASES_PRIVATE_WEBHOOK
|
|
21
|
-
# GENERIC_RELEASES_PUBLIC_WEBHOOK / GENERIC_RELEASES_PRIVATE_WEBHOOK
|
|
22
|
-
#
|
|
23
|
-
# Visibility is determined automatically from the repo: GitHub `public` →
|
|
24
|
-
# PUBLIC, `private` or `internal` → PRIVATE. Set the org-level secret in
|
|
25
|
-
# CLDMV for the default URL; set a repo-level secret with the same name to
|
|
26
|
-
# override (or to an empty string to mute that channel for this repo).
|
|
27
|
-
name: 📣 Release Notify
|
|
28
|
-
|
|
29
|
-
on:
|
|
30
|
-
release:
|
|
31
|
-
types: [published]
|
|
32
|
-
|
|
33
|
-
permissions:
|
|
34
|
-
contents: read
|
|
35
|
-
|
|
36
|
-
jobs:
|
|
37
|
-
notify:
|
|
38
|
-
# Defensive: skip untagged releases (mirrors Batch 1.2's filter)
|
|
39
|
-
if: github.event.release.tag_name != ''
|
|
40
|
-
uses: CLDMV/.github/.github/workflows/reusable-release-notifier.yml@v4
|
|
41
|
-
secrets: inherit
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# @Project: @cldmv/gh-broker
|
|
3
|
-
# @Filename: /.github/workflows/scorecard.yml
|
|
4
|
-
# @Date: 2026-05-31T00:00:00-07:00 (1780210800)
|
|
5
|
-
# @Author: Nate Corcoran <CLDMV>
|
|
6
|
-
# @Email: <Shinrai@users.noreply.github.com>
|
|
7
|
-
# -----
|
|
8
|
-
# @Last modified by: Nate Corcoran <CLDMV> (Shinrai@users.noreply.github.com)
|
|
9
|
-
# @Last modified time: 2026-10-02T11:30:57-07:00 (1790965857)
|
|
10
|
-
# -----
|
|
11
|
-
# @Copyright: Copyright (c) 2013-2026 Catalyzed Motivation Inc. All rights reserved.
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
# Individual repo: .github/workflows/scorecard.yml
|
|
15
|
-
#
|
|
16
|
-
# OpenSSF Scorecard — scans the repo against ~18 security best-practice checks
|
|
17
|
-
# and produces a 0-10 score. Thin caller: the steps and the SHA-pinned
|
|
18
|
-
# scorecard-action version live in reusable-scorecard.yml@v4, so the action
|
|
19
|
-
# version can't drift in this copy (it just calls the org reusable). Triggers
|
|
20
|
-
# stay here, per OpenSSF's recommended setup.
|
|
21
|
-
name: 🔬 OpenSSF Scorecard
|
|
22
|
-
|
|
23
|
-
on:
|
|
24
|
-
branch_protection_rule:
|
|
25
|
-
schedule:
|
|
26
|
-
- cron: "32 7 * * 1" # weekly Monday 07:32 UTC
|
|
27
|
-
push:
|
|
28
|
-
branches: [master, main]
|
|
29
|
-
workflow_dispatch:
|
|
30
|
-
|
|
31
|
-
# Caller must grant what the reusable needs — notably id-token: write for the
|
|
32
|
-
# OpenSSF transparency-log publish.
|
|
33
|
-
#
|
|
34
|
-
# Keep the workflow-level grant READ-ONLY (contents: read) and grant every
|
|
35
|
-
# WRITE on the `analyze` job instead. scorecard-action's publish step verifies that write permissions
|
|
36
|
-
# were granted JOB-scoped, not workflow-wide (matching OSSF's own example:
|
|
37
|
-
# https://github.com/ossf/scorecard-action#example-workflow). A workflow-level
|
|
38
|
-
# grant satisfies GitHub's own reusable-workflow permission rules fine, but
|
|
39
|
-
# still trips scorecard-action's own check — the rejection ("workflow
|
|
40
|
-
# verification failed: global perm is set to write: permission for X is set
|
|
41
|
-
# to write") means "granted globally," not "forbidden."
|
|
42
|
-
#
|
|
43
|
-
# Do NOT add security-events: write here while publish_results: true below.
|
|
44
|
-
# scorecard-action's publish step rejects submissions from a workflow whose
|
|
45
|
-
# token has security-events write access (it verifies the caller can't have
|
|
46
|
-
# tampered with results before they hit the public transparency log). That
|
|
47
|
-
# trade-off means the reusable's own SARIF-to-Security-tab upload step has no
|
|
48
|
-
# permission to run in this configuration; the public OpenSSF badge is the
|
|
49
|
-
# thing this default enables, so consumers take that trade-off by default.
|
|
50
|
-
# Only add security-events: write back (job-scoped) if publish_results is set
|
|
51
|
-
# to false instead (SARIF-to-Security-tab upload, no public badge).
|
|
52
|
-
|
|
53
|
-
permissions:
|
|
54
|
-
contents: read
|
|
55
|
-
|
|
56
|
-
jobs:
|
|
57
|
-
analyze:
|
|
58
|
-
permissions:
|
|
59
|
-
id-token: write
|
|
60
|
-
contents: read
|
|
61
|
-
actions: read
|
|
62
|
-
uses: CLDMV/.github/.github/workflows/reusable-scorecard.yml@v4
|
|
63
|
-
with:
|
|
64
|
-
publish_results: true # set false to skip the public badge in favor of SARIF-to-Security-tab. Private repos need not bother: every scorecard job auto-skips there (OpenSSF cannot publish private repos, so the run would only burn paid minutes).
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# @Project: @cldmv/gh-broker
|
|
3
|
-
# @Filename: /.github/workflows/stale.yml
|
|
4
|
-
# @Date: 2026-05-20T00:00:00-07:00 (1779260400)
|
|
5
|
-
# @Author: Nate Corcoran <CLDMV>
|
|
6
|
-
# @Email: <Shinrai@users.noreply.github.com>
|
|
7
|
-
# -----
|
|
8
|
-
# @Last modified by: Nate Corcoran <CLDMV> (Shinrai@users.noreply.github.com)
|
|
9
|
-
# @Last modified time: 2026-10-02T11:30:57-07:00 (1790965857)
|
|
10
|
-
# -----
|
|
11
|
-
# @Copyright: Copyright (c) 2013-2026 Catalyzed Motivation Inc. All rights reserved.
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
# Individual repo: .github/workflows/stale.yml
|
|
15
|
-
#
|
|
16
|
-
# First-run guidance: on a repo with an existing backlog, the first
|
|
17
|
-
# scheduled run can mark a LOT of issues stale at once (notification storm).
|
|
18
|
-
# Recommended: enable with `dry_run: true` first, dispatch manually to
|
|
19
|
-
# preview, then flip to live. The dispatch input below makes this easy.
|
|
20
|
-
#
|
|
21
|
-
# Batch 2.3 from tmp/plan-future-workflows.md.
|
|
22
|
-
name: 🍂 Stale Issues & PRs
|
|
23
|
-
|
|
24
|
-
on:
|
|
25
|
-
schedule:
|
|
26
|
-
- cron: "13 5 * * *" # daily 05:13 UTC (off-the-hour to avoid GH cron stampede)
|
|
27
|
-
workflow_dispatch:
|
|
28
|
-
inputs:
|
|
29
|
-
dry_run:
|
|
30
|
-
description: "Preview only — no changes will be made"
|
|
31
|
-
type: boolean
|
|
32
|
-
default: false
|
|
33
|
-
|
|
34
|
-
permissions:
|
|
35
|
-
issues: write
|
|
36
|
-
pull-requests: write
|
|
37
|
-
|
|
38
|
-
jobs:
|
|
39
|
-
sweep:
|
|
40
|
-
uses: CLDMV/.github/.github/workflows/reusable-stale.yml@v4
|
|
41
|
-
with:
|
|
42
|
-
dry_run: ${{ github.event.inputs.dry_run == 'true' }}
|
|
43
|
-
# Override timers if needed:
|
|
44
|
-
# days_before_issue_stale: 60
|
|
45
|
-
# days_before_issue_close: 14
|
|
46
|
-
# days_before_pr_stale: 30
|
|
47
|
-
# days_before_pr_close: 7
|
|
48
|
-
secrets:
|
|
49
|
-
BOT_APP_CLIENT_ID: ${{ secrets.CLDMV_BOT_APP_CLIENT_ID }}
|
|
50
|
-
BOT_APP_PRIVATE_KEY: ${{ secrets.CLDMV_BOT_APP_PRIVATE_KEY }}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# @Project: @cldmv/gh-broker
|
|
3
|
-
# @Filename: /.github/workflows/tag-health.yml
|
|
4
|
-
# @Date: 2026-05-20T00:00:00-07:00 (1779260400)
|
|
5
|
-
# @Author: Nate Corcoran <CLDMV>
|
|
6
|
-
# @Email: <Shinrai@users.noreply.github.com>
|
|
7
|
-
# -----
|
|
8
|
-
# @Last modified by: Nate Corcoran <CLDMV> (Shinrai@users.noreply.github.com)
|
|
9
|
-
# @Last modified time: 2026-10-02T11:30:57-07:00 (1790965857)
|
|
10
|
-
# -----
|
|
11
|
-
# @Copyright: Copyright (c) 2013-2026 Catalyzed Motivation Inc. All rights reserved.
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
# Individual repo: .github/workflows/tag-health.yml
|
|
15
|
-
#
|
|
16
|
-
# Wakes the reusable-tag-health.yml workflow on a weekly schedule. The
|
|
17
|
-
# reusable already implements validation, bot-signature fixes, unsigned-tag
|
|
18
|
-
# fixes, orphaned-release recovery, orphaned-tag relocation, and rolling
|
|
19
|
-
# major/minor tag maintenance — but it's dormant by default. This template
|
|
20
|
-
# is what triggers it.
|
|
21
|
-
#
|
|
22
|
-
# Batch 3.1 from tmp/plan-future-workflows.md.
|
|
23
|
-
name: 🏥 Tag Health
|
|
24
|
-
|
|
25
|
-
on:
|
|
26
|
-
schedule:
|
|
27
|
-
# Weekly Sunday 04:04 UTC. Off-the-hour to dodge the GitHub :00-cron
|
|
28
|
-
# stampede; weekly cadence because tag drift accumulates slowly.
|
|
29
|
-
- cron: "4 4 * * 0"
|
|
30
|
-
workflow_dispatch:
|
|
31
|
-
inputs:
|
|
32
|
-
debug:
|
|
33
|
-
description: "Enable debug logging for troubleshooting"
|
|
34
|
-
type: boolean
|
|
35
|
-
required: false
|
|
36
|
-
default: false
|
|
37
|
-
create_documentation:
|
|
38
|
-
description: "Update VERSION_TAGS.md if rolling tags moved"
|
|
39
|
-
type: boolean
|
|
40
|
-
required: false
|
|
41
|
-
default: false
|
|
42
|
-
use_gpg:
|
|
43
|
-
description: "Enable GPG signing for any tags the sweep creates/recreates"
|
|
44
|
-
type: boolean
|
|
45
|
-
required: false
|
|
46
|
-
default: true
|
|
47
|
-
|
|
48
|
-
permissions:
|
|
49
|
-
contents: read
|
|
50
|
-
|
|
51
|
-
jobs:
|
|
52
|
-
health:
|
|
53
|
-
permissions:
|
|
54
|
-
contents: write
|
|
55
|
-
uses: CLDMV/.github/.github/workflows/reusable-tag-health.yml@v4
|
|
56
|
-
with:
|
|
57
|
-
debug: ${{ github.event.inputs.debug == 'true' }}
|
|
58
|
-
# Full unified sweep: validates, fixes bot signatures, fixes
|
|
59
|
-
# unsigned tags, recovers orphaned releases, relocates orphaned
|
|
60
|
-
# tags, and updates rolling major/minor refs.
|
|
61
|
-
run_unified_tag_health: true
|
|
62
|
-
create_documentation: ${{ github.event.inputs.create_documentation == 'true' }}
|
|
63
|
-
use_gpg: ${{ github.event.inputs.use_gpg != 'false' }}
|
|
64
|
-
secrets:
|
|
65
|
-
BOT_APP_CLIENT_ID: ${{ secrets.CLDMV_BOT_APP_CLIENT_ID }}
|
|
66
|
-
BOT_APP_PRIVATE_KEY: ${{ secrets.CLDMV_BOT_APP_PRIVATE_KEY }}
|
|
67
|
-
TAGGER_NAME: ${{ secrets.CLDMV_BOT_NAME }}
|
|
68
|
-
TAGGER_EMAIL: ${{ secrets.CLDMV_BOT_EMAIL }}
|
|
69
|
-
GPG_PRIVATE_KEY: ${{ secrets.CLDMV_BOT_GPG_PRIVATE_KEY }}
|
|
70
|
-
GPG_PASSPHRASE: ${{ secrets.CLDMV_BOT_GPG_PASSPHRASE }}
|