Skip to content

Commit bbf2272

Browse files
committed
chore(release): add Wave 0 packaging workflow
Prepare post-freeze release infrastructure for rmenu Core Closed v1. - Add release checklist with artifact layout, smoke checks, checksums, and GitHub-only validation notes - Add install/update documentation for unsigned Windows zip releases - Document binary signing and SmartScreen tradeoffs - Add changelog baseline for v0.2.0/Core Closed v1 - Add safe shortcuts example module for release packaging - Add Windows GitHub Actions release workflow with zip artifacts and SHA256 checksums - Add interactive local release script for one-command maintainer publishing - Link release docs from README and update post-freeze roadmap/state - Include release docs, scripts, and module examples in package metadata Validation: - cargo fmt - cargo test - cargo check - cargo build --release - scripts/release-local.ps1 -Version 0.2.0 -PackageOnly
1 parent 3cf08ad commit bbf2272

19 files changed

Lines changed: 4097 additions & 172 deletions

File tree

.github/workflows/release.yml

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
name: Release
2+
3+
on:
4+
workflow_dispatch:
5+
push:
6+
tags:
7+
- "v*"
8+
9+
permissions:
10+
contents: write
11+
12+
jobs:
13+
windows-x64:
14+
name: Windows x64 release artifact
15+
runs-on: windows-latest
16+
17+
steps:
18+
- name: Checkout
19+
uses: actions/checkout@v4
20+
21+
- name: Setup Rust
22+
uses: dtolnay/rust-toolchain@stable
23+
24+
- name: Cache cargo
25+
uses: Swatinem/rust-cache@v2
26+
27+
- name: Check formatting
28+
run: cargo fmt --check
29+
30+
- name: Test
31+
run: cargo test
32+
33+
- name: Check
34+
run: cargo check
35+
36+
- name: Build release
37+
run: cargo build --release
38+
39+
- name: Compute package metadata
40+
id: meta
41+
shell: pwsh
42+
run: |
43+
$versionLine = Select-String -Path Cargo.toml -Pattern '^version\s*=\s*"([^"]+)"' | Select-Object -First 1
44+
if (-not $versionLine) { throw "Could not find package version in Cargo.toml" }
45+
$version = $versionLine.Matches[0].Groups[1].Value
46+
$packageName = "rmenu-v$version-windows-x64"
47+
"version=$version" >> $env:GITHUB_OUTPUT
48+
"package_name=$packageName" >> $env:GITHUB_OUTPUT
49+
50+
- name: Stage release package
51+
shell: pwsh
52+
run: |
53+
$packageName = "${{ steps.meta.outputs.package_name }}"
54+
$stage = Join-Path "dist" $packageName
55+
New-Item -ItemType Directory -Force $stage | Out-Null
56+
New-Item -ItemType Directory -Force (Join-Path $stage "module-examples") | Out-Null
57+
58+
Copy-Item "target\release\rmenu.exe" $stage
59+
Copy-Item "target\release\rmenu-module-host.exe" $stage
60+
Copy-Item "config_example.ini" $stage
61+
62+
$docs = @(
63+
"README.md",
64+
"INSTALL.md",
65+
"CHANGELOG.md",
66+
"CORE_FREEZE_V1.md",
67+
"MODULES_QUICKSTART.md",
68+
"MODULES_AUTHORING_GUIDE.md",
69+
"MODULES_OPERATIONS_GUIDE.md",
70+
"MODULES_API_SPEC_V1.md",
71+
"RMOD_SPEC_V1.md",
72+
"MANIFEST_SPEC_V1.md",
73+
"CTX_ACTIONS_SPEC_V1.md",
74+
"PROVIDER_EXECUTION_POLICY.md",
75+
"ERROR_ISOLATION_POLICY.md",
76+
"MODULES_CAPABILITIES_MATRIX.md"
77+
)
78+
79+
foreach ($doc in $docs) {
80+
if (Test-Path $doc) {
81+
Copy-Item $doc $stage
82+
}
83+
}
84+
85+
if (Test-Path "modules\calculator.rmod") {
86+
Copy-Item "modules\calculator.rmod" (Join-Path $stage "module-examples\calculator.rmod")
87+
}
88+
if (Test-Path "modules\local-scripts.rmod") {
89+
Copy-Item "modules\local-scripts.rmod" (Join-Path $stage "module-examples\local-scripts.rmod")
90+
}
91+
if (Test-Path "modules\examples\shortcuts.example.rmod") {
92+
Copy-Item "modules\examples\shortcuts.example.rmod" (Join-Path $stage "module-examples\shortcuts.example.rmod")
93+
}
94+
95+
# Do not copy modules/shortcuts.rmod as an active default module; it may contain local user paths.
96+
# Module examples are packaged under module-examples/ and must be copied into modules/ by the user.
97+
98+
- name: Generate package checksums
99+
shell: pwsh
100+
run: |
101+
$packageName = "${{ steps.meta.outputs.package_name }}"
102+
$stage = Join-Path "dist" $packageName
103+
$checksumPath = Join-Path $stage "checksums.txt"
104+
Get-ChildItem $stage -File -Recurse |
105+
Where-Object { $_.Name -ne "checksums.txt" } |
106+
Sort-Object FullName |
107+
ForEach-Object {
108+
$hash = Get-FileHash $_.FullName -Algorithm SHA256
109+
$relative = Resolve-Path -Relative $_.FullName
110+
"$($hash.Hash) $relative"
111+
} | Set-Content -Path $checksumPath -Encoding utf8
112+
113+
- name: Create zip artifact
114+
shell: pwsh
115+
run: |
116+
$packageName = "${{ steps.meta.outputs.package_name }}"
117+
$zipPath = Join-Path "dist" "$packageName.zip"
118+
if (Test-Path $zipPath) { Remove-Item $zipPath }
119+
Compress-Archive -Path (Join-Path "dist" $packageName) -DestinationPath $zipPath
120+
121+
- name: Generate release checksums
122+
shell: pwsh
123+
run: |
124+
$packageName = "${{ steps.meta.outputs.package_name }}"
125+
$zipPath = Join-Path "dist" "$packageName.zip"
126+
$hash = Get-FileHash $zipPath -Algorithm SHA256
127+
"$($hash.Hash) $packageName.zip" | Set-Content -Path (Join-Path "dist" "SHA256SUMS.txt") -Encoding utf8
128+
129+
- name: Upload artifact
130+
uses: actions/upload-artifact@v4
131+
with:
132+
name: ${{ steps.meta.outputs.package_name }}
133+
path: |
134+
dist/${{ steps.meta.outputs.package_name }}.zip
135+
dist/SHA256SUMS.txt
136+
if-no-files-found: error
137+
138+
- name: Create GitHub Release
139+
if: startsWith(github.ref, 'refs/tags/v')
140+
uses: softprops/action-gh-release@v2
141+
with:
142+
files: |
143+
dist/${{ steps.meta.outputs.package_name }}.zip
144+
dist/SHA256SUMS.txt
145+
generate_release_notes: true

ACTIVE_QUEUE.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
continuity_session: none
3+
created_at: 2026-04-25 08:58
4+
updated_at: 2026-04-25 10:40
5+
status: idle
6+
goal: none
7+
last_archived_session: CONT-2026-04-25-0858-wave0-packaging-release
8+
archive_path: docs/continuity/archive/CONT-2026-04-25-0858-wave0-packaging-release/
9+
---
10+
11+
# ACTIVE_QUEUE.md
12+
13+
No active continuity session.
14+
15+
Last archived session:
16+
17+
```text
18+
docs/continuity/archive/CONT-2026-04-25-0858-wave0-packaging-release/
19+
```
20+
21+
Archived result:
22+
23+
- Wave 0 packaging/release completed locally.
24+
- Queue summary: 8 done, 0 blocked, 0 pending.
25+
- Local validation passed: `cargo fmt`, `cargo test`, `cargo check`, `cargo build --release`.
26+
- Remaining external validation: run GitHub Actions workflow on GitHub after pushing workflow and/or creating a `v*` tag.
27+
28+
To start a new continuity session:
29+
30+
```text
31+
/init-cont <goal>
32+
```

0 commit comments

Comments
 (0)